Webpack构建性能优化指南

本指南翻译自webpack官方性能指南文档:https://webpack.js.org/guides/build-performance/

构建性能

本指南涵盖了对增进构建或编译性能的一些有效的提示。


General

以下提示对开发环境或者生产环境都有效。

Stay Up to Date

保持最新的webpack版本。我们总是在改进webpack的性能。目前最新的webpack版本为:v4.41.4
使用最新的Node.js也可以提升性能。同样的,保持npm或者yarn这样的包管理器的版本也同样可以提升性能。新版本拥有更高效的模块树与更快的解析速度。

Loaders

对需要的模块采用对应Loader,例如:

module.exports = {//...module: {rules: [{test: /\.js$/,include: path.resolve(__dirname, 'src'),loader: 'babel-loader',},],},
};

以上示例通过include属性圈定了babel-loader的作用范围,如果不使用该属性,则babel-loader将会对所有的js文件作业。

Bootstrap

每一个额外的Loader或者插件都会消耗一定的启动时间,尝试使用尽可能少的工具。

Resolving

以下几点可以提升解析速度:

  • 降低resolve.modules、resolve.extensions、resolve.mainFiles、resolve.descriptionFiles这些选项中item的数量,因为它们会导致更频繁的IO。
  • 如果不使用symlinks(例如npm link或yarn link),那么将resolve.symlinks设为false。
  • 如果使用了自定义的插件,则将resolve.cacheWithContext设置为false。

Dlls

使用DllPlugin插件将不常变更的代码进行单独编译。尽管这会增加构建的复杂度,但会提高应用的编译速度。

Smaller = Faster

降低被编译文件的体积同样可以提升构建性能。想办法使chunk更小。

  • 使用体积更小/熟练更少的库。
  • 在多页应用中使用SplitChunksPlugin插件。
  • 在多页应用中的async模式下使用SplitChunksPlugin插件。
  • 移除未被使用的代码。
  • 只编译当前你正在开发的代码。

Worker Pool

thread-loader可将开销昂贵的loader转移至线程池执行。不过不能使用太多的线程,这对node.js运行时来说引发过载。另外也要降低线程与主进程模块之间的信息传输,因为IPC是昂贵的。

Persistent cache

通过cache-loader开启持续缓存的能力。

Custom plugins/loaders

对于自定义的插件与loader,请自行分析优化性能。

Progress plugin

移除ProgressPlugin可能会缩短少许的构建时间。但是要记住,这并不会带来可观的构建速度优化,所以在移除该插件之前要平衡好取舍。

Development

以下优化手段在开发环境是尤其有效的。

Incremental Builds

使用webpack的watch模式,别使用其它工具来监听文件的变化再来调用webpack。webpack内建的watch模式会保留时间戳的信息并将该信息给到编译器以使缓存失效。

在一些设置中,监听是靠轮询来完成的。随着监听文件数量的增多,这会增加大量CPU的计算量。在这种情况下,可以通过watchOptions.poll来增加轮询间隔。

Compile in Memory

以下工具通过内存编译以及内存伺服的方式提升了性能,可以尝试使用:

  • webpack-dev-server
  • webpack-hot-middleware
  • webpack-dev-middleware

stats.toJson speed

webpack4默认情况下会通过stats.toJson()输出大量数据。除非在增量步骤中是必须的,否则避免检索stats对象。webpack-dev-server在v3.1.3之后的版本针对于这一问题做了大量的性能方面的优化。

Devtool

不同的devtool设置所引起的性能是不同的,要有这个意识。

  • "eval"拥有最好的性能,不过它不会保留源代码。
  • "cheap-source-map"带来的性能损耗还可以,它会有一些性能损耗。
  • "eval-source-map"用来增量构建。
    在大多数情况下,cheap-module-eval-source-map是最适中的方案。

Avoid Production Specific Tooling

确保工具、插件、loader只是用于生产环境而不是开发环境,否则会带来不需要的资源开销。例如,在开发环境下通常不需要对代码做混淆与压缩,比如使用TerserPlugin来实现这个能力,开发环境下是不需要的。下面这些工具在开发环境下一般都是需要被摘出来的:

  • TerserPlugin
  • ExtractTextPlugin
  • [hash]/[chunkhash]
  • AggressiveSplittingPlugin
  • ModuleConcatenationPlugin

Minimal Entry Chunk

WebPack仅向文件系统发送更新的chunks。对于一些配置选项,(例如:HMR,[name]/[chunkhash]inOutput.chunkfilename,[hash])除更改的chunks外,入口chunk是无效的。

使入口chunk保持小的体量才能使更新的成本更低。下面的代码块会抽取一个包含仅仅是在运行时包含其它子块的chunk:

new CommonsChunkPlugin({name: 'manifest',minChunks: Infinity,
});

Avoid Extra Optimization Steps

webpack会进行额外的逻辑运算工作来优化输出代码的体量与加载性能。下面优化选项对于小型的项目代码来说是有效的,不过对于大型项目来说那就不太适用了:

module.exports = {// ...optimization: {removeAvailableModules: false,removeEmptyChunks: false,splitChunks: false,},
};

Output Without Path Info

webpack有能力在输出的Bundle中携带路径信息。然而,在有上千个组件的项目中会导致垃圾收集器的压力。可使用以下选项将这个功能关闭:

module.exports = {// ...output: {pathinfo: false,},
};

Node.js Versions 8.9.10-9.11.1

在Node.js 8.9.10 ~ 9.11.1的版本区间内,Map和Set的实现在性能方面表现很差,所以这影响到了webpack的编译时间。在这之前与之后的版本都没有受到影响,所以要避免使用这个版本内的Node.js。

#Production
以下优化选项尤其适用于生产环境

Multiple Compilations

当使用多重编译时,下面这些工具可能会帮到你:

  • parallel-webpack 可以在线程池中完成编译。
  • cache-loader 缓存可在多次编译中共享。

Source Maps

SourceMap是非常昂贵的,你真的需要它吗?

一些工具的问题

下面这些工具含有一些问题,这些问题会导致性能上有一些影响:

Babel

  • 降低preset/plugin的数量。

TypeScript

  • 在单独的进程中使用fork-ts-checker-webpack-plugin用于类型检查。
  • 配置loader跳过类型检查。
  • 在happyPackMode: true或transpileOnly: true中使用ts-loader。

Sass

  • node-sass有一个Bug,这个bug会阻断Node.js线程池中的线程。当通过thread-loader使用它时,请将workerParallelJobs设置为2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 92. 反转链表 II(双指针)

1. 题目 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例:输入: 1->2->3->4->5->NULL, m 2, n 4 输出: 1->4->3->2->5->NULL来源:力扣(LeetCode) 链接&#xf…

我对你的爱,是只为你而留的神经元

文 | 白鹡鸰有一个小轶专属神经元编 | 小轶有一个白鹡鸰专属神经元什么是苹果?红的?绿的?黄的?球状?斑点?香气?需要咬上一口才能确定?或者……其实我们在说某家技术公司?…

Android动态日志系统Holmes

背景 美团是全球领先的一站式生活服务平台,为6亿多消费者和超过450万优质商户提供连接线上线下的电子商务网络。美团的业务覆盖了超过200个丰富品类和2800个城区县网络,在餐饮、外卖、酒店旅游、丽人、家庭、休闲娱乐等领域具有领先的市场地位。平台大&a…

领域应用 | 知识图谱在小米的应用与探索

本文转载自公众号:DataFunTalk。分享嘉宾:彭力 小米编辑整理:马瑶出品平台:DataFunTalk导读:小米知识图谱于2017年创立,已支持公司了每天亿级的访问,已赋能小爱同学,小米有品、智能问…

前端应用开发架构图谱

个人整理的前端架构图谱,之后会根据这个图谱不断的完善内容。希望这个图谱可以对开发同学的知识脉络有个梳理的作用。 相关图谱文件已上传至Github:https://github.com/sahadev/front-end-architecture,后续将不定期更新。 2020年02月28日已…

丹琦女神新作:对比学习,简单到只需要Dropout两下

文 | 花小花Posy上周把 《对比学习有多火?文本聚类都被刷爆了...》分享到卖萌屋的群里后,遭到了群友们一波嫌弃安利。小伙伴们表示,插入替换的数据增强方式已经Out了,SimCSE才是现在的靓仔。snowfloating说:看完Danqi …

美团点评移动端基础日志库——Logan

背景 对于移动应用来说,日志库是必不可少的基础设施,美团点评集团旗下移动应用每天产生的众多种类的日志数据已经达到几十亿量级。为了解决日志模块普遍存在的效率、安全性、丢失日志等问题,Logan基础日志库应运而生。 现存问题 目前&#xf…

整理一波国外前端学习网站

国内的普通开发者对于掌握一门新的技术不知道从哪里下手,看哪些书。为了获得相关知识会关注各种公众号、购买各种视频课程来学习,但由于这些内容本身有碎片化的特点,效果往往不太理想。以至于付出了大量的时间到最后不能够形成系统化的知识。…

论文浅尝 - ACL2020 | Segmented Embedding of Knowledge Graphs

来源:ACL2020链接:https://arxiv.org/pdf/2005.00856.pdf摘要知识图谱的嵌入愈发变成AI的热点之一,对许多下游任务至关重要(如个性化推荐、问答等)同时,此模型强调两个关键特性:利用足够多的特征…

【论文翻译】HeteSim:异构网络中相关性度量的通用框架

原文链接:https://blog.csdn.net/Mrong1013967/article/details/115330139 HeteSim:异构网络中相关性度量的通用框架 摘要 相似性搜索是许多应用中的一个重要功能,它通常侧重于度量同一类型对象之间的相似性。然而,在许多场景中&a…

LeetCode 234. 回文链表(快慢指针+链表反转)

1. 题目 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false示例 2: 输入: 1->2->2->1 输出: true进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode) 链接&a…

随机/线性颜色生成器(RandomColorGenerator)

最近在实现https://javascript30.com/的课程,其中有一门课程要求利用Canvas实现一个效果,我发现这个效果其中的颜色是线性生成的。结合我之前已经写过一个随机颜色生成器,就想将这个随机颜色生成器写出来,作为一个工具使用&#x…

美团点评运营数据产品化应用与实践

背景 美团点评作为全球最大的生活服务平台,承接超过千万的POI,服务于数量庞大的活跃用户。在海量数据的前提下,定位运营业务、准确找到需要数据的位置,并快速提供正确、一致、易读的数据就变得异常困难,这些困难主要体…

NAACL’21 | 来看如何让模型学会因为所以但是如果

文 | Eleanor 编 | 戏有一些标准考试那是真的难,难到能分分钟教你做人。对于留学党来说,申请法学博士需要 LSAT 考试成绩、申请商学院需要 GMAT 考试成绩。这些标准考试到底有多难,大概考过的都懂8(嘤嘤嘤_(:з」∠)_)…

领域应用 | 知识计算,华为云赋能企业知识化转型

本文转载自公众号:华为云AI。从计算智能,到感知智能,再到认知智能,是业界普遍认同的人工智能技术发展路径。随着技术的演进,人工智能已经在"听、说、看"等感知智能领域达到或超越了人类水准,但是…

我在小程序工程化方面的一些实践

我在小程序工程化方面的一些实践 早期做小程序时,还是原始时代,项目结构混乱,各种冗余代码,每次迭代时由于高昂的维护成本,极为头疼。遂在一次次的更迭中完成了基础组件的初版,极为酸爽。从此之后在当时的…

LeetCode 430. 扁平化多级双向链表(DFS)

1. 题目 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。 扁平化列表…

详解:多模态知识图谱种类及其应用

详解:多模态知识图谱种类及其应用 本文系统的讲述了一些关于多模态知识图谱的相关知识,作者介绍了一些重要的开源多模态知识图谱,基于百科多模态知识图谱Richpedia以及相关使用网站和多模态知识图谱的应用。>>加入极市CV技术交流群&am…

Android Hook技术防范漫谈

背景 当下,数据就像水、电、空气一样无处不在,说它是“21世纪的生产资料”一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天。随着互联网和数据的思维深入人心,一些灰色产业悄然兴起,数据贩子、爬虫…

论文浅尝 - ICML2020 | 跨域对齐的图最优运输算法

陈卓,浙江大学在读博士,主要研究方向为图神经网络和知识图谱表示学习。论文链接:https://arxiv.org/pdf/2006.14744代码:https://github.com/LiqunChen0606/Graph-Optimal-Transport发表会议:ICML 2020动机该论文的出发…