尽管这个问题已有一年多的历史,但我想借此机会,因为我已经能够在 react-snap 中实现服务工作者(尽管取得了不同程度的成功)。
这是 GitHub 中立体声助推器的参考:
https ://github.com/stereobooster/react-snap/blob/master/doc/recipes.md#configure-sw-precache-without-ejecting
您可以在不弹出的情况下对其进行配置。您需要做的是:下载并sw-precache
安装ugfify-js
:
npm install sw-precache uglify-js --save-dev
or
yarn add sw-precache uglify-js -D
然后,在您的 package.json 中添加以下条目:(将构建脚本替换为以下内容)
"scripts": {
"generate-sw": "sw-precache --root=build --config scripts/sw-precache-config.js && uglifyjs build/service-worker.js -o build/service-worker.js",
"build": "react-scripts build && react-snap && yarn run generate-sw"
}
然后,在根级别(package.json 旁边)创建一个名为scripts
并添加sw-precache-config.js
文件的文件夹。
module.exports = {
// a directory should be the same as "reactSnap.destination",
// which default value is `build`
staticFileGlobs: [
"build/static/css/*.css",
"build/static/js/*.js",
"build/shell.html",
"build/index.html"
],
stripPrefix: "build",
publicPath: ".",
// there is "reactSnap.include": ["/shell.html"] in package.json
navigateFallback: "/shell.html",
// Ignores URLs starting from /__ (useful for Firebase):
// https://github.com/facebookincubator/create-react-app/issues/2237#issuecomment-302693219
navigateFallbackWhitelist: [/^(?!\/__).*/],
// By default, a cache-busting query parameter is appended to requests
// used to populate the caches, to ensure the responses are fresh.
// If a URL is already hashed by Webpack, then there is no concern
// about it being stale, and the cache-busting can be skipped.
dontCacheBustUrlsMatching: /\.\w{8}\./,
// configuration specific to this experiment
runtimeCaching: [
{
urlPattern: /api/,
handler: "fastest"
}
]
};
请注意,如果您没有使用 app-shell 但正在加载整个页面(意味着没有动态内容),请将其替换navigateFallback: "/shell.html"
为navigateFallback: "/200.html"
这基本上允许您缓存整个页面
您可以在此处查找更多信息:
https ://github.com/stereobooster/an-almost-static-stack
我建议检查的一件事(我也即将开始该过程)是workbox-sw。
如果 React-Snap 失败怎么办
/ TypeError 处的错误:无法读取 null 的属性“ok”
或者
错误:无法终止 PID 38776 的进程(PID 26920 的子进程)。\node_modules\minimalcss\src\run.js:13:35) 原因:没有正在运行的任务实例。
您可能会遇到这些臭名昭著的错误。我不知道究竟是什么导致了它们,但我知道它们在这里和这里都有提及。在这种情况下,请删除该build
文件夹,打开一个新的终端窗口,然后重试。
如果问题仍然存在,则分解脚本:
做:
"scripts": {
"build": "react-scripts build"
"postbuild": "react-snap",
"generate-sw": "sw-precache --root=build --config scripts/sw-precache-config.js && uglifyjs build/service-worker.js -o build/service-worker.js",
}
并尝试独立运行它们。