Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ES系列十一之ES集群搭建
首先呢,单点的es实例我们已经会搞了,我们就直接开始集群的操作步骤吧。
热心的大肚皮
2023/02/28
2.6K0
ES系列十一之ES集群搭建
linux下elasticsearch 安装、配置及示例「建议收藏」
简介 开始学es,我习惯边学边记,总结出现的问题和解决方法。本文是在两台linux虚拟机下,安装了三个节点。本次搭建es同时实践了两种模式——单机模式和分布式模式。条件允许的话,可以在多台机器上配置es节点,如果你机器性能有限,那么可以在一台虚拟机上完成多节点的配置。 如图,是本次3个节点的分布。
全栈程序员站长
2022/07/04
9710
linux下elasticsearch 安装、配置及示例「建议收藏」
ElasticSearch集群调优
放权那些别人都能做的事情,把空出来的时间集中用在收入丰厚的活动上。放权其它无用的事情,将时间用来定位自己。
凹谷
2020/04/11
7010
万文Elasticsearch巧妙的架构详解
本书作为 Elastic Stack 指南,关注于 Elasticsearch 在日志和数据分析场景的应用,并不打算对底层的 Lucene 原理或者 Java 编程做详细的介绍,但是 Elasticsearch 层面上的一些架构设计,对我们做性能调优,故障处理,具有非常重要的影响。
大数据老哥
2022/02/17
7680
万文Elasticsearch巧妙的架构详解
ELK总结——第一篇elaticsearch的搭建
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
胡齐
2019/12/05
7860
看完这篇还不会Elasticsearch,我跪搓衣板!
本文转载自:https://www.cnblogs.com/jajian/p/11223992.html
天涯泪小武
2019/08/15
7800
看完这篇还不会Elasticsearch,我跪搓衣板!
搭建 ElasticSearch 2.4.6分布式集群
选取10.90.4.9这台机器做为client node,elasticsearch.yml中的配置如下:
試毅-思伟
2018/09/06
8970
搭建 ElasticSearch 2.4.6分布式集群
【ElasticSearch篇】--ElasticSearch从初识到安装和应用
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,在企业中全文搜索时,特别常用。
LhWorld哥陪你聊算法
2018/09/13
5730
【ElasticSearch篇】--ElasticSearch从初识到安装和应用
【Elasticsearch系列之一】ES基本概念
ES 是一个近实时的搜索平台,当一个文档写入Lucene后是不能被立即查询到的。Elasticsearch提供了一个refresh操作,会定时地调用lucene的reopen(新版本为openIfChanged)为内存中新写入的数据生成一个新的segment,此时被处理的文档均可以被检索到。refresh操作的时间间隔由refresh_interval参数控制,默认为1s, 可以在写入请求中带上refresh表示写入后立即refresh,另外还可以调用refresh API显式refresh,例如:
Vicwan
2020/04/07
2.9K0
【elasticsearch】docker下elasticsearch集群和分片
es2-es3配置文件 -----------------------es2-----------------------
周杰伦本人
2022/10/25
4720
【elasticsearch】docker下elasticsearch集群和分片
【ES三周年】elasticsearch目录及配置参数说明
1.elasticsearch目录及其作用bin存放ES启动、关闭等脚本文件存放执行文件,例如启动脚本、密钥工具等configES的配置文件所在的目录,其中有三个主要的配置文件elasticsearch.yml是用于ES的最主要的配置文件jvm.options用于配置ES JVM设置log4j2.properties用于配置ES 日志记录的属性jdkES自带的JDK目录data默认的索引数据存储位置,实际中一般需要自行更改logs存储ES的运行日志默认的日志存放位置,实际中一般需要自行更改libES运行所需
张同学tty
2023/04/06
2.3K1
【ES三周年】elasticsearch目录及配置参数说明
【Elasticsearch系列十四】Elasticsearch
ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。
kwan的解忧杂货铺
2024/09/20
1520
Elasticsearch的配置学习笔记
文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的。
朱季谦
2021/07/13
4680
elastic search面试题_elasticsearch实战
Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了具有 HTTP Web 界面和无架构 JSON 文档的分布式,多租户能力的全文搜索引擎。 Elasticsearch 是用 Java 开发的,根据 Apache 许可条款作为开源发布。
全栈程序员站长
2022/09/30
6720
elastic search面试题_elasticsearch实战
全文搜索引擎Elasticsearch,这篇文章给讲透了
由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及它的使用和基本原理。
大数据技术架构
2019/08/16
10K3
全文搜索引擎Elasticsearch,这篇文章给讲透了
Elasticsearch 6.x集群搭建
1、关闭防火墙和SELINUX systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config 2、JDK安装 rpm -qa|grep java|xargs rpm -e --nodeps tar -zxvf jdk*.tar.gz -C /opt vi /etc/profile.d/cus
程裕强
2019/05/27
6510
linux安装elasticsearch7_elasticsearch入门
Linux上elasticsearch7集群搭建 前期准备: 服务器三台 168.168.12.62 168.168.12.63 168.168.12.64 部署jdk 解压jdk放在/data目录,/data/jdk 配置环境变量,/etc/proifle里面加入如下
全栈程序员站长
2022/11/04
2590
elasticsearch2.3.1 集群安装
    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
尚浩宇
2018/08/17
4380
ElasticSearch 集群的搭建
这里集群的配置是通过ElasticSearch的內建模块Zen Discovery机制,它提供单播和双播发现集群机制. 同一个集群只需配置相同的集群名称就可以识别为一个集群
Tim在路上
2020/08/04
5830
elasticsearch部署方案_elasticsearch安装配置
Elasticsearch 是一个极其强大的搜索和分析引擎,其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性。
全栈程序员站长
2022/11/07
9370
推荐阅读
相关推荐
ES系列十一之ES集群搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验