每当 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 的值?