用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

高级前端‬进阶

1.什么是Babel?

Babel 可以将最新的 JavaScript 代码(例如 ES6)转换为旧版本浏览器支持的 JavaScript,它甚至可以转换 TypeScript

Babel 根据开发者定义的配置读取源代码,并编译更新的 JavaScript 功能,例如:箭头函数等。 Babel的代码转换主要包括三个核心流程:

  • 解析器Parser:Babel 的解析器获取 JavaScript 代码并将其转换为抽象语法树 (AST),这是计算机可以理解的源代码结构
  • 遍历器Traverser:Babel 的遍历器获取 AST,遍历它并将其修改为在 Babel 配置中定义的预期代码
  • 生成器Generator:Babel 的生成器会将修改后的 AST转换回常规代码

整体转换流程如下图所示:

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

图片来源: https://www.sitepoint.com/understanding-asts-building-babel-plugin/

2.什么是 SWC

SWC 是一个可扩展的基于 Rust 的平台,用于下一代快速开发工具。 Next.js、Parcel 和 Deno 等工具以及 Vercel、字节跳动、腾讯、Shopify 等公司都在使用 SWC。

Github 上,SWC 已经有超过 26.3k 的 star 和 1k 的 fork,每周的平均下载量达到了 1983k。目前有超过 6.2k 的项目使用 SWC、项目贡献人数也达到了 200 ,增长势头非常迅猛。

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

SWC 可用于编译和打包工作,是一个超快速的 JavaScript 编译器。 对于编译,SWC 读取 JavaScript / typescript 文件,并输出所有主流浏览器都支持的代码。在性能上,SWC 比其他打包方案具有明显的优势。

3.SWC从Rust处获得了什么?

SWC 也是 JavaScript 的转译器,它是用 Rust 编写的,比 Babel 快得多。 Rust 以其性能优势、可靠性而著称,Rust鼓励企业使用它重写部分、甚至全部代码。

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

例如以下非常成功的迁移Rust的示例:

  • Firefox 决定重写其名为 Quantum css 的 CSS 渲染器并获得显著的性能改进
  • Tilde 在 Rust 中重写 Java HTTP 的某些部分,将内存使用量从 5GB 减少到 50MB 获得了巨大的性能提升

Rust 如此高效的原因之一是它处理垃圾收集的方式,这是一种内存管理方法,即及时释放不再需要的内存资源。 由于 Rust 在编译时决定哪些内存资源不再需要,因此带来性能改进。

众所周知,代码转译是一个昂贵的过程,这就是为什么用 Rust 编写的转译器性能更高的原因。

3.如何使用SWC

可以将SWC看做一个包,可以从 NPM 包管理器安装。 首先,在目录的根目录中运行命令:

// 使用 `cd` 转到正确的目录,然后运行mkdir swc_project//实例化package.jsonnpm init// 安装swc core和clinpm install --save-dev @swc/core @swc/cli

通过运行以上代码就可以安装 SWC core和 CLI。 核心包将帮助进行构建设置,而 CLI 包可以在终端中使用命令运行。本文专注于使用 CLI 工具来转换 JavaScript 文件。 假设在目录的根目录中有以下 JavaScript 文件:

// 文件名:async.jsconst fetch = require("node-fetch");async function getData() { let res = await fetch("https://feadvance.dev.com/todos/1"); let json = await res.json(); console.log('data', json);}getData();// 调用函数

可以运行以下命令进行转译:

// 运行此命令会将转换后的数据发送到标准输出// 并将在终端中打印出来npx swc async.js// 运行这个将创建一个名为 `output.js` 的新文件// 其中包含转换后的数据npx swc async.js -o output.js// 运行此命令将创建一个名为 transpiledDir 的新目录// 并将转译原始目录中的所有文件npx swc src -d transpiledDir

现在如果希望将 SWC 作为一个工具包含在构建系统中。此时,需要使用 Webpack 作为更高级和可配置的构建器。下面是一个简单的package.json配置文件内容:

{ "name": "swc-project-demo", "version": "1.0.0", "scripts": { "build": "rm -rf ./dist && webpack", "start": "webpack-dev-server" }, "license": "MIT", "devDependencies": { //开发依赖 "@swc/core": "^1.1.39", "css-loader": "^3.4.0", "HTML-loader": "^0.5.5", "swc-loader": "^0.1.9", // ...其他配置项 }, "dependencies": { // 依赖项 ... }}

下面是用于构建和启动应用程序的配置,存储在 webpack.config.js 文件中,Webpack 会自动获取该文件。

  • output:为 Webpack 设置名称和位置以输出包、资产和文件,包括已转译的文件
  • devServer:通过此配置为 Webpack 应用程序提供服务,是告诉 Webpack 从何处提供内容以及定义一个端口来侦听请求
  • HTMLWebpackPlugin:定义这个插件以简化包含 Webpack 包的 HTML 文件服务过程

但此配置中最重要的部分是 swc-loader,它允许转换带有 .js 或 .JSX 文件扩展名的 JavaScript 文件:

// 下面是webpack配置module.exports = { mode: "development", output: { path: path.resolve(__dirname, './dist'), filename: 'index_bundle.js' }, // 是告诉 Webpack 从何处提供内容以及定义一个端口来侦听请求 devServer: { contentBase: path.join(__dirname, 'dist'), compress: true, port: 9000 }, module: { rules: [ { test: /.jsx?$/ , exclude: /(node_modules|bower_components)/, use: { // `.swcrc` in the root can be used to configure swc loader: "swc-loader" } }, { // 不同loader配置 test: /.html$/, use: [ { loader: "html-loader", options: { minimize: true } } ] }, { test: /.scss/i, use: ["style-loader", "css-loader", "sass-loader"] } ] }, plugins: [ //定义这个插件以简化包含 Webpack 包的 HTML 文件服务过程 new HTMLWebpackPlugin({ filename: "./index.html", template: path.join(__dirname, 'public/index.html') }) ]};

通过在 Webpack 配置中设置 swc-loader,已经完成了转译 JavaScript 文件的一半。 但是,仍然需要指示 SWC 如何转换文件。SWC 通过在根目录中定义一个名为 .swcrc 的配置来进行能力扩展。

在配置中可以使用正则表达式,以仅匹配具有 .ts 文件扩展名的文件。 此外,通过 jsx.parser 配置,指示 SWC 使用哪个解析器进行转译(可以是 typescript / ecmascript)。

// .swcrc{ "test": ".*.ts$", "jsc": { "parser": { "syntax": "typescript", // 转移文件语法 "tsx": false, "decorators": true, "dynamicImport": true } }}

现在,假设想在上面的 webpack SWC 示例中使用 React,可以使用一个名为 .jsx 的特定文件扩展名来编写 React 组件:

// App.jsx 组件// 全局 dependenciesimport React from 'react';import ReactDOM from 'react-dom';// APP组件const App = () => { return <h1>我的 SWC 应用程序</h1>;};ReactDOM.render(<App />, document.querySelector("#root"));

通过 Webpack 提供此文件需要已经拥有并在上面定义的正确的 webpack 加载程序。 它还需要 .swcrc 文件中的正确转译设置。 现在通过这种方法,可以使用现代 JavaScript (ES2019) 的最新功能,并在转译时支持 .jsx 文件。 此外,如果 React 项目需要额外的转译设置,可以自有配置:

// .swcrc 自行配置扩展{ "jsc": { "parser": { "syntax": "ecmascript", "jsx": true // 支持JSX } } }

4.Babel 与 SWC 速度对比

4.1 同步场景比较

首先,以一种人工方式进行比较,即以同步方式运行 Babel 和 SWC 的代码转换。 众所周知,JavaScript 是单线程的,在实际应用程序中不可能以异步方式运行大量计算。 但这仍然会给出一个速度指标。 下面的基准测试是在单核 CPU 上运行(由 SWC 项目的维护者执行的测试):

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

尽管 SWC 的 ES3 转换过程成本更高,但与 Babel 相比,SWC 的转译速度提升明显。

4.2 异步场景比较

下面想对更现实的场景进行基准测试,即针对 await Promise.all() 运行示例,这是处理 JavaScript 操作的更昂贵、真实的场景。 在这个基准测试中,CPU 内核的数量和并行计算开始发挥作用。 在运行的另一个基准测试中,进行了两个实验。 两者都使用了具有 8 个 CPU 内核且并行度为 4 的机器。

第一个实验运行了 4 个Promise:

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

第二个实验运行了 100 个Promise:

用 SWC 替换 Babel !速度提升20x~60x!(sw换单位)

可以从这些数字中发现: Babel 在异步操作中的性能正在下降,因为 Babel 在事件循环上工作。 这与 SWC 形成对比,SWC 在工作线程上运行并且可以很好地随着 CPU 内核的数量进行扩展。

总的来说,看到这SWC、Babel两种工具之间存在明显的速度差距, SWC 在单线程上比 Babel 快 20 倍左右,而在多核异步操作过程中快 60 倍左右。

本文总结

本文主要和大家介绍下SWC,即一个使用Rust编写的Babal替代品。文章从什么是Babel、什么是SWC、SWC使用、SWC与Babel性能对比等几个角度展开。相信通过本文的比较,大家对选择SWC还是Babel都已经比较清楚了。因为篇幅有限,如果有兴趣,文末的参考资料提供了大量优秀文档以供学习。

参考资料

Why you should use SWC (and not Babel)

https://dev.to/this-is-learning/what-is-babel-and-swc-49cp

https://blog.csdn.net/feiyanaffection/article/details/125599084

https://blog.csdn.net/csdnnews/article/details/121241393

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年5月11日 上午9:46
下一篇 2023年5月11日 上午9:56

相关推荐

  • 项目预期经济、社会效益

    项目预期经济、社会效益 近年来,随着社会经济的不断发展,越来越多的企业和个人开始关注项目的经济效益和社会效益。在项目决策过程中,经济、社会效益的平衡是非常重要的,只有同时考虑到这些…

    科研百科 2024年12月1日
    5
  • 中国数字服务暨服务外包领军企业推介会在武汉举行(数字中国服务联盟)

    第十二届中国国际服务外包交易博览会期间,中国数字服务发展趋势研讨会和中国数字服务暨服务外包领军企业推介会于2023年3月21日下午在武汉举行,本次会议由中国国际投资促进会主办,围绕…

    科研百科 2023年5月24日
    366
  • 低代码 表格 微信 发提醒信息

    低代码表格和微信提醒功能助力企业提升工作效率 随着现代数字化办公的普及,越来越多的企业开始使用低代码表格和微信提醒功能来提高工作效率和员工满意度。这些工具可以帮助企业轻松实现各种流…

    科研百科 2024年10月22日
    0
  • 科研经费管理流程图,管理项目变更的概述(科研项目管理系统流程图)

    项目变更是不可避免的,并且每天都会发生。可能会存在多种形式的变更,包括: 出现计划外的任务并需要从控制日志中记录和管理。 出现需要对计划工作进行重新排序以避免影响项目结束日期的障碍…

    2022年7月28日
    290
  • access合同管理

    Access合同管理: 实现数字化合同管理的最佳方法 随着数字化时代的到来,合同管理已经成为了企业管理中不可或缺的一部分。然而,传统的合同管理方式不仅效率低下,而且容易受到各种因素…

    科研百科 2024年8月20日
    34
  • 北京 工会经费规定

    北京工会经费规定 北京工会经费规定是指北京市各级工会组织在组织会员参加工会活动时所使用的经费的管理办法。北京市工会经费规定自1996年实施以来,对于保障北京市各级工会组织和会员的合…

    科研百科 2024年10月22日
    2
  • 被阿里、腾讯等互联网巨头疯抢的“低代码”,到底牛在哪儿?(这四个才是真正的低代码平台)

    随着疫情的出现,从去年开始,许多企业意识到了线上办公的重要性,也让“低代码”这个词火了起来! 目前,亚马逊、微软、阿里、腾讯等国内外巨头公司都已入局。微软对于低代码的评价,更是宣称…

    科研百科 2024年1月2日
    144
  • 管理系统项目背景介绍

    管理系统项目背景介绍 管理系统项目是一种用于管理组织内部各种活动的系统。这些系统可以帮助组织提高效率,降低成本,并提高员工的工作满意度。管理系统项目通常涉及多个方面,包括财务管理,…

    科研百科 2024年12月13日
    0
  • 「流程十日谈」第四谈:流程与经营管理

    作者:牛东方(益友会-河南分会) 《流程十日谈》系广东精益管理研究院流程管理专家牛东方老师的特约专栏,全文共十篇,本次为第四篇。 一、经营管理四大难 在企业经营管理过程中,存在很多…

    科研百科 2022年12月2日
    673
  • 建设工程项目管理pdf

    建设工程项目管理 PDF 建设工程项目管理 PDF 是一个非常重要的工具,可以帮助项目经理和技术人员更好地管理项目,确保项目按时、按预算、按规格完成。在这个 PDF 文件中,我们将…

    科研百科 2024年5月28日
    93