tree shaking对打包体积优化及作用


Posted in Java/Android onJuly 07, 2022

背景

大家平时在查 webpack构建体积优化 ,可能都会查到 tree-shaking 这个东西,很多人看到这个东西,就会把它背下来,用来应付以后面试官可能会问到的情况。

但是,又有多少人去真的了解一下 tree-shaking 呢?自己去实践一下看 tree-shaking 到底起了哪些作用?对于我们的打包体积的优化又有多少呢?

有啥用?

Tree Shaking中文含义是摇树,在webpack中指的是打包时把无用的代码摇掉,以优化打包结果。

webpack5已经自带了这个功能了,当打包环境为production时,默认开启tree-shaking功能。

实践

前置准备

准备两个文件main.js、util.js

util.js

function a () {
  console.log('a')
}
function b () {
  console.log('b')
}
export default {
  a, b
}

main.js

import a from './util'
// 使用a变量,调用文件里面的a函数,不使用b函数
console.log(a.a())
console.log('hello world')
// 不可能执行的代码
if (false) {
  console.log('haha')
}
// 定义了但是没用的变量
const m = 1

打包

前面说了webpack5在环境production下打包的话,默认开启tree-shaking,那我们运行npm run build进行一下打包,看看打包后的代码长啥样:

(()=>{"use strict";
const o=function(){console.log("a")};
console.log(o())
console.log("hello world")}
)();

结论:可以看到打包后,把b函数、不可能执行的代码、定义未用的变量通通都剔除了,这在一个项目中,能减少很多的代码量,进而减少打包后的文件体积。

sideEffects

副作用

先来讲讲一个东西——副作用,是什么东西呢?副作用指的是:除了导出成员之外所做的事情,我举个例子,下面的a.js是没副作用的,b.js是有副作用的:

a.js

function console () {
  console.log('console')
}
export default {
  console
}

b.js

function console () {
  console.log('console')
}
// 这个就是副作用,会影响全局的数组
Array.prototype.func = () => {}
export default {
  console
}

有无副作用的判断,可以决定tree-shaking的优化程度,举个例子:

  • 我现在引入a.js但是我不用他的console函数,那么在优化阶段我完全可以不打包a.js这个文件。
  • 我现在引入b.js但是我不用他的console函数,但是我不可以不打包b.js这个文件,因为他有副作用,不能不打包。

sideEffects的使用

sideEffects可以在package.json中设置:

// 所有文件都有副作用,全都不可 tree-shaking
{
 "sideEffects": true
}
// 没有文件有副作用,全都可以 tree-shaking
{
 "sideEffects": false
}
// 只有这些文件有副作用,
// 所有其他文件都可以 tree-shaking,
// 但会保留这些文件
{
 "sideEffects": [
  "./src/file1.js",
  "./src/file2.js"
 ]
}

优化体积

当我把sideEffects设置成true之后,整个打包体积增加了100k,说明默认的false还是有用的。。

以上就是tree shaking对打包体积优化及作用的详细内容,更多关于tree shaking打包体积优化的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
新手入门Jvm-- JVM对象创建与内存分配机制
Jun 18 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
简述Java中throw-throws异常抛出
Aug 07 Java/Android
Java获取e.printStackTrace()打印的信息方式
Aug 07 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
springcloud整合seata
May 20 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 #Java/Android
一文了解Java动态代理的原理及实现
Jul 07 #Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
java中如何截取字符串最后一位
Jul 07 #Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 #Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 #Java/Android
You might like
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
jQuery实现长文字部分显示代码
2013/05/13 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
基于python 取余问题(%)详解
2020/06/03 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
幼儿师范毕业生自荐信
2013/11/09 职场文书
门卫班长岗位职责
2013/12/15 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
给校长的一封检讨书
2014/09/20 职场文书
新教师教学工作总结
2015/08/14 职场文书
高二语文教学反思
2016/02/16 职场文书
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python