webpack 使用 scope hoisting


作者:Seiya

时间:2019年07月16日


构建的现状


构建后的代码存在⼤量闭包代码,如下图所示:


这样导致了两个问题:

  • 大量函数闭包包裹代码,导致体积增大(模块越多越明显);

  • 运行代码时创建的函数作用域变多,内存开销变大;



模块转换分析


拿上图进行分析,从 webpack 打包完成输出的文件中可以看出,模块被包裹转化为初始化的函数,然后 import 会被转换成 __webpack_require。这样能够在绝大部分浏览器中运行。


整个 webpack 的模块机制如下图所示:



scope hoisting 原理


将所有模块的代码按照引用顺序放在一个函数作用域⾥,然后适当的重命名一些变量以防止变量名冲突。

举例来讲:如果在模块 A 中引用了模块 B,scope-hoisting 可以根据模块的引入顺序进行排放,也就是将模块 B 放在模块 A 前面,这样就减少了包裹的代码,如下图所示:

我们可以看到,scope-hoisting 可以减少函数声明代码和内存开销。



使用 scope-hoisting


webpack mode 配置为 production 时默认开启 scope-hoisting 功能,我们也可手动引入,具体配置如下:

module.exports = {
	...
	plugins: [ new webpack.optimize.ModuleConcatenationPlugin() ]
}

注意:

必须是 ES6 语法,CommonJS 规范不支持,因为动态引入没办法进行静态分析。

最后更新时间: 2019-7-17 08:41:56