Workbox's precache manifest file contains invalid URL strings in Laravel Mix setting
我正在使用Workbox 3.0(webpack插件)和Laravel Mix(5.6)来自动生成ServiceWorker文件。
运行webpack编译器时,Workbox为预缓存资产生成的清单文件如下所示:
1 2 3 4 5 6 7 8 9 10 | self.__precacheManifest = [ { "revision":"89c25ce71806a695a25e", "url":"//js/app.js" }, { "revision":"89c25ce71806a695a25e", "url":"//css/app.css" } ]; |
显然,URL字符串错误并在实际的网页上导致错误。
这是我的webpack.mix.js :(相关部分)
1 2 3 4 5 6 7 8 | const {InjectManifest} = require('workbox-webpack-plugin') mix.webpackConfig({ plugins: [ new InjectManifest({ swSrc: './resources/assets/js/sw.js' }) ] }) |
尽管此处使用InjectManifest进行预缓存以及我自己的动态缓存,但使用GenerateSW插件时也会发生同样的情况。
和我的源sw.js:
1 | workbox.precaching.precacheAndRoute(self.__precacheManifest || []) |
任何想法如何解决这个问题?如果我手动修改precacheManifest,它可以正常工作:
1 2 3 4 5 6 7 8 9 10 | self.__precacheManifest = [ { "revision":"89c25ce71806a695a25e", "url":"./js/app.js" }, { "revision":"89c25ce71806a695a25e", "url":"./css/app.css" } ]; |
重现此步骤:
const { GenerateSW } = require('workbox-webpack-plugin');
mix.webpackConfig({ plugins: [new GenerateSW()] });
编译后的precache-manifest文件如下所示:
1 2 3 4 5 6 7 8 9 10 | self.__precacheManifest = [ { "revision":"b922e094256b9404e705", "url":"//js/app.js" }, { "revision":"b922e094256b9404e705", "url":"//css/app.css" } ]; |
我找到了解决方案:
由于Laravel使用" Laravel Mix" API来配置和运行WebPack,因此配置WebPack的方法是修改文件
杰夫·波斯尼克(Jeff Posnick)为我指明了正确的方向。 如果将以下行添加到
1 2 3 4 5 6 7 | const { GenerateSW } = require('workbox-webpack-plugin'); mix.webpackConfig({ plugins: [new GenerateSW()], output: { publicPath: '' } }); |
解决方案是仅为webpack的output.publicPath配置选项提供一个空字符串。
但是,如果您需要为publicPath选项提供实际路径,则该解决方法将失败。 在此处查看错误报告:https://github.com/GoogleChrome/workbox/issues/1534