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


相关文章
|
1月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
1月前
|
移动开发 前端开发 Android开发
mPaaS 常见问题之移动开发平台 mpaas的H5 前端 Kylin 框架引入vant后包特别大如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
|
1月前
|
搜索推荐 Go 开发者
Go模块与依赖管理:构建稳定、可维护的项目生态
【2月更文挑战第9天】Go模块是Go语言从1.11版本开始引入的一个新的依赖管理工具,它改变了以往通过GOPATH管理项目依赖的方式,为Go开发者带来了更加灵活、高效的依赖管理方式。本文将深入探讨Go模块与依赖管理的概念、使用方法和最佳实践,帮助读者更好地理解和应用Go模块,构建稳定、可维护的项目生态。
|
1月前
|
缓存 前端开发 JavaScript
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
|
1月前
|
开发者 索引 容器
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
147 0
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
|
8月前
|
缓存 Java Maven
深入理解Gradle构建系统的工作原理
深入理解Gradle构建系统的工作原理
236 0
|
11月前
|
数据安全/隐私保护 Android开发
浅谈build.gradle写法,促使我们更高效开发
浅谈build.gradle写法,促使我们更高效开发
134 0
|
存储 缓存 JavaScript
Vuejs设计与实现 —— 编译层面的优化
Vuejs设计与实现 —— 编译层面的优化
76 0
Vuejs设计与实现 —— 编译层面的优化
|
前端开发 JavaScript API
Vite 2.0 正式发布!依赖预构建,CSS 分割等众多新特性到来
Vite(法语中“快”的意思,发音为 /vit/)是一种新型 Web 开发构建工具。把它想成一个更轻、更快的预配置开发服务器 + 打包的组合工具。它利用了浏览器 native ES modules[1] 的支持,还有如 esbuild[2] 等编译工具来提供时髦酷炫的本地开发体验。
|
开发框架 JavaScript 前端开发
新一代组件/库构建工具 father 4 RC 发布啦 🎈
新一代组件/库构建工具 father 4 RC 发布啦 🎈
540 0
新一代组件/库构建工具 father 4 RC 发布啦 🎈