【发布时间】:2016-03-22 16:22:29
【问题描述】:
我们的应用程序有多个入口点(比如 A 和 B)。我们需要的是获取入口点 A 的生成名称并在模块 B 中使用。入口点 A 的名称必须包含哈希。是否可以仅通过 webpack 配置和一些加载器/插件来做到这一点?
【问题讨论】:
标签: webpack
我们的应用程序有多个入口点(比如 A 和 B)。我们需要的是获取入口点 A 的生成名称并在模块 B 中使用。入口点 A 的名称必须包含哈希。是否可以仅通过 webpack 配置和一些加载器/插件来做到这一点?
【问题讨论】:
标签: webpack
我的解决方案是编写自己的插件,在after-emit 阶段修改文件,此时可以从统计信息中获取文件名:
const replace = require("replace-in-file");
const path = require('path');
function PlaceholderToAssetReplacerPlugin(options) {
this.options = options;
}
PlaceholderToAssetReplacerPlugin.prototype.apply = function (compiler) {
const self = this;
compiler.plugin('after-emit', function (compilation, callback) {
const stats = compilation.getStats().toJson({
hash: false,
publicPath: true,
assets: true,
chunks: false,
modules: false,
source: false,
errorDetails: false,
timings: false
});
const assetsByChunkName = stats.assetsByChunkName;
replace({
files: path.join(__dirname, self.options.path, assetsByChunkName[self.options.sourceChunkName]),
replace: new RegExp(self.options.variable),
with: `"${assetsByChunkName[self.options.destinationChunkName]}"`
}, (err, changedFiles) => {
if (err) {
throw err;
}
callback();
});
});
};
module.exports = PlaceholderToAssetReplacerPlugin;
然后像这样使用它:
new PlaceholderToAssetReplacerPlugin({
path: '../dist/static',
sourceChunkName: 'embedApiLoader',
destinationChunkName: 'embedApi',
variable: '__EMBED_API_ASSET__'
})
【讨论】: