您的位置:首页 > 运维架构

性能优化——webpack3 新增的Scope Hoisting

2018-02-17 00:55 1326 查看
Scope Hoisting 可以让 Webpack 打包出来的代码文件更小、运行的更快, 它又译作 “作用域提升”,是在 Webpack3 中新推出的功能。

对比:

util.js

export default 'Hello,Webpack'


main.js

import str from './util.js';
console.log(str);


打包后:

[
(function (module, __webpack_exports__, __webpack_require__) {
var __WEBPACK_IMPORTED_MODULE_0__util_js__ = __webpack_require__(1);
console.log(__WEBPACK_IMPORTED_MODULE_0__util_js__["a"]);
}),
(function (module, __webpack_exports__, __webpack_require__) {
__webpack_exports__["a"] = ('Hello,Webpack');
})
]


开启Scope Hoisting 后:

[
(function (module, __webpack_exports__, __webpack_require__) {
var util = ('Hello,Webpack');
console.log(util);
})
]


好处:

• 代码体积更小,因为函数申明语句会产生大量代码;

• 代码在运行时因为创建的函数作用域更少了,内存开销也随之变小

原理:

ES6的静态模块分析,分析出模块之间的依赖关系,尽可能地把模块放到同一个函数中。

配置:

const Webpack = require('webpack')
const path = require('path')

module.exports = {
entry: './index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new Webpack.optimize.ModuleConcatenationPlugin()
]
}


同时,考虑到 Scope Hoisting 依赖源码需采用 ES6 模块化语法,还需要配置 mainFields。因为大部分 Npm 中的第三方库采用了 CommonJS 语法,但部分库会同时提供 ES6 模块化的代码,为了充分发挥 Scope Hoisting 的作用,需要增加以下配置

module.exports = {
resolve: {
// 针对 Npm 中的第三方模块优先采用 jsnext:main 中指向的 ES6 模块化语法的文件
mainFields: ['jsnext:main', 'browser', 'main']
},
};


对于采用了非 ES6 模块化语法的代码,Webpack 会降级处理不使用 Scope Hoisting 优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: