[Tools] SWC Intro

news/2025/1/20 10:16:59/文章来源:https://www.cnblogs.com/Answer1215/p/18680852

SWC

SWC 英文全称为 Speedy Web Compiler,翻译成中文为“快速网页编译器”。

官网地址:https://swc.rs/

16894863108763

来看一下官方的介绍:

SWC is an extensible Rust-based platform for the next generation of fast developer tools. It's used by tools like Next.js, Parcel, and Deno, as well as companies like Vercel, ByteDance, Tencent, Shopify, and more.

SWC can be used for both compilation and bundling. For compilation, it takes JavaScript / TypeScript files using modern JavaScript features and outputs valid code that is supported by all major browsers.

中文的意思就是:

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

SWC 既可以用于编译,也可以用于打包。在编译方面,它接受使用现代 JavaScript 功能的 JavaScript / TypeScript 文件,并输出由所有主流浏览器支持的有效代码。

那么 SWC 的特点是什么呢?就一个特点:快。

看一看官方对于 SWC 速度的描述:

SWC is 20x faster than Babel on a single thread and 70x faster on four cores.

也就是说,当只使用一个 CPU 核心(即单线程环境)时,SWCBabel20 倍。而当使用四个 CPU 核心(即四核环境,能够进行并行处理)时,SWCBabel70 倍。

没错,SWC 对标的就是 Babel,力图成为 Babel 的替代品。而 SWC 之所以可以那么快,主要是由于以下几个因素:

  1. 编程语言:SWC 是用 Rust 语言编写的。Rust 是一种系统编程语言,它旨在提供内存安全性,无数据竞争,并且有着高效的性能。Rust 的执行速度通常比 JavaScript 快。

  2. 并行处理:Rust 具有优秀的并行处理和并发能力。当在多核 CPU 上运行时,SWC 能够有效地利用这些核心并行执行任务,从而大大提高了处理速度。

  3. 优化的设计:SWC 设计上对性能进行了优化。例如,它使用一次性遍历(single-pass traversal)来转换代码,这种方法比 Babel 使用的多次遍历更高效。

  4. 跳过不必要的工作:与 Babel 不同,SWC 可以跳过一些不必要的工作,例如不需要生成和处理 source maps,除非明确需要。

早期各种前端工具都是基于 Node.js 来写的,Node.js 本身只是一个 JS 的运行时,JS 本身又是一门单线程解释语言,所以 JS 的运行速度不会比像 Rust、Go 这种语言快。

这几年开始就有一种趋势,用其他的编程语言来编写前端工具,甚至还专门出现了一个词语 rustification(锈化),就是指使用 rust 语言来翻新已有的前端工具,从而提升工具的性能。

  • SWC:使用 Rust 编写的超快速的 JavaScript/TypeScript 编译器。它的目标是替代Babel
  • TurbopackVercel 声称这是 Webpack 的继任者,用 Rust 编写,在大型应用中,展示出了 10 倍于 Vite700 倍于 Webpack 的速度。
  • esbuild: esbuild 是由 Go 编写的构建打包工具,对标的是 webpack、rollupparcel 等工具,在静态语言的加持下,esbuild 的构建速度可以是传统 js 构建工具的 10-100 倍,就好像跑车和自行车的区别。
  • Rome: 是一个使用 Rust 编写的全栈工具链,它打算整合各种前端开发工具的功能,从而提供一个统一的、一体化的开发体验。Rome 的目标是替代或集成诸如 Babel、ESLint、Webpack、Prettier、Jest 等多个分散的工具。
  • Deno: 是一个使用 RustTypeScript 编写的 JavaScript/TypeScript 运行时,它的目标是成为一个更安全、更高效的 Node.js 替代品。

虽然编写这些工具的语言发生了变化,但是我们使用这些工具的方法是没变的:

  • API
  • CLI
  • 配置

API

新建一个项目 swc-demo,使用 pnpm init 进行初始化,安装依赖

pnpm add @swc/core -D

接下来在 src/index.js 中书写测试代码:

const greet = (name) => `Hello, ${name}!`;
console.log(greet("World"));

之后在项目根目录下创建 compile.js,在该文件中利用 swc 提供的 api 对文件进行编译

const swc = require("@swc/core");
const fs = require("fs");
const path = require("path");// 拼接路径
const codePath = path.resolve("src", "index.js");
const sourceCode = fs.readFileSync(codePath, "utf8");
const outDir = path.resolve(__dirname, "dist");swc.transform(sourceCode, {jsc: {target: "es5", // 设置目标JavaScript版本parser: {syntax: "ecmascript", // 设置源代码的语法},},}).then((res) => {// console.log(res.code)if (!fs.existsSync(outDir)) {fs.mkdirSync(outDir);}const outputFilePath = path.join(outDir, "index.js");fs.writeFileSync(outputFilePath, res.code);}).catch((err) => {console.error(err);});

CLI

首先需要安装相应的 CLI 工具

pnpm add @swc/cli -D

之后就可以在 https://swc.rs/docs/usage/cli 看到 swc 所支持的所有的 CLI 命令

然后在 package.json 中进行 CLI 的配置即可,例如:

"scripts": {// ..."swc": "swc src -d lib"},

配置

我们在使用 transform 方法的时候,第二个参数就是一个配置对象。

你可以在 https://swc.rs/docs/configuration/compilation 看到所有所支持的配置选项。

如果你没有配置文件.swcrc,那么会有一个默认的配置设置:

{//  这个配置项用于设置 JavaScript的 编译选项"jsc": {// 这个配置项用于设置解析器的选项"parser": {// 设置源代码的语法,可以是 ecmascript、jsx、typescript 或 tsx"syntax": "ecmascript",// 是否启用JSX语法"jsx": false,// 是否启用动态 import() 语句"dynamicImport": false,// 是否启用私有方法和访问器"privateMethod": false,// 是否启用函数绑定语法(::操作符)"functionBind": false,// 是否启用 export v from 'mod' 语法"exportDefaultFrom": false,// 是否启用 export * as ns from 'mod' 语法"exportNamespaceFrom": false,// 是否启用装饰器语法"decorators": false,// 是否在导出之前应用装饰器"decoratorsBeforeExport": false,// 是否启用顶级 await 语法"topLevelAwait": false,// 是否启用 import.meta 语法"importMeta": false,// 是否保留所有注释"preserveAllComments": false},// 设置转换插件,通常不需要手动设置"transform": null,// 设置目标 JavaScript 版本// 例如 es3、es5、es2015、es2016、es2017、es2018、es2019、es2020"target": "es5",// 是否启用宽松模式,这会使编译后的代码更简短,但可能不完全符合规范"loose": false,// 是否引用外部的 helper 函数,而不是内联它们"externalHelpers": false,// 是否保留类名,这需要版本 v1.2.50 或更高// 且 target 需要设置为 es2016 或更高"keepClassNames": false},// 这个配置项用于指示输入的源代码是否是模块代码。// 如果是,那么 import 和 export 语句将被正常处理// 否则,它们将被视为语法错误"isModule": false
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据迁移丨借助 AI 从 PostgreSQL 到 GreatSQL

数据迁移丨借助 AI 从 PostgreSQL 到 GreatSQL本文将介绍如何从 PostgreSQL 到 GreatSQL 的数据迁移,并运用 AI 协助迁移更加方便。迁移的方式有很多,例如:pg_dump:导出SQL文件,修改后导入 GreatSQL 数据库。 COPY:导出txt文本文件,导入 GreatSQL 数据库。 pg2mysql:从…

圆方树学习笔记

元方树。 下文除特殊强调外,所有图皆为无向图。 引入割点:在图中,删除某个点后,导致图不再连通的点。 点双连通:在一张图中,取两个点 \(u\)、\(v\),无论删去哪个点(除 \(u\)、\(v\) 自身外),\(u\)、\(v\) 都能连通,我们就说 \(u\) 和 \(v\) 点双连通。 点双连通分量…

WordPress产品导入后内容出现乱码,以及附属一些别的功能

效果图如下 该插件附带了一个可以把产品描述里面的超链接给去掉,以及有的产品图片点击会在地址栏上面显示图片的路径,在该插件可以进行关闭,并且替换成一个模态窗,还有对产品邮费展示进行了处理,到金额到达包邮的时候,别的邮费进行隐藏 下面是该插件源码目录结构duola …

如何利用甘特图进行高效管理?——附应用工具

通过快速创建甘特图并合理利用其进行项目管理,可以显著提升项目管理的效率和质量。同时,不断优化甘特图和项目管理流程也是实现持续改进的关键。甘特图通过横轴表示时间,纵轴表示任务,每个任务的开始和结束时间通过横向条形表示。甘特图可以帮助管理者对项目中的各个任务进…

互联网(internet)的基本组成

一般而言,互联网被认为由三个部分组成: Edge NetworkDevices and Endpoints: This part consists of all the devices at the periphery of the network that users directly interact with. It includes personal computers, laptops, smartphones, tablets, and various In…

WebRTC 笔记

目录通话建立流程特别提醒代码创建 RTCPeerConnection 对象获取本地摄像头/麦克风创建发起方会话描述对象(createOffer)连接的远程对等方属性(setRemoteDescription)建立一条最优的连接方式 WebRTC 允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(…

读量子霸权09电池

爱迪生、福特推动工业电气化,电池效率低是能源存储难题,量子计算机或助力电池设计与能源存储,锂空气电池、超级电池是候选技术,量子计算也应用于汽车设计。1. 能量 1.1. 爱迪生1.1.1. 爱迪生是工业和社会电气化背后不知疲倦的推动力1.1.2. 爱迪生青睐于电池1.2. 福特1.2.1.…

优化@Transactional事务性能(LazyConnectionDataSourceProxy)

背景 在项目开发中,使用 @Transactional 注解来管理事务非常方便,且优雅。但是也存在一个问题:长事务问题很多被 @Transactional 标记的方法,实际上并不需要进行数据库操作,或者说,它们在执行的很长一段时间内都不会真正触发数据库访问。举个例子,我们的业务逻辑可能如下…

ElasticSearch Java 使用

目录创建工程,导入坐标创建索引 index创建映射 mapping建立文档 document建立文档(通过 XContentBuilder)建立文档(使用 Jackson 转换实体)1)添加jackson坐标2)创建 Article 实体3)代码实现查询文档操作关键词查询字符串查询使用文档 ID 查询文档查询文档分页操作批量插…

IntelliJ IDEA 2024.3 Java开发工具

IntelliJ IDEA 2024.3 Java开发工具 JetBrains IntelliJ IDEA 2024 mac,是一款Java开发工具,IntelliJ IDEA 凭借无与伦比的 Java 和 Kotlin 支持脱颖而出。从一开始就支持尖IDEA 2024.3 中文版开发工具端语言功能,保持领先地位。IntelliJ IDEA 对您的代码了如指掌,利用这些…

AI应用实战课学习总结(6)分类算法分析实战

本文介绍了机器学习中的分类场景问题,常用的分类算法 以及 分类和回归的简单对比,最后通过一个医疗数据诊断分类的案例做了一次实战,相信对你理解分类应用应该有所帮助。大家好,我是Edison。 最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。 今…

深入浅出索引(上)

1.什么是数据库索引,索引是干什么用的? 对于数据库的表而言,索引其实就是它的“目录”。 2.索引的三种实现方式?(暂时介绍3种) ①哈希表索引:哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思…