443 - 《分享:Rust 构建工具在蚂蚁的研发和落地》

发布于 2024年5月28日

上周末在 GIAC 上分享了《Rust 构建工具在蚂蚁的研发和落地》,这是这个分享上一版在蚂蚁内部分享的文字稿。结构差不错,但内容上可能有 30% 的出入,GIAC PPT 重新做过,但是偷懒不想重新整理新的文字稿了。

GIAC 上的 PPT 见: https://drive.google.com/file/d/1-Eawqp9Xa_oU0UTxrEzAu8Vcel4nnLYl/view?usp=sharing

注:
1、由于本文内容报名了今年 5 月的 GIAC 会议,所以很抱歉,本文档不能在会后分享给大家。

Hello,大家好。今天和大家分享的是《Rust 构建工具在蚂蚁的研发和落地》。这个工具名叫 Mako ['mɑːkoʊ],意为「最快的鱼」。我们做了一年,在内部已落地几百个应用,今天和大家分享下期间遇到的问题和收获的经验。

个人介绍。

陈成,花名云谦,Github 账号为 sorrycc,阿里 & 蚂蚁 15 年+老前端,是 Umi、Dva、babel-plugin-import 等开源库的作者,目前在蚂蚁集团负责中台前端框架 Bigfish 和基于 Rust 构建工具 Mako 的开发工作。此外,还有维护了发布了 100 多期的「MDH 前端周刊」和发布了 400 多篇文章的「前端日更知识星球」。个人在 React、框架开发、性能优化及前端工程化等领域相对比较专业,期待和您的交流。

我们做 Mako 经历了 3 个阶段,从 0 到 1(10m)、从 1 到落地(15m)、从落地到开源(5m)。今天就从这 3 个时间段和大家拆开了分享下。


从 0 到 1

Mako 的缘起要回到去年(2023 年)3 月,那会老板成立「体验科技小队」,立了 3 个项,分别是 Rust、SSR & RSC、AIGC。我领了 Rust 的部分,洋洋洒洒地写了个 RFC,《[[基于 Rust 的新前端研发态:RFC]]》。

现状是,1)《Rust 是 JavaScript 基建的未来》,前端社区的工具大多已经或将要用 Rust 重写,蚂蚁不进则退,2)我们有很多基于 webpack 的构建提速方案,但治标不治本。所以,我们需要用 Rust 询求构建速度问题的彻底解,同时这也会给我们带来更多可能性

此外,构建工具是第一个里程碑,我们的目标可能更大一些,期望整个框架都基于 Rust 重写。因为现在的框架都是元框架,除了构建,框架中还有大量编译相关的任务,只解构建可能对于开发者用户来说,体感没那么强。

但是,回到现实。我们知道了想要做成什么样(What),现在需要解 How 的问题,过程中就面临着很多问题。

  • 意义感,社区已经有了,我们为什么做
  • 人员有限,框架团队仅 3 人,现有工作也不能荒废
  • 团队全部 Rust 0 基础
  • 从 webpack 配置工程师到 webpack 研发工程师的角色转变
  • Less 由于 antd 的原因,内网大量应用,而 Less 无 Native 实现

第一步就是解 Why 的问题。社区已经有了 esbuild、turbopack、farm、rspack、swc-bundler(、rolldown)之后,为什么我们还要重头写一个?原因是复杂的,当你想写一个的时候,总是能找到很多理由。1)社区库的成熟度和需求匹配度(展开下…) 365 - 《Mako 开发日志(5) - Why Mako》,2)主动权,业务原因,我们会有大量定制需求,3)元框架是编译时框架,和构建耦合很深,4)我想(带)学(薪) Rust。

Farm 开发人员少,没大厂背书,落地少 edge case 会是个问题;Rspack 不喜欢其兼容 Webpack 的设计,兼容意味着权衡和潜在的性能消耗,既然重新用 Rust 写了,不如就更彻底一些;Turbopack 是最想和他摩擦出火花的一个,但无奈太封闭,商业公司的开源商业气息有点重,Next.js only,且当时只有 dev,同时也是我们太菜,看了好久他的代码没看懂。
365 - 《Mako 开发日志(5) - Why Mako》

第二步是解 Who 的问题。1)实线 + 虚线团队,虚线团队有好有坏,好处是补充人力,坏处是不稳定,业务有事就撤,所以 assign 大功能时需谨慎,撤了再找人顶上成本太大,2)Github 私库开发,优点是 Github 体验好,缺点是私库 CI/CD 的 Action 收费太贵,3)0 基础如何快速上手 Rust?个人的经验是 B 站视频快速打底、看电子书系统学习和深入、多实践、然后不懂问 AI(或 Mako 团队同学)。

302 - 《Rust 资料》
7 - 《资源整理:前端视角学 Rust》
364 - 《作为前端开发者,到底有没有必要学 Rust》

除了 Rust 的知识需要补充,我们还需要补充构建相关的知识。1)对于这个问题的功能层面,tooling.report 有比较全面的答案,我整理了 280 - 《构建工具应该包含哪些能力》。2)同时,我的习惯是万事从 Toy Version 开始,所以照例先写了个 Toy Bundler 来做下想法验证。(注:基于 JavaScript,那会还不会 Rust)。3)再有,就是像竞品学习,包括 Farm、Webpack、Rspack 和 Turbopack 等,前两个偏多一些。

用 Rust 实现构建器的流程如下(esbuild 的架构图)。

接着就是日复一日的研发阶段。调研、学 Rust、开发、修 Bug、提升性能,接着调研、学 Rust、开发…,基本上就是这样的循环。不得不说,Rust 的门槛还是挺高的,刚开始时,用 Rust 开发的速度可能只有用 JavaScript 的 1/10 到 1/5,随着深入,目前已达 2/3 到 3/4。

Mako x Less,内容太多了,可以先略。
木桶原理
352 - 《Mako 开发日志(4):Less》
[[难题:Rust 版 Less]]

2023.07.07,经过几个月的开发,Mako 发布了 Alpha。包含了构建工具所应该有的大部分功能,比如 resolve、load、transf

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。