Webpack 开启 Scope Hoisting 后模块变量被压缩导致报错?
我在项目里启用了 Webpack 的 Scope Hoisting(ModuleConcatenationPlugin),但发现某些模块里的变量名被重命名后,和其他模块冲突了,控制台报“xxx is not defined”。明明没开启时一切正常,这是为啥?
比如下面这个 utils.js 模块,里面导出了一个叫 data 的变量:
const data = { name: 'test' };
export function getData() {
return data;
}
另一个文件 import 了 getData,但打包后 data 被重命名为 a 或别的短名,结果在某些条件下访问不到,是不是我配置有问题?
先说解决方案:
1. 最简单的是在 webpack.config.js 里给 ModuleConcatenationPlugin 加个
optimization.concatenateModules: false,但这样性能上就亏了2. 更推荐的方法是把 utils.js 改成这样:
原理是 Scope Hoisting 会把模块代码提升到同一个作用域,如果多个模块都有
data变量就会被覆盖。用 IIFE 包裹后相当于创建了独立作用域,webpack 就不会乱改名了。性能上这个方案几乎没损耗,比关掉整个 Scope Hoisting 强多了。另外检查下你的 webpack 版本,低于 4.x 的话可能会有更多奇怪问题。