Service Worker 缓存策略怎么让 React 页面首次加载更快?
我在用 Create React App 搭的项目里加了 Service Worker,想优化首屏加载速度。但发现用户第一次访问时还是得等所有 JS 加载完才能看到内容,缓存好像没起作用。我试过在 sw.js 里用 cache-first 策略,但不确定是不是注册时机或缓存逻辑写错了。
这是我在 index.js 里注册 SW 的代码:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered:', reg))
.catch(err => console.log('SW failed:', err));
});
}
是不是应该在 build 之后生成 precache 列表?或者我的缓存策略根本没覆盖到入口 HTML 文件?
首先你要确认的是,你是否已经使用了 workbox 来生成 precache 列表。Create React App 默认集成了 workbox,可以很方便地生成你需要的 precache 列表。你可以在
src/index.js或者src/service-worker.js中找到相关的配置。接下来,我们来看一下你的
sw.js文件,确保它正确地处理了缓存策略。首先你要确保你的 Service Worker 能够正确地缓存你的 HTML 文件。默认情况下,workbox 会帮你处理静态资源的缓存,但是你可能需要手动添加对 HTML 文件的缓存策略。以下是一个示例:这段代码首先引入了一些必要的 workbox 工具,然后通过
precacheAndRoute自动处理 precache 列表中的文件。接着,我们分别对 HTML 文件和静态资源(CSS 和 JavaScript 文件)设置了不同的缓存策略。对于 HTML 文件,我们使用了CacheFirst策略,这样可以确保即使服务器返回了新的 HTML 文件,我们也先从缓存中读取,从而加快首次加载速度。对于静态资源,我们使用了StaleWhileRevalidate策略,这样可以在返回缓存的同时异步更新缓存,保证资源的最新性。最后,确保你的
index.js文件中注册 Service Worker 的代码是正确的。你的代码看起来没问题,但为了保险起见,可以稍微简化一下:这里只是将
sw.js改为了service-worker.js,如果你的文件名不同,请相应修改。确保你的 Service Worker 文件路径正确无误。希望这些调整能帮助你优化 React 页面的首次加载速度。如果还有其他问题,尽管问我,有时候可能需要更多的调试信息来定位问题。