Webpack:将变量注入静态服务-worker.js

Webpack: Injecting variables into static service-worker.js

我正在编写 PWA 应用程序。我使用的是我正在使用的模板(Vue.js PWA 模板)中的默认 Service Worker,但现在我决定从头开始编写自己的模板。我已将它 (service-worker.js) 放入 static 文件夹中,因为我想为其设置静态名称 - 我不想每次都更改名称(构建)。

在这个特定的 Service Worker 中,我想使用包 nameversion,这样我就可以很好地生成缓存 ID。

所以我想实现这样的目标:

./package.json:

{ "name": "my.app", "version": "1.0.0", ... }

./static/service-worker.js: var CACHE_ID = 'PACKAGE_NAME-vPACKAGE_VERSION'; ...

./build/service-worker.js: var CACHE_ID = 'my.app-v1.0.0';

./build/service-worker.js 显示了我想要实现的目标。

我已尝试 https://www.npmjs.com/package/string-replace-loader 使用以下配置:

  {
    test: /service-worker\.js$/,
    loader: 'string-replace-loader',
    options: {
      multiple: [
        {
          search: 'PACKAGE_NAME',
          replace: packageConfig.name
        },
        {
          search: 'PACKAGE_VERSION',
          replace: packageConfig.version
        }
      ]
    }
  }

但据我了解,放置在 static 中的文件不是模块(我说得对吗?),因此 module.rules 不会检查这些文件。

我将不胜感激 and/or 指导我如何解决这个问题。

模块

模块放置在node_modulessrc 是您的源文件夹,您应该只在其中保留您不会在 production 模式下使用的文件。

还要记住,模块只不过是像库一样的 JavaScript 代码;功能集。如果您将 *.js 文件从 node_modules 移动到 src — 这仍然会按模块进行。

我真的不明白你为什么要使用 string-replace-loader 因为它与你的问题无关。

Loader allows to perform replacements in a way String.prototype.replace() does (loader uses it internally). It means that if you want to replace all occurrences, you should use RegExp-like string in options.search with g flag in options.flags, etc.

String.prototype.replace()MDN

The replace() method returns a new string with some or all matches of a pattern replaced by a replacement. The pattern can be a string or a RegExp, and the replacement can be a string or a function to be called for each match.

还是我误会你了?

Worker-loader

但是如果我没听错的话——实际上有一个工人装载机。

$ npm install worker-loader --save-dev

好的,我终于明白了。我已经使用了 copy-webkit-plugin 及其转换的可能性:

  plugins: [
    new CopyWebpackPlugin([
      {
        from: 'static/service-worker.js',
        to: './service-worker.js',
        transform (content) {
          var parsed = content.toString();
          var transformation = [
            {
              search: 'PACKAGE_NAME',
              replace: packageConfig.name
            },
            {
              search: 'PACKAGE_VERSION',
              replace: packageConfig.version
            }
          ];

          for(var i = 0; i < transformation.length; i++) {
            parsed = parsed.replace(transformation[i].search, transformation[i].replace);
          }

          return Buffer.from(parsed, 'utf8');
        }
      }
    ])
  ]