【发布时间】:2018-06-08 12:32:39
【问题描述】:
我正在使用 Workbox 3.0 (webpack-plugin) 和 Laravel Mix (5.6) 来自动生成 ServiceWorker 文件。
在运行 webpack 编译器时,Workbox 为预缓存资产生成的清单文件如下所示:
self.__precacheManifest = [
{
"revision": "89c25ce71806a695a25e",
"url": "//js/app.js"
},
{
"revision": "89c25ce71806a695a25e",
"url": "//css/app.css"
}
];
很明显,URL 字符串是错误的,导致实际网页出错。
这是我的webpack.mix.js:(相关部分)
const {InjectManifest} = require('workbox-webpack-plugin')
mix.webpackConfig({
plugins: [
new InjectManifest({
swSrc: './resources/assets/js/sw.js'
})
]
})
虽然这里使用 InjectManifest 进行预缓存以及我自己的动态缓存,但在使用 GenerateSW 插件时也会发生同样的情况。
和我的来源sw.js:
workbox.precaching.precacheAndRoute(self.__precacheManifest || [])
知道如何解决这个问题吗?如果我手动修改 precacheManifest,它可以正常工作:
self.__precacheManifest = [
{
"revision": "89c25ce71806a695a25e",
"url": "./js/app.js"
},
{
"revision": "89c25ce71806a695a25e",
"url": "./css/app.css"
}
];
重现此问题的步骤:
- 创建一个新的 Laravel 项目:
Laravel new <proj_name> cd <proj_name>npm installnpm install --save-dev workbox-webpack-plugin- 将这些行添加到 webpack.mix.js 以将其配置为 Workbox:
const { GenerateSW } = require('workbox-webpack-plugin');
mix.webpackConfig({ plugins: [new GenerateSW()] });
- 运行
php artisan make:auth和php artisan migrate完成前端脚手架 - 编辑 \resources\assets\js 文件夹中的 bootstrap.js 以包含注册新 ServiceWorker 的常用代码
- 运行
npm run dev
编译后的 precache-manifest 文件如下所示:
self.__precacheManifest = [
{
"revision": "b922e094256b9404e705",
"url": "//js/app.js"
},
{
"revision": "b922e094256b9404e705",
"url": "//css/app.css"
}
];
【问题讨论】:
-
我尝试添加例如importsDirectory: './public' 到 webpackConfig 对象,但无济于事。
-
你的 webpack 配置中的
output.publicPath值是多少? -
我实际上并没有直接修改 webpack.config.js 文件——这一切都由 Laravel Mix 处理。但是查看 node_modules 目录(node_modules/laravel-mix/setup)中的 webpack.config.js 文件,这里也没有定义 publicPath。
-
生成这些 URL 的代码是 github.com/GoogleChrome/workbox/blob/v3.0.0/packages/… 它有效地连接了
publicPath和 webpack 为资产创建的隐式 URL。您能否提供一个指向您的完整项目的链接,我们可以克隆并尝试在本地复制? -
我已经添加了步骤,使用带有 Workbox 的标准 Laravel 安装从头开始重现问题
标签: webpack laravel-mix workbox workbox-webpack-plugin