如何包含 sw-precache 未命中的文件
how do I include files that sw-precache misses
上下文
我正在使用包裹 sw-precache 的 parcel-plugin-sw-precache 使其与 Parcel.js 一起工作。一切都按预期工作,我一直在测试我的离线应用程序。
问题
我将 react-pdf.js 添加到我的项目中,当它由 sw-precache 生成时,该库的依赖项之一没有添加到服务工作者中。我知道这是因为当我切换到离线模式时文件 "pdf.worker.entry.7ce4fb6a.js" 给出了 304 错误。
我试过的
我正在尝试使用以下代码将文件手动添加到 package.json parcel-plugin-sw-precache 配置中:
"sw-precache": {
"maximumFileSizeToCacheInBytes": 10485760,
"staticFileGlobs": [
"/pdf.worker.entry.7ce4fb6a.js"
]
},
我不确定文件路径是相对于 package.json 还是相对于生成的服务工作者。无论如何,手动指定的文件不会像我期望的那样被添加到生成服务工作者。如下所示。
self.__precacheManifest = [{
"url": "index.html",
"revision": "ac5ace7a43a0fef7ae65fd3119987d1f"
}, {
"url": "castly.e31bb0bc.css",
"revision": "657409f7159cb857b9409c44a15e653f"
}, {
"url": "castly.e31bb0bc.js",
"revision": "018d4664d809ec19d167421b359823ad"
}, {
"url": "/",
"revision": "af5513bb330deae3098ab289d69a40c7"
}]
问题
如果 sw-precache 或 parcel-plugin-sw-precache 似乎缺少一些文件,我如何确保将它们添加到生成的服务工作者中?
在我的探索中寻找答案。我放弃了使用 parcel-plugin-sw-precache,转而使用 workbox。如果您有兴趣使用 Parcel.js 创建离线应用程序。然后我推荐 Workbox,因为它是下一代 sw-precache。
我是这样工作的:
学习
了解什么是 Workbox 以及它的用途code lab.
实现
1) Install the Workbox CLI globally.
2) 在根目录中创建一个占位服务工作者。例如sw_shell.js
- shell 是一个保留文件。 Workbox 向导将拾取它并生成一个
自动新建 sw.js 文件。
3) 添加到sw_config.js下面的代码:
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
if (workbox) {
workbox.skipWaiting();
workbox.clientsClaim();
workbox.precaching.suppressWarnings();
// The next line came from the code lab
workbox.precaching.precacheAndRoute([]);
workbox.routing.registerNavigationRoute("/index.html");
} else {
console.log(`Boo! Workbox didn't load `);
}
4) 运行 此代码来自在项目根目录中打开的命令行。
workbox wizard --injectManifest
5) 按照向导中的步骤进行操作。出于开发目的,将 "root web app" 指向您的 parcel dist 文件夹。 Workbox 很神奇,它会将这些文件提取到一个新的 sw.js 文件中。
6) 向导将询问您现有的 sw.js 文件。在我的例子中,我使用 sw_shell.js。
a:Workbox 选择 sw_shell.js。
c:Generates 作为新的 sw.js 文件位于 运行 启动向导时指定的位置,并离线将文件注入 运行。
在我的例子中,我让新的 sw.js 在我的根文件夹中生成,因为 Parcel 会根据我的 index.js.
中的脚本自动获取它
'use strict';
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.log('Worker registration started')
reg.onupdatefound = function() {
console.log('update found')
var installingWorker = reg.installing;
installingWorker.onstatechange = function() {
console.log('installing worker')
switch (installingWorker.state) {
case 'installed':
if (navigator.serviceWorker.controller) {
console.log('New or updated content is available.');
} else {
console.log('Content is now available offline!');
}
break;
case 'redundant':
console.error('The installing service worker became redundant.');
break;
}
};
};
}).catch(function(e) {
console.error('Error during service worker registration:', e);
});
});
}
7) 将 workbox injectManifest
添加到您的 package.json 以确保 Workbox 获取对您的文件所做的任何更改:
"scripts": {
"start": "parcel index.html workbox injectManifest"
}
如果您想了解更多信息,请告诉我。有一个 video here 对我也有一点帮助。
上下文
我正在使用包裹 sw-precache 的 parcel-plugin-sw-precache 使其与 Parcel.js 一起工作。一切都按预期工作,我一直在测试我的离线应用程序。
问题
我将 react-pdf.js 添加到我的项目中,当它由 sw-precache 生成时,该库的依赖项之一没有添加到服务工作者中。我知道这是因为当我切换到离线模式时文件 "pdf.worker.entry.7ce4fb6a.js" 给出了 304 错误。
我试过的
我正在尝试使用以下代码将文件手动添加到 package.json parcel-plugin-sw-precache 配置中:
"sw-precache": {
"maximumFileSizeToCacheInBytes": 10485760,
"staticFileGlobs": [
"/pdf.worker.entry.7ce4fb6a.js"
]
},
我不确定文件路径是相对于 package.json 还是相对于生成的服务工作者。无论如何,手动指定的文件不会像我期望的那样被添加到生成服务工作者。如下所示。
self.__precacheManifest = [{
"url": "index.html",
"revision": "ac5ace7a43a0fef7ae65fd3119987d1f"
}, {
"url": "castly.e31bb0bc.css",
"revision": "657409f7159cb857b9409c44a15e653f"
}, {
"url": "castly.e31bb0bc.js",
"revision": "018d4664d809ec19d167421b359823ad"
}, {
"url": "/",
"revision": "af5513bb330deae3098ab289d69a40c7"
}]
问题
如果 sw-precache 或 parcel-plugin-sw-precache 似乎缺少一些文件,我如何确保将它们添加到生成的服务工作者中?
在我的探索中寻找答案。我放弃了使用 parcel-plugin-sw-precache,转而使用 workbox。如果您有兴趣使用 Parcel.js 创建离线应用程序。然后我推荐 Workbox,因为它是下一代 sw-precache。
我是这样工作的:
学习
了解什么是 Workbox 以及它的用途code lab.
实现
1) Install the Workbox CLI globally.
2) 在根目录中创建一个占位服务工作者。例如sw_shell.js
- shell 是一个保留文件。 Workbox 向导将拾取它并生成一个
自动新建 sw.js 文件。
3) 添加到sw_config.js下面的代码:
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
if (workbox) {
workbox.skipWaiting();
workbox.clientsClaim();
workbox.precaching.suppressWarnings();
// The next line came from the code lab
workbox.precaching.precacheAndRoute([]);
workbox.routing.registerNavigationRoute("/index.html");
} else {
console.log(`Boo! Workbox didn't load `);
}
4) 运行 此代码来自在项目根目录中打开的命令行。
workbox wizard --injectManifest
5) 按照向导中的步骤进行操作。出于开发目的,将 "root web app" 指向您的 parcel dist 文件夹。 Workbox 很神奇,它会将这些文件提取到一个新的 sw.js 文件中。
6) 向导将询问您现有的 sw.js 文件。在我的例子中,我使用 sw_shell.js。
a:Workbox 选择 sw_shell.js。
c:Generates 作为新的 sw.js 文件位于 运行 启动向导时指定的位置,并离线将文件注入 运行。
在我的例子中,我让新的 sw.js 在我的根文件夹中生成,因为 Parcel 会根据我的 index.js.
中的脚本自动获取它'use strict';
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.log('Worker registration started')
reg.onupdatefound = function() {
console.log('update found')
var installingWorker = reg.installing;
installingWorker.onstatechange = function() {
console.log('installing worker')
switch (installingWorker.state) {
case 'installed':
if (navigator.serviceWorker.controller) {
console.log('New or updated content is available.');
} else {
console.log('Content is now available offline!');
}
break;
case 'redundant':
console.error('The installing service worker became redundant.');
break;
}
};
};
}).catch(function(e) {
console.error('Error during service worker registration:', e);
});
});
}
7) 将 workbox injectManifest
添加到您的 package.json 以确保 Workbox 获取对您的文件所做的任何更改:
"scripts": {
"start": "parcel index.html workbox injectManifest"
}
如果您想了解更多信息,请告诉我。有一个 video here 对我也有一点帮助。