进阶篇——webpack进阶用法(三)

  上一章节主要介绍了webpack的进阶篇中的一些高阶功能的使用和配置,这些还能在代码中进行一些配置、构建。现在来主要介绍一些webpack4特性原理分析,可能会比较枯燥,但是很实用。

1.Tree Shaking的使用和与案例分析

QQ截图20200822173328.png

注:当mode设置production的时候TreeShaking是默认开启的

(1)什么是DCE

我们了解tree shaking的之前,就要先了解一个概念DCE

QQ截图20200822175116.png

意思就是说没有用到的代码,就会被“杀死”;什么是DCE代码呢?如上图左边写的要求:
代码不被执行,不可到达:不会执行的代码,如if(false) {}这条if就回永远不被执行;
代码执行的结果不会被用到:这句话的含义是指定义了一个函数,并且return一个结果,但是在调用这个函数时,这个结果永远不会用到;
代码只会影响死变量(只写不读):这句话的含义是当我们定义了一个变量,并且给这个变量设置了数据,但是永远没有用到这个变量。
只要符合上述的三个要求,就是DCE代码,在构建的过程中就会把这些代码删除掉,不会打包到bundle中。

(2)tree shaking原理
QQ截图20200822193309.png
(3)tree shaking 实战演练
① 自定义一个js文件
QQ截图20200822202315.png
② 在js文件里应用a方法
QQ截图20200822202726.png
③ 配置webpack.prod.js
  1. 未开启tree shaking的情况
    设置modenone,因为tree shaking在mode为production的情况下是默认开启的,npm run build构建项目,情况如下
    QQ截图20200822203558.png

    可以看到我们只是在js文件中只引用了a方法,但是没有进行任何的调用,构建的时候把这两个方法都打包了进来,显然会增加项目的体积
  2. 开启tree shaking的情况
    设置modeproduction
    QQ截图20200822204035.png

    可以发现这两个方法都没有引用进来
  3. 使用a方法,并且开启tree shaking


    QQ截图20200822204321.png

    构建项目


    QQ截图20200822204510.png

    可见a方法是调用到了,再来搜索一下b方法
    QQ截图20200822204629.png

    b方法并没有加载进来,从而达到了tree shaking的目的。

  4. 其他


    QQ截图20200822204911.png

    上述情况,虽然引用了a方法,看看构建的时候是否将a方法引用了进来


    QQ截图20200822205041.png

    可以看到a方法并没有打包进来。

2.Scope Hoisting使用和原理分析

我们先来看下webpack在没有使用该特性的情况下,webpack构件时的包效果如下

QQ截图20200823152157.png

可以发下产生了很多的闭包函数,这样会产生什么样的后果呢?如下
QQ截图20200823152443.png

这就有个问题,为什么webpack打包会产生这么多的闭包呢?是因为模块转换
QQ截图20200823152709.png

QQ截图20200823152925.png

(1)scope hoisting原理
QQ截图20200823153629.png
(2)scope hoisting使用
QQ截图20200823153809.png
(3)实战演练
① 未开启scope hoisting的情况
QQ截图20200823155932.png

构建项目


QQ截图20200823160501.png
① 开启scope hoisting的情况
QQ截图20200823160907.png

构建项目


QQ截图20200823161202.png

3.代码分割和动态import

前面学过基础库分离,讲述过SplitChunksPlugin插件,将页面进行分离,但这只是基础分离,现在来看一下高阶的代码分割和动态import

QQ截图20200823205013.png

(1)js懒加载的方式
QQ截图20200823211434.png

有两种懒加载的方式,如上图所述

  1. CommonJS: require.ensure;
  2. 动态import(推荐);
    目前动态import能够兼容好webpack。这节主要讲述import
(2)如何使用动态import
QQ截图20200823211843.png

分割后的效果如下


QQ截图20200823211957.png
(2)动态import实战演练

第一步安装babel插件
npm install @babel/plugin-syntax-dynamic-import --save-dev
第二步
配置.babelrc文件

QQ截图20200823212916.png

第三步创建一个text.js文件,如下
QQ截图20200823213034.png

第四步在index.js下做如下配置
QQ截图20200823213644.png

最后一步:npm run build

4.webpack中使用eslint

使用eslint能够规范代码,便于团队合作,能够避免一些不必要的错误。

QQ截图20200829173634.png

QQ截图20200829173841.png

QQ截图20200829174106.png

QQ截图20200829174158.png

QQ截图20200829174330.png

QQ截图20200829174420.png

5.webpack 打包库和组件

面试题

QQ截图20200829175513.png

压缩版:适用于开发阶段;
非压缩版:适用于发布上线;
QQ截图20200829185906.png

QQ截图20200829190010.png

除了上面的引用方式还支持
QQ截图20200829190130.png

QQ截图20200829190208.png

(1)实战演练
① 创建项目
mkdir large-number
cd large-number
npm init
② 搭建webpack环境

npm install webpack webpack-cli -D

③ 重构项目目录
360截图18720120496570.png

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文件
360截图1872012274119115.png
⑥ 打包构建

npm run build

360截图17981130393752.png

然后打开项目目录中的dist文件夹
360截图181412139211391.png

我们打开这两个文件,发现都被压缩了,不符合我们的需求(开发版是非压缩版,非开发版是压缩版),那么怎么办呢?如下
360截图17610611143017.png

如上图,将mode设置成none,关闭默认压缩,然后添加一个optimization,将minimize设置成true,然后通过配置minimizer设置正则匹配,只对mini.js进行压缩即可。
注:我们使用了TerserPlugin这个压缩插件,他可以针对ES6的语法进行压缩,如果使用有些插件,就不会针对es6进行压缩,可能会报错,所以推荐使用TerserPlugin,因此我们要先安装一下这个插件
npm install terser-webpack-plugin -D
安装好之后,在webpack.config.js头部导入进来
360截图16700618425050.png

最后重新打包,发现只有mini.js文件进行了压缩
360截图17891230399281.png

总结

这借主要介绍了一写webpack的原理,下节是进阶的完结篇来源

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342