在执行create-react-app并启用index.js
中的服务工作者之后,src
文件夹中的所有相关文件都将被缓存。但是,我的一些资源位于public
目录中。当我运行npm run build
时,asset-manifest.json
和precache-manifest.HASH.js
仅包含HTML,损坏的JS和CSS(所有src
文件夹中的内容)。
如何告诉服务人员另外从public
文件夹缓存特定文件?
这是实际生成的precache-manifest.e431838417905ad548a58141f8dc754b.js
self.__precacheManifest = [
{
"revision": "cb0ea38f65ed9eddcc91",
"url": "/grafiti/static/js/runtime~main.cb0ea38f.js"
},
{
"revision": "2c226d1577937984bf58",
"url": "/grafiti/static/js/main.2c226d15.chunk.js"
},
{
"revision": "c88c70e5f4ff8bea6fac",
"url": "/grafiti/static/js/2.c88c70e5.chunk.js"
},
{
"revision": "2c226d1577937984bf58",
"url": "/grafiti/static/css/main.7a6fc926.chunk.css"
},
{
"revision": "980026e33c706b23b041891757cd51be",
"url": "/grafiti/index.html"
}
];
但是我希望它也包含这些URL的条目:
/grafiti/icon-192.png
/grafiti/icon-512.png
它们来自public
文件夹。
或者:如何以一种可以从Web清单中引用它们的方式在manifest.webmanifest
文件夹中为src
文件添加图标?
答案 0 :(得分:1)
我假设您搜索的解决方案(如我)不会弹出。这种方法对我有用:
yarn add -D react-app-rewired
安装module react-app-rewired
将react-scripts
替换为package.json中的npm脚本(不需要弹出)
/* package.json */
"scripts": {
- "start": "react-scripts start",
+ "start": "react-app-rewired start",
- "build": "react-scripts build",
+ "build": "react-app-rewired build",
- "test": "react-scripts test --env=jsdom",
+ "test": "react-app-rewired test --env=jsdom",
"eject": "react-scripts eject"
在与package.json相同的级别上创建config-overrides.js文件
我的文件看起来像这样(因为我还想为自己的api添加一个具有更复杂的缓存选项的服务工作者),但是 globPatterns 和 globDirectory 是您的文件寻找。添加此模式后,将匹配的文件(在我的情况下为图像,音乐和声音)添加到生成的precache-manifest- {hash}中。
const {InjectManifest} = require('workbox-webpack-plugin');
const path = require('path');
module.exports = {
webpack: function(config, env) {
config.plugins.push(
new InjectManifest({
globPatterns: [
'images/*.png',
'models/*.glb',
'music/*.mp3',
'sound/*.mp3'
],
globDirectory: 'build',
swSrc: path.join('src', 'custom-service-worker.js'),
swDest: 'service-worker.js'
})
);
return config;
}
}
PS:如果您需要custom-service.worker.js文件才能使其正常工作,则workbox.precaching.precacheAndRoute([])
就足以作为该文件的内容,但是the workbox docs对于那些缓存内容也非常有趣