vue.js - 如何在 localhost 中使用 cli-plugin-pwa 和 workbox
问题描述
我使用 cli-plugin-pwa 遵循了不同的教程,似乎即使在 localhost 中也应该启用服务工作者。但是,当我运行构建我的应用程序时,我不断收到错误消息('Service Worker 安装失败。它将在下一次导航期间自动重试')导致未安装 Service Worker。我查看了错误来自的文件,它位于工作箱 precache.mjs precacheController 中:
import {logger} from 'workbox-core/_private/logger.mjs';
import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.mjs';
import {precachePlugins} from './utils/precachePlugins.mjs';
import './_version.mjs';
const installListener = (event) => {
const precacheController = getOrCreatePrecacheController();
const plugins = precachePlugins.get();
event.waitUntil(
precacheController.install({event, plugins})
.catch((error) => {
console.log(process.env.NODE_ENV)
if (process.env.NODE_ENV !== 'production') {
logger.error(`Service worker installation failed. It will ` +
`be retried automatically during the next navigation.`);
}
// Re-throw the error to ensure installation fails.
throw error;
})
);
};
所以首先,我想知道是什么产生了这个错误,而且我很惊讶我在 prod env 中满足了 if 条件(我验证了它控制台记录 process.env.NODE_ENV)
关于我在这里缺少什么的任何建议?
我的软件设置:
registerServiceWorker.js
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'
)
},
registered () {
console.log('Service worker has been registered.')
},
cached () {
console.log('Content has been cached for offline use.')
},
updatefound () {
console.log('New content is downloading.')
},
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)
}
})
}
服务工作者.js
workbox.core.setCacheNameDetails({ prefix: 'xxx' })
self.__precacheManifest = [].concat(self.__precacheManifest || [])
workbox.precaching.precacheAndRoute(self.__precacheManifest, {})
vue.config.js
module.exports = {
pwa: {
workboxPluginMode: "InjectManifest",
workboxOptions: {
swSrc: "src/service-worker.js",
}
}
}
解决方案
推荐阅读
- java - 为什么我们需要在 ViewHolder 构造函数中调用 super(view)?
- laravel - 在不以 JSON 格式保存数据的情况下以可重复方式加载数据的问题 Laravel-Backpack
- amazon-web-services - ETL Glue 增量或增量逻辑
- flutter - 在 StreamBuilder 内构建期间调用的 setState() 或 markNeedsBuild()
- python - 使用带有漂亮汤和 if 语句的 for 循环来填充数据框
- mobile - 在 Mendix Native Mobile App 中触发滚动以自动向下滚动到底部
- r - R中的缺失数据和潜在轮廓分析
- azure-devops - 如何在 Azure DevOps 中跟踪特定用户的代码提交?
- css - 如何使用css模糊身体的背景颜色?
- javascript - 画布复制多个形状