FckSignups 的 PWA 化改造思路:让工具导航可以离线安装(附完整步骤)
【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignups
FckSignups(现名 NoSignups)是一个精选的开源工具导航项目:收录 200+ 个无需注册、开箱即用的浏览器工具,基于 React + TypeScript 与 Vite 构建。如果把它改造成一个PWA(渐进式 Web 应用),用户就能像安装 App 一样把它装到桌面或手机主屏,并且在没有网络时依然可以离线浏览全部工具清单。这篇文章将用新手也能看懂的方式,拆解 FckSignups 的 PWA 化改造思路:从现状分析、Manifest 配置到 Service Worker 缓存策略,一步步说清楚"为什么它特别适合改造"以及"怎么改"。
先看清现状:为什么 FckSignups 天生适合做 PWA
PWA 化的前提是项目结构够"干净"。我们来看 FckSignups 的三个特点,它几乎是为 PWA 而生的。
特点一:纯前端 SPA,资源可预测
项目由 index.html 作为入口,通过 src/main.tsx 挂载 React 应用,构建配置见 vite.config.mts。字体也是自托管的(public/fonts/下的 Inter 与 Space-Grotesk),不依赖外部 CDN。资源路径固定,意味着 Service Worker 可以放心地把整个"应用外壳"提前缓存下来。
特点二:数据就一个 JSON 文件
全站内容只有一个数据源——tools.json。加载逻辑在 src/hooks/useTools.ts 中,请求链路非常清晰,对缓存策略极其友好。
特点三:已有的三层降级机制,就是"准离线"能力
useTools.ts中的加载顺序是:
- 开发环境请求本地 JSON;
- 生产环境请求线上的
tools.json; - 全部失败时,回退到内置在代码里的 src/constants/fallbackData.ts。
也就是说,即便请求失败,页面也能用兜底数据渲染出完整界面。做 PWA 时,Service Worker 本质上就是把"第 2 层"用缓存补上——思路是现成的,只需要照猫画虎。
PWA 两大核心件:Manifest 与 Service Worker
要让浏览器认为一个网站"可安装",缺一不可的两样东西:
| 组件 | 作用 | 改造位置 |
|---|---|---|
| Web App Manifest | 告诉系统"这是一个应用":名称、图标、主题色 | index.html 头部 |
| Service Worker | 拦截请求、管理缓存,实现离线可用 | 新增一个独立文件 |
下面按步骤说明。
第一步:添加 Web App Manifest
在 public/ 目录下新建manifest.json,内容很简单,核心就这几项:
{ "name": "NoSignups - 免注册开源工具导航", "short_name": "NoSignups", "start_url": "/", "display": "standalone", "theme_color": "#ffffff", "icons": [ { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" } ] }然后把这一行加进 index.html 的<head>中:
<link rel="manifest" href="/manifest.json" />💡 项目现有的 public/favicon.ico 只有 256x256,可以直接裁剪/放大生成 192 与 512 两种尺寸的 PNG 图标,满足安装要求。
display: "standalone"决定应用安装后是否全屏运行(不显示浏览器地址栏);theme_color则控制安装后的主题色。这两项是新手最常漏配的地方。
第二步:注册 Service Worker
在 public/ 下新增sw.js,并在全局作用域注册它(推荐放在 src/main.tsx 末尾,而不是某个组件里,否则只在组件挂载后才生效):
if ("serviceWorker" in navigator) { navigator.serviceWorker.register("/sw.js"); }Service Worker 本身可以先空着,注册成功这一步已经能让 Lighthouse 的"PWA 可安装"项通过。
缓存策略:tools.json 该怎么缓存
这是整个改造中最关键的一步。FckSignups 的数据只有两类,分别对应两种经典策略:
| 资源 | 特征 | 推荐策略 |
|---|---|---|
| JS / CSS / 字体 / 图标 | 带构建哈希,不可变 | 预缓存(Precache):构建时生成清单,离线直接命中 |
tools.json | 内容会持续更新(新工具加入) | Stale-While-Revalidate:先给缓存,同时悄悄请求新数据 |
Stale-While-Revalidate 的伪逻辑用一句话就能说清:"网络可用时,先秒开缓存里的旧数据,再后台拉新的换进去;网络断开时,缓存兜底,用户完全无感。"这正好接住了 src/constants/fallbackData.ts 的设计思路——三级防线变成:SW 缓存 → 网络请求 → 内置兜底数据。
⚠️ 注意:tools.json不要直接做成"永不更新"的缓存,否则新工具就永远展示不出来了。工具导航站的核心价值就是"持续收录",缓存策略要始终给新鲜数据留一条快速通道。
离线体验的三个细节打磨
改完缓存,再处理三个小细节,离线体验才算完整:
- 离线提示:src/components/Home/Tools/Tools.tsx 渲染时会接收
loadStatus与errorMessage(来自 src/hooks/useTools.ts),离线命中缓存时显示"数据可能不是最新"的轻量提示即可,不必弹错误。 - 外链不受影响:
<base target="_blank" />(见 index.html)让点击工具都新开标签页,导航站本身离线可用后,工具链接天然依赖网络——这符合"导航可用、工具在线"的预期,无需额外处理。 - 提交功能明确降级:工具提交/举报走的是独立的 cloudflare-worker/worker.ts(Cloudflare Worker 负责创建 GitHub Issue),离线时该表单应提示"需联网提交",避免用户误以为提交成功。
验证改造:两步确认"真的能装了"
- DevTools → Application 面板:确认 Manifest 解析无误、Service Worker 处于"activated"状态;勾选"Offline"刷新页面,工具列表应照常渲染。
- Lighthouse 审计:跑一遍 PWA 类别,重点看两项——"用户可以在应用上安装"(Installable)与"在 3G 网络下可重新加载主资源"(Offline)。
两项全绿,就意味着 FckSignups 已经可以在桌面和移动端主屏"安家"了。
总结
FckSignups 的 PWA 化改造路径非常清晰,工作量也小:
- ✅现状友好:单 JSON 数据源 + 自托管字体 + 已有三级数据降级,天生适合离线改造
- ✅Manifest:一个 10 行左右的 JSON,让浏览器承认它是"应用"
- ✅Service Worker:预缓存应用外壳 + 对 tools.json 用 Stale-While-Revalidate
- ✅细节打磨:离线提示、外链策略、表单降级
最终效果:用户一键把免注册工具导航装进手机主屏,地铁里没信号也能翻找工具——这正是 PWA 对工具站点的意义。
【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignups
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考