上一章节主要介绍了webpack的进阶篇中的一些高阶功能的使用和配置,这些还能在代码中进行一些配置、构建。现在来主要介绍一些webpack4特性原理分析,可能会比较枯燥,但是很实用。
1.Tree Shaking的使用和与案例分析
注:当mode设置production的时候TreeShaking是默认开启的
(1)什么是DCE
我们了解tree shaking的之前,就要先了解一个概念DCE。
意思就是说没有用到的代码,就会被“杀死”;什么是DCE代码呢?如上图左边写的要求:
代码不被执行,不可到达:不会执行的代码,如if(false) {}这条if就回永远不被执行;
代码执行的结果不会被用到:这句话的含义是指定义了一个函数,并且return一个结果,但是在调用这个函数时,这个结果永远不会用到;
代码只会影响死变量(只写不读):这句话的含义是当我们定义了一个变量,并且给这个变量设置了数据,但是永远没有用到这个变量。
只要符合上述的三个要求,就是DCE代码,在构建的过程中就会把这些代码删除掉,不会打包到bundle中。
(2)tree shaking原理
(3)tree shaking 实战演练
① 自定义一个js文件
② 在js文件里应用a方法
③ 配置webpack.prod.js
- 未开启tree shaking的情况
设置mode为none,因为tree shaking在mode为production的情况下是默认开启的,npm run build构建项目,情况如下
可以看到我们只是在js文件中只引用了a方法,但是没有进行任何的调用,构建的时候把这两个方法都打包了进来,显然会增加项目的体积 - 开启tree shaking的情况
设置mode为production
可以发现这两个方法都没有引用进来 -
使用a方法,并且开启tree shaking
构建项目
可见a方法是调用到了,再来搜索一下b方法
b方法并没有加载进来,从而达到了tree shaking的目的。
-
其他
上述情况,虽然引用了a方法,看看构建的时候是否将a方法引用了进来
可以看到a方法并没有打包进来。
2.Scope Hoisting使用和原理分析
我们先来看下webpack在没有使用该特性的情况下,webpack构件时的包效果如下
可以发下产生了很多的闭包函数,这样会产生什么样的后果呢?如下
这就有个问题,为什么webpack打包会产生这么多的闭包呢?是因为模块转换
(1)scope hoisting原理
(2)scope hoisting使用
(3)实战演练
① 未开启scope hoisting的情况
构建项目
① 开启scope hoisting的情况
构建项目
3.代码分割和动态import
前面学过基础库分离,讲述过SplitChunksPlugin插件,将页面进行分离,但这只是基础分离,现在来看一下高阶的代码分割和动态import
(1)js懒加载的方式
有两种懒加载的方式,如上图所述
- CommonJS: require.ensure;
- 动态import(推荐);
目前动态import能够兼容好webpack。这节主要讲述import
(2)如何使用动态import
分割后的效果如下
(2)动态import实战演练
第一步安装babel插件
npm install @babel/plugin-syntax-dynamic-import --save-dev
第二步
配置.babelrc文件
第三步创建一个text.js文件,如下
第四步在index.js下做如下配置
最后一步:npm run build
4.webpack中使用eslint
使用eslint能够规范代码,便于团队合作,能够避免一些不必要的错误。
5.webpack 打包库和组件
面试题
压缩版:适用于开发阶段;
非压缩版:适用于发布上线;
除了上面的引用方式还支持
(1)实战演练
① 创建项目
mkdir large-number
cd large-number
npm init
② 搭建webpack环境
npm install webpack webpack-cli -D
③ 重构项目目录
src/index.js代码如下
export default function add(a, b) {
let i = a.length - 1;
let j = b.length - 1;
let carry = 0;
let ret = '';
while(i >= 0 || j >= 0) {
let x = 0;
let y = 0;
let sum;
if(i >= 0) {
x = a[i] - '0'; // 转成数字
i--;
}
if(j >= 0) {
y = b[j] - '0'; // 转成数字
j--;
}
sum = x + y + carry;
if(sum >= 10) {
carry = 1;
sum -= 10;
} else {
carry = 0;
}
ret = sum + ret;
}
if(carry) {
ret = carry + ret;
}
return ret;
}
// add('999', '1');
④ 编写webpack配置文件
module.exports = {
entry: {
'large-number': './src/index.js',
'large-number.min': './src/index.js'
},
output: {
filename: '[name].js',
library: 'largeNumber',
libraryTarget: 'umd',
libraryExport: 'default'
}
}
// libraryExport:最好设置成default,不然引用的时候,就要在方法后面加上default,显得过于冗余
⑤ 配置package.json文件
⑥ 打包构建
npm run build
然后打开项目目录中的dist文件夹
我们打开这两个文件,发现都被压缩了,不符合我们的需求(开发版是非压缩版,非开发版是压缩版),那么怎么办呢?如下
如上图,将mode设置成none,关闭默认压缩,然后添加一个optimization,将minimize设置成true,然后通过配置minimizer设置正则匹配,只对mini.js进行压缩即可。
注:我们使用了TerserPlugin这个压缩插件,他可以针对ES6的语法进行压缩,如果使用有些插件,就不会针对es6进行压缩,可能会报错,所以推荐使用TerserPlugin,因此我们要先安装一下这个插件
npm install terser-webpack-plugin -D
安装好之后,在webpack.config.js头部导入进来
最后重新打包,发现只有mini.js文件进行了压缩
总结
这借主要介绍了一写webpack的原理,下节是进阶的完结篇来源