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 相关文章推荐
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 Java/Android
Java Spring 控制反转(IOC)容器详解
Oct 05 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
springboot应用服务启动事件的监听实现
Apr 06 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
Java线程的6种状态与生命周期
May 11 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
Jul 23 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 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
cakephp常见知识点汇总
2017/02/24 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
Pandas标记删除重复记录的方法
2018/04/08 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
中医临床专业自我鉴定范文
2014/01/15 职场文书
家长写给老师的建议书
2014/03/13 职场文书
电子商务专业自荐信
2014/06/02 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
学校清明节活动总结
2014/07/04 职场文书
拆迁委托协议书
2014/09/15 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android