Webpack第六天

94 阅读2分钟

摇树优化

注意点

- 一个模块中可能有多个方法,其中的某个方法被用到时,在打包时会将整个模块都打包进去
- tree shaking 就可以在uglify阶段,把没用到的方法擦除,只将用到的方法打包到bundle
- 只支持ES6语法,CJS不支持
- mode为production默认开启
 

DCE(Dead Code Elimination)

- 代码不会被执行
- 代码执行的结果不会被用到
- 代码只会影响死变量(只写不读)

原理

- import export只能作为模块顶层的语句出现
- import的模块名只能是字符串常量
- import binding 是 immutable 的

Scope hoisting

注意点

- 默认情况下,打包后的模块会被闭包函数包裹,模块越多,闭包函数越多,产生的作用域越多,内存消耗越大
- 被webpack转换后的模块,会被闭包函数包裹,同时给闭包函数传入三个参数
- module , __webpack_exports__ , __webpack_require__
- 其中import会被转换为 __webpack_require__
- 转换后的闭包函数被称为模块初始化函数

分析

- 打包出来的是IIFE
- modules是一个数组,每一项是一个模块初始化函数
- __webpack_require用来加载模块,返回module.exports
- 通过webpack_require_method(0) 来启动程序

原理

- 将所有模块的代码按照引用顺序放在一个函数作用域里,然后适当的重命名一些变量防止变量名冲突
- mode设置production默认开启
- 只支持ES6语法
- 只有被引用一次的模块才会被内联到闭包函数内,超过一次的会被单独打包到一个闭包函数中

代码分割

实现

- CommonJS 通过require.ensure来导入
- ES6 通过babel插件(@babel/plugin-syntax-dynamic-import)实现动态导入

使用

- 将babel插件配置到.babelrc文件的plugins中
- 在需要动态导入的位置通过import('path').then()来实现

EsLint

规范

- 基于eslint:recommend配置来定制
- 对于能够发现代码错误的规则全部开启

实现

- 本地集成:npm i husky,在script中增加 precommit:lint-staged来检查增量代码,具体配置看文档
- CI/CD集成:本地继承时,可以在提交git时通过 --no-verify来跳过husky 在CI之前增加Lint pipeline
- Webpack集成:使用eslint-loader,在配置文件中进行具体规则的配置,或者继承已有的规则