【问题标题】:how to use service-worker in dev mode如何在开发模式下使用 service-worker
【发布时间】:2021-12-25 01:37:15
【问题描述】:

我正在使用create-react-app 4cra-template-pwa (source)

默认情况下,service-worker 似乎只用于生产构建:

export function register(config) {
    if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {

https://github.com/cra-template/pwa/blob/25cb9f06938c671507684a8438c347d3c8bc8b24/packages/cra-template-pwa/template/src/serviceWorkerRegistration.js#L22

这对我来说是个问题,因为构建生产构建需要很长时间,因此我想在开发构建时注册服务工作者。 为了得到这个结果,我删除了检查 process.env.NODE_ENV === 'production' 和另一个 isLocalhost 检查。

现在,正如我所希望的那样,即使是调试版本也在尝试加载 www.example.com/service-worker.js


现在的问题是,这个文件在src 里面。这是有道理的,因为它使用导入,如您所见here。但正因为如此,文件本身无法从网络浏览器访问,因此www.example.com/service-worker.js 肯定无法访问。

将文件复制到公共也不起作用

未捕获的语法错误:无法在模块外使用 import 语句

恐怕我还没有真正理解哪一部分属于JS,哪一部分属于NodeJS,哪一部分属于reactjs,哪一部分属于CRA。

所以我现在的问题是:

有没有办法获取“已翻译”service-worker.js 的“路径”(导入后,..)?

【问题讨论】:

    标签: javascript reactjs node-modules create-react-app service-worker


    【解决方案1】:

    首先将craco添加到react项目craco

    然后使用以下文件创建自定义 craco 插件

    serviceWorkerRegistration.js

    change this line ===>  if ("process.env.NODE_ENV === 'production' && serviceWorker" in navigator)
    
    to ===>  if ("serviceWorker" in navigator)
    
    
    
    

    craco.config.js

    const cracoServiceWorkerConfig = require("./cracoServiceWorkerConfig");
    
    module.exports = {
        plugins: [{ plugin: cracoServiceWorkerConfig }],
    };
    
    

    cracoServiceWorkerConfig.js

    const WorkboxWebpackPlugin = require("workbox-webpack-plugin");
    const path = require("path");
    
    module.exports = {
        overrideWebpackConfig: ({ webpackConfig, cracoConfig, pluginOptions, context: { env, paths } }) => {
            const isEnvDevelopment = env === "development";
            if (isEnvDevelopment) {
                const newConfig = {
                    ...webpackConfig,
                    plugins: [
                        ...webpackConfig.plugins,
                        isEnvDevelopment &&
                            new WorkboxWebpackPlugin.InjectManifest({
                                swSrc: path.resolve(__dirname, "src/service-worker.js"),
                                dontCacheBustURLsMatching: /\.[0-9a-f]{8}\./,
                                exclude: [/\.map$/, /asset-manifest\.json$/, /LICENSE/],
                                maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
                            }),
                    ],
                };
                return newConfig;
            } else {
                return webpackConfig;
            }
            // Always return the config object.
        },
    };
    
    
    

    【讨论】:

      【解决方案2】:

      你根本做不到。 CRA-service worker 是 Javascript 浏览器功能的抽象,即 service-worker。它可以轻松编写此服务工作者,但它只会在构建时编译。 您总是可以在 JS 中编写自己的 service worker 并在 dev 中对其进行测试。但你不想。

      【讨论】:

      • 如果我有任何新信息,我会阅读一些内容并回复您。我不想提供任何错误信息。
      • 通常在开发过程中您不希望 PWA 有麻烦,但在开发时您当然希望在本地对其进行测试。我通过运行yarn build 并在运行yarn start 之前将/build/service-worker.js 复制到/public 文件夹来解决它。我需要 setupProxy,所以我不能只为构建服务,而是真的需要运行 yarn start。您可以使用 package.json 中的脚本自动执行此过程,但您会错过热重载。我还使用隐身窗口进行测试,因此我每次都可以重新开始,而不必手动取消注册服务人员。
      • @bas 有一个实际适用于热重载的解决方案,但它非常棘手,我花了几天时间才完成。基本上,您必须创建一个单独的 webpack.config.json 来为您构建 serviceWorker 并将其放入 build 文件夹中,这很有帮助,尤其是在构建过程花费太长时间并且您正在使用 serviceWorker 时。然后你会有一个脚本,我个人使用 Gulp.js 来监视 serviceWorker 源代码的变化,并在每次修改时运行 webpack 脚本。为了用yarn start 命令嵌入它,我在 Gulp 中嵌入了它命令
      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 2018-08-13
      • 2017-07-06
      • 2018-10-06
      • 2017-08-22
      • 2022-08-18
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多