在临时插件的输出中使用来自 webpack DefinePlugin 的值

时间:2021-06-16 14:52:07

标签: javascript node.js json webpack

每当 webpack 的编译运行时,我想生成一个 BUILD_TIME 值(来自 new Date()),并将这个值合并到我的客户端 JavaScript 包中的一个常量中,同时还输出到一个单独的 JSON 文件,该文件将由服务器。

我正在使用 webpack.DefinePlugin 将此值合并到我的客户端包中,并且我想使用一个临时插件来生成 JSON 文件,但我不知道如何引入 DefinePlugin从插件上下文开始时将 value 写入 JSON 文件。

const path = require('path');
const { DefinePlugin } = require('webpack');

module.exports = {
  mode: "none",
  plugins: [
    new DefinePlugin({
      BUILD_TIME: DefinePlugin.runtimeValue(() => {
        return JSON.stringify(new Date());
      }, {
        contextDependencies: [ path.resolve(__dirname, 'src') ]
      })
    }),
    {
      apply: function (compiler) {
        const { webpack: { sources: { RawSource }}} = compiler;
        compiler.hooks.make.tap('BuildTimePlugin', (compilation) => {
          compilation.emitAsset(
            'buildTime.json',
            new RawSource(`{ buildTime: BUILD_TIME }`)
          );
        });
      }
    }
  ],
  output: {
    filename: "[name].[contenthash].js",
    path: path.resolve(__dirname, 'dist'),
  }
};

我正在使用 DefinePlugin.runtimeValue,因为似乎任何其他生成 BUILD_TIME 值的方式(如在我的 webpack.config.js 中定义的变量)只会在每次 webpack 运行时生成一次,而不是每次 webpack 编译时生成一次.临时插件 emitAsset RawSource 目前没有被 DefinePlugin 替代。

最初,我只输出 JSON 文件,仅使用 new RawSource(JSON.stringify({ buildTime: new Date() })) 就可以正常工作,但这显然无法将完全相同的值编译到我的客户端包中。

我认为这可能更可能与包含在整体编译中的模板 JSON 文件有关,但我想了解如何通过直接从 adhoc 插件生成 JSON 文件来完成这项工作。是否可以从 adhoc 插件中输出资产源以便它接受 DefinePlugin 的替换,或者直接从 adhoc 插件中访问 DefinePlugin 的值?

0 个答案:

没有答案