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 相关文章推荐
Java内存模型之happens-before概念详解
Jun 13 Java/Android
教你用Java在个人电脑上实现微信扫码支付
Jun 13 Java/Android
新手初学Java网络编程
Jul 07 Java/Android
Java使用Unsafe类的示例详解
Sep 25 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
Java中的随机数Random
Mar 17 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
一文搞懂Java中的注解和反射
Jun 21 Java/Android
java.util.NoSuchElementException原因及两种解决方法
Jun 28 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
jquery编写日期选择器
2017/03/16 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Django的session中对于用户验证的支持
2015/07/23 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
大学生学业生涯规划
2014/01/05 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书