我在 ES 模块中定义了一个函数,我想确保它是内联的。当它只在一个块中使用时,这很好用,但是如果我从两个单独的块中调用该函数,webpack 会生成阻止内联的模块查找模式:
// common.js
export function inlineMe(x) {
return x;
}
// main.js
import {inlineMe} from './common';
import('./ext').then(ext => {
if (inlineMe(true)) {
ext.f();
} else {
console.log('not inlined');
}
});
// ext.js
import {inlineMe} from './common';
export function f() {
console.log(inlineMe(true) ? 'inlined' : 'not inlined');
}
使用 TerserPlugin 通过 webpack 运行它,并使用以下合理的标准选项
// webpack.config.js
module.exports = {
mode: 'production',
entry: './main.js',
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {passes: 50, inline: true, unsafe: true},
},
}),
],
},
};
产生没有内联的结果。另一方面,如果我不将代码拆分成块(即,将import()
表达式更改为普通的顶级导入),或者如果我不从两个块中使用 inlineMe
,则内联可以正常工作。我希望它与 webpack 重写块的方式有关(它最终似乎是由 间接定义的某种Object(r.a)(!0)
地方,因此 terser 对此无能为力也就不足为奇了)。r.a
function r(e){return e}n.d(t,"a",(function(){return r}))
是否有一些咒语可以使这种内联跨多个块工作?也许某种方式告诉 webpack 这个函数/模块应该比其他的更可用?