SWC介绍

news/2024/11/9 5:07:42/

SWC介绍

我们来看一下swc的官方介绍:

SWC (stands for Speedy Web Compiler) is a super-fast TypeScript / JavaScript compiler written in Rust.

swc的出现其实很大一部分原因是要替换掉工程中的babel,所以babel有的功能他几乎都有。

与babel最大的区别可能就是: swc is super-fast

swc官网中还有这样一句话,体现了他的速度:

img

除了swc的官方宣传外,Next.js基于swc实现了一个Rust编译器,用来解析编译、打包代码。下面是Next.js结合swc之后给出的一个数据:

img

所以从上面这些数据也可以简单看出来swc的优势:可以提高开发效率,提升开发体验

Github

SWC 开源地址
这是一位名叫 kdy1 的韩国97年的小伙子开源的,很牛逼呀!
在这里插入图片描述

swc原理分析

(1)新建一个 debug-swc 项目

$ cargo new debug-swc
$ cd debug-swc

目录结构如下:

debug-swc
├── .gitignore
├── Cargo.toml
└── src└── main.rs

(2)添加依赖
Cargo.toml 文件,[dependencies] 配置项下面添加如下内容:

swc_ecma_parser = "0.31.2"
swc_common = "0.7.0"
swc_ecma_ast = "0.26.0"
swc_atoms = "0.2.2"

在这里插入图片描述

(3)新增 test.js 文件
根目录下的这个文件,用于 debug swc 的解析之用,内容如下,

const i = 1;

(4)编写 src/main.rs
官方例子 Crate: swc_ecma_parser 几乎不用做任何修改。

为了能展示 swc 解析 JavaScript 代码的结果,我增加了一个 get_identifier_name 函数,用于获取 test.js 代码中的变量名 i

extern crate swc_common;
extern crate swc_ecma_parser;use std::path::Path;
use swc_atoms::JsWord;
use swc_common::{errors::{ColorConfig, Handler},sync::Lrc,SourceMap,
};
use swc_ecma_ast::{Decl, Module, ModuleItem, Pat, Stmt};
use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};fn main() {swc_common::GLOBALS.set(&swc_common::Globals::new(), || {let cm: Lrc<SourceMap> = Default::default();let handler = Handler::with_tty_emitter(ColorConfig::Auto, true, false, Some(cm.clone()));let fm = cm.load_file(Path::new("./test.js")).expect("failed to load test.js");let lexer = Lexer::new(// We want to parse ecmascriptSyntax::Es(Default::default()),// JscTarget defaults to es5Default::default(),StringInput::from(&*fm),None,);let mut parser = Parser::new_from(lexer);for e in parser.take_errors() {e.into_diagnostic(&handler).emit();}let module = parser.parse_module().map_err(|e| {// Unrecoverable fatal error occurrede.into_diagnostic(&handler).emit()}).expect("failed to parser module");if let Ok(identifier_name) = get_identifier_name(&module) {println!("identifier name: {}", identifier_name);}});
}fn get_identifier_name(module: &Module) -> Result<&JsWord, ()> {for module_item in &module.body {if let ModuleItem::Stmt(Stmt::Decl(Decl::Var(var))) = module_item {for decl in &var.decls {if let Pat::Ident(identifier) = &decl.name {return Ok(&identifier.id.sym);}}}}Err(())
}

src/main.rs 的完整源码可以看这里:github: debug-swc/src/main.rs

(4)来看一下执行结果

$ cargo run

执行 cargo run 会先进行 cargo build,最终结果如下,
在这里插入图片描述

我们经过解析 AST 从 test.js 源码中拿到了变量名 i


参考文章:
swc–babel的代替者
简单使用SWC
新一代构建工具
SWC体验
编译工具SWC


http://www.ppmy.cn/news/637713.html

相关文章

全文剧透:Come And See |《最后的生还者2》

昨天&#xff0c;当我望着艾莉那双映在电视机屏幕上的布满恐惧与愤怒的眸子时&#xff0c;思绪无法遏制地回到了我把一张表皮印着中年男人和小女孩的光碟从印刷极其简陋的封面纸中抽出&#xff0c;剥开塑料膜并放入PS3主机的七年前的遥远午后。但当我的眼泪随着艾莉不协调的断指…

终结者外传第二季大结局剧情及评论

从现实情况来看&#xff0c;本集有90&#xff05;的可能性是全剧最后一集&#xff08;第三季希望渺茫&#xff09;&#xff0c;可剧组不但没有解答剧中最关键的几个悬疑之处&#xff0c;反而增加了一大堆让人觉得匪夷所思的线索。本集开始出演员表的时候&#xff0c;扮演Derek的…

三星 0E 门序列号批次汇总 (Samsung SSD 0E Issue with affected SN)

开头 S6 是高危大家应该都知道了&#xff0c;但我还是想尽可能更精确地确定大概的批次范围&#xff0c;所以就有了以下不完全统计太长不看&#xff1a;以下为各型号存在已知中招案例的序列号开头&#xff0c;多集中在写入量 < 15T 发生&#xff0c;整体集中于 21 年全年 &am…

快速入门微信小程序

文章目录 快速入门微信小程序1、微信小程序的注册1.1 注册账户1.2 激活1.3 登记信息1.4 下载微信开发工具1.5 使用微信开发工具创建一个小程序 2、导入官方的Demo2.1 下载官方Demo2.2 导入官方Demo2.3 运行官方Demo 3、编写自己的Demo3.1 创建微信小程序3.2 微信小程序常见参数…

从数字图像到音视频学习:我的学习之旅

数字图像是一门广泛应用于计算机视觉、图像处理和计算机图形学等领域的学科&#xff0c;而音视频学习则涵盖了音频和视频的处理、分析和应用。 如果你最开始接触数字图像&#xff0c;可能会学习一些基本概念&#xff0c;例如像素、分辨率、色彩空间和图像处理算法等。这可能涉…

错过一个订单后,吐槽下自己(顺便分享下书单),剧终版

事先啰嗦几句 1、 纯叙述分享&#xff0c;分享一点创业过程的经历。也当挖坟自我重新认识&#xff08;大概就是把以前的经历又翻出来的意思&#xff09;。 2、 前面叙述有“摇尾乞怜”之嫌&#xff0c;所以采用分段叙述的方式&#xff0c;只想看创业分享的直接往下拉。 3、 故意…

【项目功能模块】商城秒杀模块

实现商城秒杀功能模块涉及多个技术栈&#xff0c;包括Spring Boot、Vue.js、Redis、ActiveMQ和MySQL 由于代码实现较为复杂&#xff0c;无法在单个回答中完整展示所有代码和注释。以下是一个基本的示例架构和代码结构&#xff0c;以帮助你理解如何集成这些技术来实现商城秒杀功…

webassembly类属性访问函数报错问题

当有一个类&#xff1a; class Point{ public: Point(int x_0){m_xx_;}int getX(){return m_x;}void setX(int x_){m_xx_;} private:int m_x; }; 以及注册内容: EMSCRIPTEN_BINDINGS(my_value_example) {emscripten::class_<Point>("Point").constructor<…