Umi 4 特性 04:build 阶段的构建提速

简介: Umi 4 特性 04:build 阶段的构建提速

🙋🏻‍♀️编者按:本文是蚂蚁集团前端工程师云谦关于 Umi 4 新特性系列分享的第四篇 - build 阶段的构建提速,欢迎享用~


第一篇👉🏻 Umi 4 特性 01:MFSU V3,比 Vite 还要快

第二篇👉🏻 Umi 4 特性 02:React Router 6 和新路由

第三篇👉🏻 Umi 4 特性 03:默认最快的请求


构建提速不只是 dev 阶段的 MFSU,还要考虑流程上 build 阶段的构建。build 阶段的构建相比 dev 阶段,会做很多额外的事,比如 js 压缩和 css 压缩、tree-shaking、code-splitting,同时对于依赖编译和缓存的利用方式也会不同。所以优化手段也会大不同。

esbuild


虽然构建提速没有银弹,但 esbuild 是这个时期的大杀器。


JS 压缩之前默认是 terser,Umi 4 之后默认是 esbuild。原因在《彻底告别编译 OOM,用 esbuild 做压缩器》有过介绍,除了快,还可彻底解压缩导致的 OOM 问题,缺点是相比 terser 尺寸会增加 10%。同时压缩方式还支持 terser、uglifyJs、swc,支持不同场景,比如针对不支持 es6 的场景,选 uglifyJs 可以在遇到高级语法时主动抛错。


export default {  jsMinifier: 'uglifyJs',  jsMinifierOptions: {},}


CSS 压缩之前默认是 cssnano,Umi 4 之后默认也是 esbuild。相比 cssnano,用 esbuild 压缩 CSS 速度提升 6 倍,而尺寸仅增加约 1%。同时也可通过配置切换回 cssnano,以及尝试我们试验性支持的 parcelCSS。

export default {  cssMinifier: 'parcelCSS',  cssMinifierOptions: {},}


esbuild 不仅用于压缩,还被用到 JS/TS 文件实时编译、import/export 分析、测试等环节。JS/TS 文件实时编译是为了让配置、MOCK 等文件支持 TypeScript 语法,所以会通过 require hook 的方式,在遇到 .ts 文件时自动用 esbuild 编译;import / export 分析通常用 es-module-lexer 分析,但由于他不支持 jsx,所以会用 esbuild 先编译到 esm 格式再给 es-module-lexer 使用Umi 4的测试默认用 esbuild 作为 js transformer,相比 ts-jest 快非常多,支持通过配置切换到 swc 或 ts-jest。


依赖编译


通常一个包含 600 文件的项目,会有 6000 文件的依赖。这也是为啥依赖编译速度很大程度上决定了项目构建速度。webpack 的依赖编译是个绕不开的点,因为就算我们什么都不配,webpack 也会通过 ast 的方式分析 import/export 等信息。


Umi 4 删除了 nodeModulesTransform,不会再做 node_modules 的全量 babel 编译,开发者需要手动找出使用了高级语法的依赖,手动配置。之前开启的项目通常是出于支持 es5 的考虑,而全量开启是比较偷懒的做法,但带来的问题是后续持续的构建时间消耗。


externals 是绕过 webpack 依赖编译的好办法,所以之前 yuyan 有推出 bmwAutoExternals 配置,但缺点是本地无法验证。dev 跑完没问题而流程上 build 完出问题的场景,一线开发者完全无法定位问题。Umi 4 会解这个问题,让本地也可做 bmwAutoExternals 的验证。


Umi 4 默认 webpack 5,而 webpack 5 是具备物理缓存功能的,这是相比 Vite 等其他工具非常大的优势,流程上也值得好好利用。Smallfish 之前就接入了基于迭代的构建物理缓存功能,Umi 4 也会跟上,在流程上做缓存的校验、下载和上传,让流程 build 进一步提速。注:这个 Remote Caching 的机制之后还会用到 MFSU 上,让依赖缓存的 invalidate 更精确。


参考:
https://zhuanlan.zhihu.com/p/139219361  

彻底告别编译 OOM,用 esbuild 做压缩器
https://github.com/vitejs/vite/pull/4371  

Vite 使用 esbuild 压缩 CSS 的 PR


相关文章
|
资源调度 前端开发 算法
前端依赖版本重写指南
感谢神奇的 Semver 动态规则,npm 社区经常会发生依赖包更新后引入破坏变更的情况(应用没有使用依赖锁的话),而应用开发者就要在自己的依赖声明里先临时绕过,避免安装到有问题的版本,如果是一级依赖,只需要改 package.json 的声明就可以了,但如果是子依赖,就需要进行版本重写(overrides/resolution)了。本文是一篇针对版本重写功能的指南性文章,当你遇到如下的问题时,就可以按照对应的依赖重写语法,解决这些依赖问题了。
8708 1
前端依赖版本重写指南
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 19: 体验最流行的开源企业ERP软件 odoo
本文主要教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核.
1597 2
src和href的区别是什么?
src和href的区别是什么?
720 0
|
前端开发 开发者
Umi 4 特性 02:React Router 6 和新路由
Umi 4 特性 02:React Router 6 和新路由
1576 0
|
JavaScript 前端开发 HTML5
PDF转图片,PDF转JPG/PNG,完全由JS实现
原理 使用pdf.js预览图片,pdf.js将pdf通过canvas将每一页渲染出来,然后我们通过canvas的toDataURL方法保存为jpg或png格式。pdf.js是Mozilla开源的一个js库,无需任何本地支持就可以在浏览器上显示pdf文档。
16693 1
|
JavaScript 算法 安全
基于 WebWorker 的 WebAssembly 图像处理吞吐量深度优化指南
本文深入探讨了基于 WebAssembly (WASM) 和 WebWorker 的高性能图像处理技术,通过优化线程架构与内存管理,实现 4K 图像处理性能比纯 JS 提升 23 倍,同时保持界面流畅(60fps)。文章从技术演进、流水线设计到内存管理实战技巧全面解析,并提供性能瓶颈分析与调优方法。实验表明,在 4K+ 分辨率下,“计算靠近数据”策略可进一步提升性能 40%。最终,方案在生产环境中达成 8K 实时处理 (<30ms/帧),展现浏览器端图像处理的强大潜力。
756 12
|
Web App开发 监控 前端开发
前端必备浏览器调试工具
【8月更文挑战第19天】前端必备浏览器调试工具
985 0
|
Web App开发 SQL 前端开发
前端页面加载性能指标之LCP
本文介绍了 Largest Contentful Paint (LCP),一种衡量网页加载性能的指标,专注于视口内最大图片或文本块的完全渲染时间,旨在提升用户对主要内容加载速度的感知。文章还探讨了LCP的测量方法和优化策略,如图像优化、懒加载等,以帮助改善网页性能。
2314 5
|
设计模式 算法 Java
16.迭代器模式设计思想
本文详细介绍了迭代器模式的设计思想、原理、结构及应用场景,通过Java代码示例解析了迭代器模式的具体实现过程,并讨论了其优缺点及适用环境。迭代器模式通过提供统一的遍历接口,简化了集合对象的访问,支持多种遍历方式,同时保持了良好的封装性和灵活性。文章还提供了丰富的资源链接,帮助读者深入理解和应用设计模式。
346 7
|
网络协议 算法 数据安全/隐私保护
HTTP2和HTTP3区别?HTTP2有什么缺点?
总的来说,如果把HTTP/2比作是优化过的汽车,那HTTP/3就像是直升飞机,它不仅飞得快,而且即使前面有障碍也不会轻易停下。想要网站速度更快,HTTP/3无疑提供了更好的选择。
1677 3