25.Webpack和Rollup打包优化之Tree shaking

灵感来源于:Tree Shaking性能优化实践 原理我这边就不多做介绍了,主要看上面引用的文章,写这篇文章的主要目的是

为了方便我们这些小白想根据上面的文章实践一把,但是遇到种种的报错问题&&解决方案&&一些基础知识的查漏补缺

  • rollup打包命令

    • rollup --input main.js --output bundle.js --format cjs 或者 rollup -i main.js -o bundle.js -f cjs

      • --input xxx.js 入口文件

      • --output bundle.js 出口文件

      • --format cjs 使用cjs方式进行打包

        • format的几种模式

          • amd:异步模块,用于 requireJs

          • cjs:commonjs,适用于 node 和 browserify/webpack

          • es:将软件包保存为 ES 模块文件

          • iife:一个自动执行的功能,适合作为 script 标签

          • umd:通用模块定义

  • 不识别rollup命令

    • 全局安装rollup: npm install rollup -g

  • webpack打包命令

  • npx webpack ./code.js -o bunble1.js --mode development/production

    • --mode :development/production指定打包模式为开发或者生产,区别在于生产上打包体积会进行压缩

    • 或者使用/node_modules/.bin/webpack ./code.js -o bunble1.js --mode development/production

    • 使用node_modules下面的webpack命令进行操作,.bin目录下面是一些脚本命令

  • Q:为什么要使用npx webpack不直接使用webpack进行打包

    • npx webpack在没有全局安装webpack的时候,可以执行当前项目内的 webpack 的打包命令。例如:npx webpack -v 就可以获取当前项目内的 webpack 版本,全局安装可直接使用 webpack。
  • Q:打包文件里面包含harmony import类似的代码是什么意思?

    • import 会被打包成 harmony import

    • export 会被打包成 harmony export

  • babel

    • Q:babel-loader是干什么用的?

      • 用来处理 Js 文件的一个 loader
    • @babel/preset-env

      • 用来做语法转换 es6->es5

      • webpack中如果使用polyfill,在webpack.config.js中没有指定corejs版本,打包时会提示找不到相应模块的问题

    • Q: babel-core是干啥用的?

      • 调用babel-core中的API来进行直接转换
    • Q:babel/preset-env是干啥用的?

      • preset根据当前配置的浏览器环境自动加载相应的polyfill,而不是全部进行加载,从而减少打包体积

      • "useBuiltIns":三个参数 usage, entry,false

        • usage:根据配置的浏览器兼容引入所有的polyfill,根据配置的浏览器兼容性以及用到的API来按需添加。只需安装babel-polyfill即可,打包时会自动引入代码中使用到的垫片模块

        • entry:根据配置的浏览器兼容,引入浏览器不兼容的 polyfill。需要在入口文件手动添加 import '@babel/polyfill',会自动根据 browserslist 替换成浏览器不兼容的所有 polyfill。这里需要指定 core-js 的版本, 如果 "corejs": 3, 则 import '@babel/polyfill' 需要改成

        • false:不对polyfill做操作,如果引入@babel/polyfill,则无视配置的浏览器兼容,引入所有的polyfill


代码演示:

let foo = () => {
 let x = 1;
 if (false) {
 console.log("never reached");
 }
 let a = 3;
 return a;
};
let baz = () => {
 var x = 1;
 console.log(x);
 post();
 function unused() {
 return 5;
 }
 return x;
 let c = x + 3;
 return c;
};
baz();

const promise = [new Promise(() => {}), new Promise(() => {})];
promise.map((promise) => {
 console.log(promise);
});

测试对比两个打包工具对Dead Code的打包结果

打包对比结果:中间是源代码,左边是rollup打包结果,右边是webpack打包结果对比。

image-20211222214353073.png

结论:

  • rollup打包的结果会把Dead Code一些无用的代码以及一些不可达的代码清除掉

  • webpack打包的结果这些代码依然存在,且可读性查,打包体积也大

测试 对比两个打包工具对引用无用function的打包结果

code.js中使用util.js中的post方法。

rollup没有做其他的配置,webpack配置usedExports:true

image-20211222221741407.png

结论:

  • rollup在没有引用uglify的情况下可以直接过滤没有引用到的代码

  • webpack如图右侧所示,webpack会对没有应用到的export进行标记,打包结果出乎意料,和前面大佬讲的打包结果不相符,,看了很多的资料,我觉得这篇文章讲的是比较能够解决我的一部分疑惑的,传送门

usedExports:true:编译时分析出哪些export用到了,哪些没有用到,然后进行标记。

总结:出现上面结果的主要是因为所谓的副作用的影响。在es5->es6的过程中使用了babel,由于babel的编译,一些没有副作用的代码也会被标记成有副作用的。webpack没有完整的流程分析,不能更好的判断代码是否产生了副作用。

至此结束,后面还有一篇百度前端团队大佬们分享的另一篇文章写的是对组件库,CSS,提取公共代码等的优化,戳我


END结束语:相对于webpack的打包,对比了一下rollup之后,对其提不起什么兴趣了,给我的直观感受

  • 打包后的文件可读性不够好

  • 相关插件支持的webpack版本不够清晰。例如:我生生用uglify试了两天,才知道ugilfy是和webpack2.x版本配合使用的,webpack4之后使用了以下几个属性已经实现了这些插件的部分功能。

  • image-20211223215450607.png
  • 打包后的文件,虽然对其进行了标记,但是清除无用代码不够彻底,打包体积相当于只能在无副作用和压缩代码之间进行优化。额,咱就是说那些方法之类的不能被清除也就算了,就是注释和无用的变量以及console咱就不能清除吗? (PS:也可能是知识盲区,不知道。)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352