前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >webpack实战——打包优化【下】

webpack实战——打包优化【下】

作者头像
流眸
发布于 2020-11-06 02:26:19
发布于 2020-11-06 02:26:19
45900
代码可运行
举报
运行总次数:0
代码可运行

前言

这是webpack打包优化【下】篇。前几篇针对性能要求高的项目从加快打包速度、减小资源体积方面入手,提出了一些优化政策,然后测试都可起到一定优化效果。本篇描述死代码的检测与去除

tree shaking

1 死代码检测去除

首先抛出问题,什么是死代码?

“工程中没有被引用过的模块,这部分代码将永远无法被执行,称为“死代码”。

那知道了什么是死代码,如何检测去除呢?

在前面我们介绍过,ES6 module 依赖关系的构建是在代码编译时而非运行时。基于这项特性webpack提供了tree shaking功能。这个功能便可以在打包过程中帮助我们检测没有被引用的模块,然后对这部分代码进行标记,并在资源压缩时将它们从最终的bundle中去掉

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.js
import { foo } from './util';
foo();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// util.js
export function foo() {
    console.log('this is foo');
}
export function bar() { // 没有被任何其他模块引用,因此属于死代码
    console.log('this is bar');
}

那么在webpack打包时就会对bar()添加一个标记,在正常本地开发环境下它依然会存在,但是在生产环境压缩资源那一环节则会被移除掉。

tree shaking有时可以使得bundle资源体积显著减小,但需要一些前提条件。

2 ES6 Module

tree shaking 只对ES6 Module生效。 有时候我们发现算只引用了某个库中的一个接口,却把整个库都加载了进来,使得bundle体积并没有什么变化,可能原因是该库是用CommonJS导出的,而不是ES6 Module。当然,为了更好地向下兼容,自然是使用CommonJS形式是库依然很多。而排开第三方库,在我们自己书写模块或者库时,可以尽可能的选择ES6 Module形式导出,这样tree shaking的效率会更高。

3 使用webpack进行依赖关系构建

一般我们都会在工程中使用到babel-loader,如果我们有使用到,那么一定要通过禁止它的模块依赖解析。原因是如果我们使用babel-loader来做依赖解析,那么webpack接收到的一般都是转化过的CommonJS形式的模块,那就无法对其进行tree shaking。

禁用babel-loader模块依赖解析配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
module.exports = {
    ...
    module: {
        ryles: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: [
                                // 在这里加上modules: false
                                [@babel/preset-env, { modules: false }]
                            ]
                        }
                    }
                ]
            }
        ]
    }
}

4. 使用压缩工具去除死代码

tree shaking本身只是为死代码添加上标记,而真正意义上去除死代码则是通过压缩工具来进行的,而此工具之前介绍过:terser-webpack-plugin。在此不再赘述。

小结

通过【上】【中】【下】三篇描述,介绍的一些打包优化的方案均可以对项目有不同程度的优化,无论是打包速度还是减小资源体积,都有涉及。然而我们更需要清楚地了解到每一种优化策略都有其使用场景,并不是任何一个点放在一切项目中都有效。

当然,我们更需要不断培养自己的能力,当发现性能问题时,根据现有情况自己多加思考,分析出原因,然后对症下药。

下一篇介绍更多的JavaScript打包工具。

精彩推荐

生产环境配置【上】

样式预处理

常用验证码之滑动验证码|图形验证码

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 流眸 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
理论|webpack2 终极优化
webpack是当下最流行的js打包工具,这得益于网页应用日益复杂和js模块化的流行。webpack2增加了一些新特性也到了预发布阶段,是时候告诉大家如何用webpack2优化你的构建让它构建出更小的
用户1097444
2022/06/29
6450
理论|webpack2 终极优化
前端工程化之Webpack优化
好久没更文了,其实这段时间,一直没闲着。在准备一些比较重要的东西。忙着跑步,忙着学习,忙着xx。 总之就是,一直在忙着,从未停歇。
前端柒八九
2022/09/16
1.2K2
「吐血整理」再来一打Webpack面试题
从头发的浓密程度和干练的走路姿势我察觉到,面前坐着的这位面试官也是一把好手。我像以往一样,准备花3分钟的时间进行自我介绍。在此期间,我的目光被16寸的MacBook Pro所吸引,这次的自我介绍我做足了准备,很有信心征服面试官。不出我所料,面试官被我引入了我擅长的领域。
童欧巴
2020/03/30
1.2K0
「吐血整理」再来一打Webpack面试题
Webpack 打包优化之速度篇
在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨;当然,那些法子对于打包速度的提升,也是大有裨益。然而,打包速度之于开发体验和及时构建,相当重要;所以有必要对其做更为深入的研究,以便完善工作流,这就是本文存在的缘由。 减小文件搜索范围 在使用实际项目开发中,为了提升开发效率,很明显你会使用很多成熟第三方库;即便自己写的代码,模块间相互引用,为了方便也会使用相对路劲,或者别名(alias);这中间如果能使得 Webpack 更快寻找到目标,将对打包速度产生很是积极的
晚晴幽草轩轩主
2018/03/27
1.7K0
webpack中tree-shaking技术介绍
之前介绍过webpack3的新特性,里面提到webpack2支持了ES6的import和export,不需要将ES6的模块先转成CommonJS模块,然后再进行打包处理。正基于此,webpack2引入了tree-shaking技术,能够在模块的层面上做到打包后的代码只包含被引用并被执行的模块,而不被引用或不被执行的模块被删除掉,以起到减包的效果。 webpack的tree-shaking案例 下面结合实际代码来解释webpack2是如何实现tree-shaking的,示例代码可到github进行下载。 示例
用户1217459
2018/01/31
9860
webpack中tree-shaking技术介绍
【Webpack】507- 基于Tree-shaking的多平台Web代码打包实践
在业务中,我们常常会遇到一个场景:同一套web业务代码要在多平台下执行其对应的不同职能。这样很容易出现两个问题:代码里“尸横遍野”的环境判断和分支,提高了代码维护难度;执行环境下载了其他环境的功能代码,造成了资源的浪费。只要我们合理使用Webpack的Tree-shaking功能,就可以很好地解决问题。
pingan8787
2020/02/26
9370
【Webpack】507- 基于Tree-shaking的多平台Web代码打包实践
Tree Shaking
Javascript 绝大多数情况需要通过网络进行加载再执行,加载的文件越小,整体执行时间更短,所以就有了 Tree Shaking 去除无用代码,从而减小文件体积。
政采云前端团队
2022/12/01
7450
Tree Shaking
webpack2 终极优化
webpack是当下最流行的js打包工具,这得益于网页应用日益复杂和js模块化的流行。webpack2增加了一些新特性也正式发布了一段时间,是时候告诉大家如何用webpack2优化你的构建让它构建出更
IMWeb前端团队
2018/01/08
1.2K0
webpack2 终极优化
入门webpack的最佳实践(基于webpack4.X 5.X)-- 打包结果优化
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/09/04
7890
入门webpack的最佳实践(基于webpack4.X 5.X)-- 打包结果优化
webpack面试题
webpack打包原理 1、把一切都视为模块:不管是 CSS、JS、Image 还是 HTML 都可以互相引用,通过定义 entry.js,对所有依赖的文件进行跟踪,将各个模块通过 loader 和 plugins 处理,然后打包在一起。 2、按需加载:打包过程中 Webpack 通过 Code Splitting 功能将文件分为多个 chunks,还可以将重复的部分单独提取出来作为 commonChunk,从而实现按需加载。把所有依赖打包成一个 bundle.js 文件,通过代码分割成单元片段并按需加载 3、webpack.config.js的配置
用户10106350
2022/10/28
6450
Webpack 4教程 - 第七部分 减少打包体积与Tree Shaking
在本次Webpack 4教程中,我们会更进一步讲述项目优化。我们会学习什么是tree shaking以及如何使用它。你会找到让Webpack 4中tree shaking运作起来所需要的东西,并知道怎样从中受益。开始吧!
葡萄城控件
2019/05/25
9560
webpack的进阶使用
Webpack 是一个模块打包器,可以将多个模块打包成一个或多个文件。除了基本的打包功能外,Webpack 还提供了很多高级功能,可以优化打包结果、提高构建速度等。在本文中,我们将介绍 Webpack 的一些进阶使用技巧,并提供相应的代码示例。
世间万物皆对象
2024/03/20
1000
webpack 学习笔记系列06-打包优化
可选值:async(默认) | initial | all(推荐),针对下面的 a.js 和 b.js
CS逍遥剑仙
2021/06/27
1.9K0
webpack优化解决项目体积大、打包时间长、刷新时间长问题!
在大家的日常开发中,特别是开发大型项目,大家有没有每次打包想要骂娘的冲动!反正我是很痛苦,每次打包20分钟起,这漫长的等待时间,让人非常焦虑,遇见一些特殊问题(比如测试微信分享),必须要打包部署,看效果,你会发现,一天时间全部浪费在打包上,真所谓改代码两分钟,打包代码两小时,于是闲暇之余,研究了一下webpck打包机制,并且通过几个小插件和一些技巧成功的减少公司项目的打包时间,虽然打包时间没有断崖式的减少,但是能少一分钟,是一分钟吧,下面我们一起来研究一下webpack的性能优化,以及体积优化!
用户7413032
2020/06/11
11K0
webpack优化解决项目体积大、打包时间长、刷新时间长问题!
webpack实战——JS打包工具
前面篇章叙述了关于webpack的许多内容,从入门,打包第一个模块,到进阶,最后到本地、生产及打包的优化。本篇则提及一下在JavaScript社区中另外的一些类似的打包工具,它们有的更加轻量、简洁,有的则更专注于某类特定场景等。通过了解这些,希望会有助于我们开发时从更多的角度和方向来认识打包工具及其发展,进而选用更加适合我们项目的打包工具。
流眸
2020/11/06
2.2K0
梳理 6 项 webpack 的性能优化
webpack在启动后,会根据Entry配置的入口,递归解析所依赖的文件。这个过程分为「搜索文件」和「把匹配的文件进行分析、转化」的两个过程,因此可以从这两个角度来进行优化配置。
Nealyang
2020/07/24
1.9K0
webpack高级配置
我主要是想说摇树失败的原因(tree shaking 失败的原因),先讲下摇树本身效果
gogo2027
2022/10/18
8470
Webpack 实现 Tree shaking 的前世今生
如果看过 rollup 系列的这篇文章 - 无用代码去哪了?项目减重之 rollup 的 Tree-shaking,那你一定对 tree-shaking 不陌生了。如果对 tree-shaking 相关知识不熟悉,请先点开上面这篇文章花 5 分钟了解一下:什么是 tree-shaking。
zz_jesse
2021/07/12
1.2K0
Webpack 实现 Tree shaking 的前世今生
webpack高级配置_2023-03-01
我主要是想说摇树失败的原因(tree shaking 失败的原因),先讲下摇树本身效果
gogo2027
2023/03/01
9310
Rollup 与 Webpack 的 Tree-shaking
Rollup 和 Webpack 是目前项目中使用较为广泛的两种打包工具,去年发布的 Vite 中打包所依赖的也是 Rollup;在对界面加载效率要求越来越高的今天,打包工具最终产出的包体积也影响着开发人员对工具的选择,所以对 Tree-shaking 的支持程度和配置的便捷性、有效性就尤为重要了。本文就来简单分析下两者 Tree-shaking 的流程和效果差异。
政采云前端团队
2022/12/01
1.4K0
Rollup 与 Webpack 的 Tree-shaking
相关推荐
理论|webpack2 终极优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验