Mako 试玩|编译速度6到飞起!

news2024/11/14 14:27:23

嗨!我是小谷,大家好久不见~

今天想和大家分享的技术是 Mako , 一款编译构建速度比 webpack 快 10 倍~100 倍的前端构建工具。

网上有传言将 Mako 比作前端脚手架里的 鲨鱼心脏 ,有了它,前端工程师工作的幸福指数可以提升好多倍,那么就让我们一起来看看 Mako 究竟有什么魅力吧!

什么是 Mako?

近年来,前端领域的脚手架层出不穷,前有开山鼻祖 Webpack , 后有 Turbopack、Rspack 等一些后起之秀。

新出的脚手架都会以 冷启动、热更新、冷构建 的耗时作为性能对比的佐证。

Mako, 是基于 Rust 的 极快 和 生产级 前端构建工具。

从官网的性能对比报告来看,相比于其他的前端构建工具,Mako 在 冷启动、热更新、冷构建 都有较好的表现:

冷启动根更新叶更新冷构建

知识科普: Root HMR 与 Leaf HMR 是什么关系?

Root HMR 指的是应用根组件的热模块替换,通常是对应用的最外层组件(通常是根组件)进行热替换更新,确保整个应用能够保持一致性和状态。


Leaf HMR 指的是更精细粒度的模块替换,通常是对具体组件或模块的热更新。它意味着某个特定的组件或模块在发生改变时,仅该组件或模块进行热替换,不影响其他部分的执行。

Mako 试玩

据 Mako 的核心作者 sorrycc 在文章中的介绍,针对 Ant Design Pro 全量项目的构建,Webpack 用时 16s,Mako 用时 3.9s,提速 4 倍。在此基础上,在 Ant Design Pro 全量项目的构建中,Mako 基本都是实时热更。

听起来效果是很辣,让我们一起来亲自实践一下:

Benchmark 作为热门的性能评估工具,内置了几个性能对比的项目,也是大家都在跑的 Turbopack 测试项目。

下图展示了 mako 、rsbuild 、farm 、vite 、webpack 五款前端构建工具在 冷启动 、根节点热更新 、叶节点热更新 、冷构建 、打包尺寸 几个方面的性能对比:

在这里插入图片描述

可以发现,针对同样的测试项目,webpack 冷启动耗时 6.5s , mako 仅需 1.1s !!!
除此之外,在 热更新 和 冷构建 方面,mako 的表现比 webpack 更是优异近 10 倍!!!

Mako 为什么这么快?

不难发现,在 Mako 的官网介绍中,一个显目的语言是 Rust ,Mako 编译构建如此之快的核心原因也是因为舍弃了传统的 JS/TS 语法,转而使用 Rust 来从 0 到 1 构建前端打包工具。

实际上,Rspack、Turbopack 也是基于 Rust 来实现的。
在这里插入图片描述

借用 Rust 官网中的 slogan:

A language empowering everyone to build reliable and efficient software.
一个使每个人都能够构建可靠且高效软件的语言。

很容易从中得出两个结论:
1.Rust 是一门语言
2.Rust 的核心竞争力是 安全可靠 & 性能出众


作为一门与 C 语言并列,可直接与操作系统交互的系统级编程语言,诞生于 2006 年,它的作者是 Mozilla 的工程师 Graydon Hoare 。


Graydon Hoare 发明 Rust 语言的初心是为了解决 C 和 C++ 所固有的安全问题,而在 Rust 正式对外发布前,Graydon Hoar 所在的团队花费了近 10 年的时间进行设计打磨。

更令人意想不到的是,自 2016 年起,Rust 就一直蝉联 Stack Overflow 年度最受欢迎的编程语言冠军。

Rust 为什么这么快?

借助网友们一句评价:一门编程语言极致的性能在于对计算机硬件资源的极致利用。

在此基础上,对计算机内存资源的极致利用,就是对极致性能的有力保障。

在众多编程语言中,关于内存管理可以大致分为两大阵营:

1.手动内存管理:代表语言是 C,C++ 等,它给开发者足够的自由度去掌控内存资源,但是它经常会带来一个问题 —— 开发者无法保障内存安全

2.自动内存管理:代表语言有 Java,Python,JavaScript 等,它通过专门的 GC 机制(垃圾回收器)让开发者不必关心内存回收问题,GC 会以一定频率检查和释放不再被使用的内存。但这种自动管理内存的机制也有一个天然的症结 —— GC 会损耗程序性能

如果有一门语言在没有 GC 机制的情况下,能够保证内存安全调用,即可将计算机内存资源的利用发挥到极致。这也是国内外众多追求极致性能的工具选择使用 Rust 的原因:

Rust 提出的所有权机制,实现了没有 GC 的自动内存管理模式。

在 Rust 的语法中,一个值始终只被一个变量所拥有,即使是通过引用赋值的方式,存储于计算机堆中的值也只与最后被赋值的栈变量关联,而之前的栈变量则会回归到未初始化的状态。

在这里插入图片描述

Rust 为什么可以编译为 TS/JS 的代码?

Rust 和 JavaScript 本质是两种语言,为什么可以用 Rust 来编写前端构建工具?.rs 的文件为什么可以转译成 .ts 文件和 .js 文件?这其实得益于 WebAssembly(Wasm)技术的支持。

WebAssembly 是一种可移植、高性能的二进制格式,可在 Web 浏览器中执行。

Rust 具有对 WebAssembly 的良好支持,通过将 Rust 代码编译为 WebAssembly 格式,即可在现代的 Web 浏览器中运行。

在此基础上,Rust提供了 wasm-bindgen 工具,可以帮助将 Rust 代码编译为 WebAssembly ,并为WebAssembly 模块提供 JavaScript 和 TypeScript 绑定。

这使得 Rust 编写的代码可以与 JavaScript 代码进行无缝互操作,包括直接调用 JavaScript 函数,使用 JavaScript 对象,以及被 JavaScript 调用。

学习过 Webpack 的同学应该对 Babel 不陌生,Webpack 本质是一个打包机,可以将非 js 的语言转换为 js 的语言,而 Babel 则可以将高级的 JS 语法转换为浏览器可以识别的低级别 JS 语法。

在 Rust 中,也有这样的编译工具:SWC
在这里插入图片描述

据 SWC 在官网的介绍来看,SWC 在单线程上的编译速度比 Babel 快 20 倍,如果在 4 核设备上开启并行计算,其执行速度将是 Babel 的 70 倍!

感兴趣的朋友也可以自己测试玩玩~

参考文档

1.https://zhuanlan.zhihu.com/p/705866602
2.https://makojs.dev/

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

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

相关文章

重塑未来:碳捕集与存储(CCS)的革命性突破与可持续发展路径

随着全球气候变化的加剧,减少二氧化碳(CO₂)排放已成为应对气候变化的关键任务之一。碳捕集与存储(CCS)技术因其能够直接从源头捕捉CO₂并将其安全存储,避免其进入大气层,而受到广泛关注。CCS被…

QT做一个USB HID设备识别软件

1.下载 HidApi库:GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C 2.pro文件添加 DEFINES - UNICODE LIBS -lsetupapi 3.建立三个对象 HidApi hidApi;HidDevice hidDev;//HID设备HidDeviceList devList;//HID设备列表 4.对 HID 设备进…

大连网站建设手机网页页面设计

在现代社会,随着智能手机的普及,越来越多的用户选择通过手机访问网站,这使得移动端网页设计的重要性日益凸显。大连作为一个经济和文化中心,网站建设行业也在不断发展。针对大连的网站建设,手机网页页面设计需要特别注…

在街子古镇游的台湾自媒体人

刚刚看到《网易首页 > 网易号》于昨(8月31日逾23时)天深夜发布《崇州看点》的新闻报道《台湾自媒体人天府游记,被崇州的这个地方深深吸引……》,虽觉得新鲜但并不感到惊奇。因为在去年12月5日,《人民日报海外版》和…

CAS单点登录说明文档

CAS单点登录说明文档 目录 1. 下载CAS 2. 下载xmlsectool 3. 安装xmlsectool 4. 打包CAS 5. 连接服务器 6. 安装Tomcat服务器 7. 创建CAS程序 8. 修改CAS界面 9. 修改CAS服务端口 10. 修改CAS服务名称 11. 修改CAS日志路径 12. 创建数据库 13. 启动CA…

PD快充协议

表格中电压电流档位的电流都是在该电压下输出的最大电流。在充电的过程当中,充电器输出的电流会根据充电设备的需求进行动态调整,不是说握手了20V 5A档位充电器输出的电流就一直都是5A。 这个屏幕显示了几种常见的快充协议及其支持的电压、电流和功率。这…

kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 calico.yaml kubernertes-dashboard.yaml 1. 安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 10台机器,操作系统Openeuler22.03 LTS SP4硬件配置&…

2024年【制冷与空调设备运行操作】找解析及制冷与空调设备运行操作实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作找解析参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总,相对有效帮助制冷与空调设备运行操作实操…

【大模型】Agent基础知识

目录 1. 基本框架2. 常见推理模式2.1 ReAct: Synergizing Reasoning and Acting in Language Models2.2 Reflection2.3 LATS: Language Agents Tree Search 3. 微调3.1 全模型微调(Full Model Fine-Tuning)3.2 冻结部分层微调(Layer-wise Fin…

IPC核间通信底层原理:以PL320为例

什么是IPC核间通信 讲到IPC可能很多同学想到的是InterProcess Communication进程间通信,但是本文主要是讲另一种Inter-processor communication,处理器间通信,也叫核间通信,名字很像不要搞混。 为什么需要核间通信 现在的芯片系统非常复杂…

企业微信dll,最新版dll

1.基础信息获取,如登录用户信息、联系人列表、群组列表等。 2.联系人操作,如修改备注、添加删除联系人等。 3.群操作,如创建群聊、邀请添加成员、修改群信息等。 4.消息发送,支持文本、图片、文件、位置等不同类型消息的发送。 5.支持通过DLL调用实现自动化功能,如机器人自动回…

Python一些可能用的到的函数系列131 发送钉钉机器人消息

说明 来自顾同学的助攻 钉钉机器人可以用来发送一些重要的系统消息,例如磁盘将满等等。原本还可以有更强的功能,就是监听群里的消息,然后做出反应,不过这个好像要买企业版,贵的毫无意义。 钉钉发消息有几种模式&#…

python中pip源配置

文章目录 1、前言2、pip下载源配置 1、前言 conda环境的源配置,相关博客有很多,这里不再赘述。在我使用梯子后,使用pip进行库安装,总是出现错误情况,如下所示: 2、pip下载源配置 因此,在这里进…

Django+Vue农产品销售系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

「Claude3.5」全面超越「gpt-4o」,我用它做了个贪吃蛇,玩了一整天!

大家好,我是凡人。 就在昨天晚上Anthropic在X上连续发了4条动态来高调宣布他们的Claude 3.5 Sonnet中杯的版本已经全面向公众开放使用,大批的技术博主连夜测试,纷纷给出的不低的评价。 而这还仅仅是开胃小菜,官方宣称今年晚些时候…

37集【重要】编译ESP-RTC工程并运行在01-RTC开发板中

37集【重要】编译ESP-RTC工程并运行在01-RTC开发板中 开发板样子这样的: 还有配套的外壳: 开发板介绍文档如下,有需要的可以联系三哥,三哥介绍这位大拿给你: https://www.kdocs.cn/l/cqAyZ0T3Q06Y 我们把d:\Espre…

单片机编程魔法师-消息处理

消息机制 消息处理的编程思路是当某件事产生后只发送一条事件产生消息以通知相应执行机构执行的一种编程思路。 消息定义 什么是消息,消息是一个指示,可以是数字,字符串,字符或者是任何形式的其他标识符 消息定义的形式与消息…

模型 冯/诺依曼思维模型

系列文章 分享 模型,了解更多👉 模型_思维模型目录。分解问题,创新整合,高效解决。 1 冯/诺依曼思维模型的应用 1.1 景区创建5A级旅游景区提升规划 在面对如何将某个景区创建为5A级旅游景区的复杂任务时,可以采用冯诺…

MySQL7 SQL执行顺序、SQL语句执行顺序、学生选课表练习

文章目录 一、SQL执行顺序二、MySQL执行过程三、SQL执行顺序四、学生选课表练习创建表1. 查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩3. 查询在 SC 表存在成绩的学生信息4. 查询所有同学的…

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 <locale.h>本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 S…