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 相关文章推荐
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
Java并发编程之Executor接口的使用
Jun 21 Java/Android
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
java中用float时,数字后面加f,这样是为什么你知道吗
Sep 04 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
Java 在生活中的 10 大应用
Nov 02 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 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
递归列出所有文件和目录
2006/10/09 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
JS实现复制功能
2017/03/01 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
浅析python连接数据库的重要事项
2021/02/22 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
密封类可以有虚函数吗
2014/08/11 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
五心教育心得体会
2014/09/04 职场文书
纪录片信仰观后感
2015/06/08 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书