如已指出,这更多是一个“服务工作者”问题,而不是“vue cli”的问题。
首先,为了确保我们在同一页面上,这是registerServiceWorker.js的样板内容应该是什么(vue cli 3,官方pwa插件):
import { register } from 'register-service-worker'
if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, {
ready () {
console.log(
'App is being served from cache by a service worker.\n'
)
},
cached () {
console.log('Content has been cached for offline use.')
},
updated () {
console.log('New content is available; please refresh.')
},
offline () {
console.log('No internet connection found. App is running in offline mode.')
},
error (error) {
console.error('Error during service worker registration:', error)
}
})
}
如果您没有在.env文件中更改BASE_URL变量,则它应该对应于您的vue应用程序的根目录。您需要在public文件夹中创建一个名为service-worker.js的文件(以便在构建时将其复制到输出目录中)。
现在,重要的是要明白registerServiceWorker.js文件中的所有代码都只是注册服务工作者并提供一些钩子进入其lifecycle。这些通常用于调试目的,而不是实际编程服务工作者。您可以通过注意到registerServiceWorker.js文件将被捆绑到app.js文件并在主线程中运行来理解它。
vue-cli 3官方PWA插件基于Google的workbox,因此要使用服务工作者,您首先需要在项目的根目录下创建一个名为vue.config.js的文件,并将以下代码复制到其中:
module.exports = {
pwa: {
workboxPluginMode: 'InjectManifest',
workboxOptions: {
swSrc: 'public/service-worker.js',
}
}
}
如果您已经创建了一个vue.config.js文件,那么您只需要将pwa属性添加到配置对象中。这些设置将允许您创建位于public/service-worker.js位置的自定义服务工作者,并使workbox注入一些代码:预缓存清单。这是一个.js文件,其中包含对编译后的静态资源的引用列表,通常命名为self.__precacheManifest。您必须以生产模式构建应用程序,以确保这一点。
由于在生产模式下构建时由workbox自动生成,预缓存清单对于缓存Vue应用程序壳非常重要,因为静态资产通常在编译时被拆分成块,每次(重新)构建应用程序时在服务工作者中引用这些块会很繁琐。
要预缓存静态资产,您可以将以下代码放置在service-worker.js文件的开头(也可以使用try/catch语句):
if (workbox) {
console.log(`Workbox is loaded`);
workbox.precaching.precacheAndRoute(self.__precacheManifest);
}
else {
console.log(`Workbox didn't load`);
}
您可以在同一个文件中继续正常编写服务工作者,可以使用基本服务工作者 API或Workbox 的 API。当然,不要犹豫将这两种方法结合起来。
希望对您有所帮助!
vue
相关的问题。 - Derek Pollard