Webpack 构建慢的原因是什么

发布时间:2021-06-16 16:35:39 作者:chen
来源:亿速云 阅读:537

这篇文章主要讲解了“ Webpack 构建慢的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ Webpack 构建慢的原因是什么”吧!

背景

上一篇文章我们分析了:为什么 esbuild 这么快

还有数据对比:

Webpack 构建慢的原因是什么

可以明显看到:esbuild 一骑绝尘, 以绝对优势领先。

看看最下面, 赫然是我们最熟悉的 webpack。

那么, webpack 的构建为什么慢呢?到底慢在哪呢 ?

下面是我的一些思考,分享给大家,希望对大家有所帮助。

正文

首先我们先看一下 webpack 构建的大致流程:

Webpack 构建慢的原因是什么

webpack build flow

流程走的比较长。

那么,整个流程的性能瓶颈在哪里呢?

我认为主要是在以下两个阶段:

  1. 代码构建

  2. 代码压缩

图片

https://www.quora.com/What-is-Webpack-and-babel-loader

我们分别来看。

1. 代码构建

代码构建阶段, 需要做的一个很重要的事情是模块依赖分析, 生成Module Graph。

这部分有十分复杂的流程。

Webpack 构建慢的原因是什么

webpack build graph

Webpack 构建慢的原因是什么

https://medium.com/webpack/the-chunk-graph-algorithm-week-26-29-7c88aa5e4b4e

这部分非常复杂,也比较耗时。

为此 webpack 也设计了对应的的算法去优化这部分,感兴趣的可以去研究一下。

这部分的详细解析,有个视频讲的不错,感兴趣的可以去看一下:

Webpack 构建慢的原因是什么

https://youtu.be/Lzh8A0p3z8g

说回构建。

现代浏览器对 esm 支持的越来越好,模块依赖分析的工作,浏览器就能完成。

而且, 浏览器的很多包分析工具是用C/C++写的, 显然是要比 webpack 使用 js 去分析整个依赖图谱更具优势,速度上也是要快很多的。

2. 代码压缩

目前最成熟的 js 压缩工具是 UglifyJS。

它会分析 js 的代码语法树, 理解代码含义,从而能做到诸如: 去掉无效代码,去掉日志输出代码,缩短变量名等优化。

webpack 使用压缩插件来完成这部分工作。

其中: webpack 使用的 terser, 是用 js 写的, 源自于最早的 uglyfy.js , 功能很丰富, 但是速度非常非常慢。

这点, 也是 webpack 速度慢的原因之一。

不过在代码压缩方面, vite 选择的也是Terser。

对此,文档中有相关描述:

设置为 false 可以禁用最小化混淆,或是用来指定使用哪种混淆器。

默认为 Terser。

虽然 Terser 相对较慢,但大多数情况下构建后的文件体积更小。

ESbuild 最小化混淆更快, 但构建后的文件相对更大。

更多信息可以参考:https://cn.vitejs.dev/config/#build-minify

另外,如果你有留意, 就会发现一个现象:

  1. Esbuild, 使用 GO 写的。

  2. SWC, 是用 Rust 写的。

都不是用js写的。

未来前端的编译工具,大概也会往这个方向走, 要么用 Go 写, 要么用 Rust 写,而不是把这种能形成性能瓶颈的东西用 js 来实现。

还有一点需要提一下。

在文章开头的图中, 看起来 webpack5 的速度比 webpack4 要慢:

Webpack 构建慢的原因是什么

但这不代表 webpack 5 不好,大家不要误会啊。

webpack 5 里面 做了大量的优化, 甩掉了不少历史包袱。

有一些新特性还有非常有用的, 比如:

感谢各位的阅读,以上就是“ Webpack 构建慢的原因是什么”的内容了,经过本文的学习后,相信大家对 Webpack 构建慢的原因是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. webpack常用配置总览
  2. webpack是什么意思

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

webpack

上一篇:python中怎么利用多线程处理同一个全局变量

下一篇:使用numpy怎么生成数组的零值

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》