一文大白话讲清楚webpack基本使用——17——Tree Shaking
文章目录
- 一文大白话讲清楚webpack基本使用——17——Tree Shaking
 - 1. 建议按文章顺序从头看,一看到底,豁然开朗
 - 2. 啥叫Tree Shaking
 - 3. 什么是死代码,怎么来的
 - 3. Tree Shaking的流程
 - 3.1 标记
 - 3.2 利用Terser摇起来
 
- 4. 具体使用方式
 - 4.1 适用前提
 - 4.2 使用流程
 
- 5. 副作用代码
 - 5.1 通过webpack.config.js中sideEffects指定
 - 5.2 通过package.json中sideEffects配置
 
一文大白话讲清楚webpack基本使用——17——Tree Shaking
1. 建议按文章顺序从头看,一看到底,豁然开朗
- 第一篇:
 - 一文大白话讲清楚啥是个webpack
 - 第二篇:
 - 一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建
 - 第三篇
 - 一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用
 - 第四篇
 - 一文大白话讲清楚webpack基本使用——3——图像相关loader的配置和使用
 - 第五篇
 - 一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用
 - 第六篇
 - 一文大白话讲清楚webpack基本使用——5——babel的配置和使用
 - 第七篇
 - 一文大白话讲清楚webpack基本使用——6——热更新及其原理
 - 第八篇
 - 一文大白话讲清楚webpack基本使用——7——代码分离和懒加载
 - 第九篇
 - # 一文大白话讲清楚webpack基本使用——8——开发环境和生产环境的配置和区别
 - 第十篇
 - 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用
 - 第十一篇
 - 一文大白话讲清楚webpack基本使用——10——使用CDN优化加载速度
 - 第十二篇
 - 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk
 - 第十三篇
 - 一文大白话讲清楚webpack基本使用——12——文件指纹和缓存机制
 - 第十四篇
 - 一文大白话讲清楚webpack基本使用——13——Js代码压缩
 - 第十五篇
 - 一文大白话讲清楚webpack基本使用——14——CSS代码压缩
 - 第十六篇
 - 一文大白话讲清楚webpack基本使用——15——HTML代码压缩
 - 第十七篇
 - 一文大白话讲清楚webpack基本使用——16——图片压缩
 - 然后看本篇,Tree Shaking
 
2. 啥叫Tree Shaking
- Tree,就是树,Shaking就是摇,摇树,为啥要摇树,让我们想起一件事
 - 果农秋收的时候,发现树上的果实有点已经烂了,有的还新鲜着,果农就想,我把这个树上不好的果子都去掉,怎么去呢,大力摇树,因为坏了的果子根部不牢固了,稍微用力摇就能掉下来。
 - 经过一番摇动之后,剩下的果实就是我们需要的好果实了。
 - 这就是Tree Shaking。
 - 回到webpack中,Tree Shaking就是在构建的时候把无用的代码(死代码)去掉,只保留有用的代码,这样就能缩减构建包的体积
 
3. 什么是死代码,怎么来的
- 啥是死代码,就是在程序运行的生命周期内(webpack认为的,不是全部的)始终不被执行的代码
 - 为啥始终得不到执行呢,这是因为在ES6模块出,我们通过export暴露外部接口,如果有些程序体既没有被暴露出去,内部有没有引用依赖,那么他讲永远无法被调用执行,这时,他就成了死代码
 - 比如我们在一个js文件里面写了两个方法,一个add,一个reduce
 
function add(x,y){return x+y
}
function reduce(x,y){return x-y
}
export{add
}
 
- 我们通过export之暴露了add,没有暴露reduce,那么reduce将无法被执行,就成了死代码
 - 或者我们通过import导入了add 和reduce,但是只用了add,没用reduce,也是一样的
 
import {add ,reduce} from 'xxx'
add()
// recuce()//一直未使用,也是死代码
 
- 可是,问题来了,为什么我们说这仅是webpack认为的死代码
 - 因为者设计一个概念,我们举个例子,你给我钱了,我没要;和你给我钱了,我没花;这两个最终的结果都是我没花你的钱,但是后者需要我用完钱了,我才能知道你到底花没花你的钱。而前者不一样,我一开始就知道我没花,因为我压根就没要你钱。
 - 放在程序里面,正常情况下,只有程序运行完了,我们才知道哪些代码没有被执行。之所以能提前知道有些代码不能被执行,是因为程序压根就没引入这些代码。为啥能知道呢,就是因为ES6模块没有暴露这个接口,这个事情,我们在编译的时候就能知道,不用等到运行时。
 - 这也是为什么webpack在构建时就可以识别出来有用和无用的代码
 
3. Tree Shaking的流程
3.1 标记
- webpack会从入口文件出发,递归的分析代码中的模块依赖,标记处用到的模块和导出的函数和变量
 - 具体标记如下:
 
- 所有import标记为/* harmony import*/
 - 所有用到的export标记为/* harmony export([type]) */其中type和webpack内部有关,可能值为binding,immutable等
 - 没被使用过的import标记为/* unused harmony export [FunctionName] */ 其中FunctionName为export的方法名称
 
3.2 利用Terser摇起来
- 通过Terser删除掉没有被用到的到导出语句
 
4. 具体使用方式
4.1 适用前提
- 前面讲过了,Tree Shaking的适用前提是我们通过ES6模块实现接口暴露,而不能是CommonJS(我们之前就是这么写的,不要改)
 - 另外就是一般在production环境下,默认开启Tree Shaking
 - 配置optimization.usedExports:true
 - 最后,要配置JS代码压缩,因为Tree Shaking发生在代码压缩阶段(我们之前讲JS代码压缩,已经配置过了,不要改)
 
4.2 使用流程
-  
首先,我们修改mode为production

 -  
然后配置optimization.usedExports:true

 -  
为了验证TreeShaking是否生效,我们在src/modulejs/add.js里面新增一个addThird方法,函数体长一些,暴露

 -  
然后我们在main.js里面倒入addTHird,并使用

 -  
构建打包
 
npm run build
 
-  
看构建后bundle体积

91KB -  
然后在main.js里面注销addTRhird的调用

 -  
可以看到在编辑器里面倒入的时候addTRhird变量变灰了,说明未使用
 -  
然后重新构建打包
 
npm run build
 
- 看看体积

90KB了,说明addTRhird没有被打包进来 - 有人会问了,为啥不在打包的js里面查看一下是否打包了addTRhird方法,因为我们把代码压缩了,找起来比较麻烦,谢谢
 - ok ,摇完了
 
5. 副作用代码
- 简单点,啥叫副作用,就是函数除了返回值还干了点别的
 
let a=0;
function add (x,y){a=2;return x+y
}
add(1,2)
 
- add除了返回x+y,还修改了外部变量,所以他是副作用函数
 - 为啥要讲副作用,就是有些代码没用但是又不想删除
 - 明白没有,就是比如这个add函数可能我们最后在main.js没引用,构建的时候本该删除,但是删了他影响了a,所以我们要考虑一下要不要删
 - 如果不想删,我们可以指定配置,有副作用的代码的不删除
 
5.1 通过webpack.config.js中sideEffects指定
- 在webpack.config.js里面配置sideEffects数组,数组元素是具有副作用的模块js
 
module.exports={sideEffects:['./xxx.js']
}
 
5.2 通过package.json中sideEffects配置
{sideEffects:true//所有导入文件都视为有副作用sideEfeects:false//都没有副作用sideEffects:['sss/jx']//指定哪些有副作用
}
相关文章:
一文大白话讲清楚webpack基本使用——17——Tree Shaking
文章目录 一文大白话讲清楚webpack基本使用——17——Tree Shaking1. 建议按文章顺序从头看,一看到底,豁然开朗2. 啥叫Tree Shaking3. 什么是死代码,怎么来的3. Tree Shaking的流程3.1 标记3.2 利用Terser摇起来 4. 具体使用方式4.1 适用前提…...
【C++ 区间位运算】3209. 子数组按位与值为 K 的数目|2050
本文涉及知识点 位运算、状态压缩、枚举子集汇总 LeetCode3209. 子数组按位与值为 K 的数目 给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中有多少个子数组 满足:子数组中所有元素按位 AND 的结果为 k 。 示例 1: 输入:…...
8 比例缩放(scale.rs)
scale.rs代码是几何变换库euclid中典型的数据结构和方法的例子,用于处理二维和三维空间中的缩放变换。 一、scale.rs文件源码 //! A type-checked scaling factor between units.use crate::num::One;use crate::approxord::{max, min}; use crate::{Box2D, Box3D…...
二分 机器人的跳跃问题
二段性:找到一个值,大于此值的时候都成立,小于的时候都不成立 更新的方式只有两种,左边的mid更新不需要1;右边的mid更新需要1 //对能量进行二分,确定能量的范围 //特判防止溢出int #include<bits/stdc.h> using…...
Hive:复杂数据类型之Map函数
Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型,这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…...
R 字符串:深入理解与高效应用
R 字符串:深入理解与高效应用 引言 在R语言中,字符串是数据处理和编程中不可或缺的一部分。无论是数据清洗、数据转换还是数据分析,字符串的处理都是基础技能。本文将深入探讨R语言中的字符串概念,包括其基本操作、常见函数以及高效应用方法。 字符串基本概念 字符串定…...
设计模式Python版 桥接模式
文章目录 前言一、桥接模式二、桥接模式示例三、桥接模式与适配器模式的联用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…...
记5(一元逻辑回归+线性分类器+多元逻辑回归
目录 1、一元逻辑回归2、线性可分&线性不可分3、Iris数据集实现多元逻辑回归4、绘制分类图5、鸢尾花分类图6、多分类问题:(softmax回归)6.1、编码:自然顺序码、独热编码、独冷编码6.2、二/多分类问题:6.3、softmax…...
【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...
Nginx 运维开发高频面试题详解
一、基础核心问题 原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx? Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...
下载OpenJDK
由于Oracle需要付费,并且之前我在寻找openJDK的时候,我不知道网址,并且也不知道在这个openjdk这个网址里点击哪个模块进行下载。最近我在看虚拟机相关的书籍的时候,找到了相关的网址。 注意:下面的下载都是基于可以科…...
Web3.js详解
Web1&Web2&Web3 以下是Web1、Web2和Web3的详细介绍,以及一个对比表格: Web1 定义:Web1指的是有着固定内容的非许可的开源网络。特点:在Web1时代,网站内容主要由网站管理员或创建者提供,用户只能…...
学习串行通信
本文来源: [8-1] 串口通信_哔哩哔哩_bilibili 智谱清言 ------------ 串口(Serial Port): 串口是一种应用非常广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设…...
【leetcode强化练习·二叉树】同时运用两种思维解题
本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解,你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树,…...
Rank-analysis-1.2——一款基于LCU API的排位分析工具,大四学生独立开发
LOL Rank Record Analysis:一款基于LCU API的排位分析工具,大四学生独立开发! 大家好!我是河南科技学院的大四学生,今天给大家分享一个我自己开发的软件——LOL Rank Record Analysis。这是一个基于 Riot 提供的 LCU …...
什么是门控循环单元?
一、概念 门控循环单元(Gated Recurrent Unit,GRU)是一种改进的循环神经网络(RNN),由Cho等人在2014年提出。GRU是LSTM的简化版本,通过减少门的数量和简化结构,保留了LSTM的长时间依赖…...
Google Chrome-便携增强版[解压即用]
Google Chrome-便携增强版 链接:https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装,即可以覆盖更新又能解压使用! √ 此增强版,支持右键解压使用 √ 加入Chrome增强…...
智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制
内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…...
【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
目录 协议层设计,以IIC为例子 关于软硬件IIC 设计的一些原则 完成协议层的抽象 刨析我们的原理 如何完成我们的抽象 插入几个C语言小技巧 完成软件IIC通信 开始我们的IIC通信 结束我们的IIC通信 发送一个字节 (重要)完成命令传递和…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
