Rust CSS解析与转换工具swc_css的使用:高性能Rust前端工具链SWC的CSS处理库
Rust CSS解析与转换工具swc_css的使用:高性能Rust前端工具链SWC的CSS处理库
安装
在项目目录中运行以下Cargo命令:
cargo add swc_css
或者在Cargo.toml中添加以下行:
swc_css = "17.0.0"
示例代码
以下是一个使用swc_css解析和转换CSS的完整示例:
use swc_css::{
ast::Stylesheet,
codegen::{writer::basic::BasicCssWriter, CodeGenerator, CodegenConfig, Emit},
parser::parser::{Parser, parser_config::ParserConfig},
};
fn main() {
// 要解析的CSS代码
let css_code = r#"
.container {
display: flex;
color: red;
}
@media (min-width: 768px) {
.container {
color: blue;
}
}
"#;
// 创建解析器配置
let config = ParserConfig {
css_modules: false,
legacy_nesting: false,
legacy_ie: false,
};
// 解析CSS
let mut parser = Parser::new(css_code, config);
let stylesheet: Stylesheet = parser.parse_all().unwrap();
// 代码生成配置
let codegen_config = CodegenConfig {
minify: false,
targets: None,
};
// 生成CSS代码
let mut output = String::new();
{
let writer = BasicCssWriter::new(&mut output, None);
let mut gen = CodeGenerator::new(writer, codegen_config);
gen.emit(&stylesheet).unwrap();
}
println!("Generated CSS:\n{}", output);
}
完整示例demo
以下是一个更完整的示例,展示了如何使用swc_css进行CSS解析、转换和代码生成:
use swc_css::{
ast::Stylesheet,
codegen::{writer::basic::BasicCssWriter, CodeGenerator, CodegenConfig, Emit},
parser::parser::{Parser, parser_config::ParserConfig},
visit::{VisitMut, VisitMutWith},
};
// 自定义访问者用于修改CSS规则
struct ColorChanger;
impl VisitMut for ColorChanger {
fn visit_mut_color(&mut self, color: &mut swc_css::ast::Color) {
// 将所有颜色值改为green
*color = swc_css::ast::Color::Ident("green".into());
}
}
fn main() {
// 要解析的CSS代码
let css_code = r#"
.header {
font-size: 24px;
color: red;
background: #fff;
}
.footer {
border: 1px solid black;
}
@media (max-width: 600px) {
.header {
font-size: 18px;
}
}
"#;
// 创建解析器配置
let config = ParserConfig {
css_modules: false,
legacy_nesting: false,
legacy_ie: false,
};
// 解析CSS
let mut parser = Parser::new(css_code, config);
let mut stylesheet: Stylesheet = parser.parse_all().unwrap();
// 使用自定义访问者修改AST
stylesheet.visit_mut_with(&mut ColorChanger);
// 代码生成配置 - 启用压缩
let codegen_config = CodegenConfig {
minify: true, // 开启压缩
targets: None,
};
// 生成CSS代码
let mut output = String::new();
{
let writer = BasicCssWriter::new(&mut output, None);
let mut gen = CodeGenerator::new(writer, codegen_config);
gen.emit(&stylesheet).unwrap();
}
println!("转换后的CSS代码:\n{}", output);
}
功能特性
- 高性能的CSS解析器,完全用Rust编写
- 支持CSS模块化
- 支持现代和传统CSS语法
- 可配置的代码生成选项
- 与SWC工具链的其他组件无缝集成
1 回复
Rust CSS解析与转换工具swc_css的使用
介绍
swc_css
是高性能Rust前端工具链SWC中的CSS处理库,它提供了CSS解析、转换和代码生成的能力。作为SWC生态系统的一部分,swc_css
继承了SWC的高性能特点,特别适合需要快速处理CSS的工具链和构建系统。
主要特性:
- 完整的CSS解析器,支持所有现代CSS语法
- 高性能的Rust实现
- 支持CSS模块化
- 提供AST操作能力
- 与SWC其他组件无缝集成
安装
在Cargo.toml中添加依赖:
[dependencies]
swc_core = { version = "0.86", features = ["css"] }
完整示例demo
下面是一个完整的示例,展示如何使用swc_css解析CSS、修改样式并生成新的CSS:
use swc_core::{
css::{
ast::*,
codegen::{CodeGenerator, CodegenConfig, Emit},
parser::{parse_str, parser::ParserConfig},
visit::{VisitMut, VisitMutWith},
},
};
// 定义颜色替换访问器
struct ColorReplacer;
impl VisitMut for ColorReplacer {
fn visit_mut_color(&mut self, color: &mut Color) {
if let Color::Hex(hex) = color {
// 将所有红色(#ff0000)替换为绿色(#00ff00)
if hex.value.to_lowercase() == "ff0000" {
hex.value = "00ff00".into();
}
}
}
}
fn main() {
// 原始CSS内容
let css = r#"
.header {
color: #ff0000;
background: #0000ff;
font-size: 24px;
}
.footer {
color: #ff0000;
padding: 10px;
}
"#;
// 配置解析器
let config = ParserConfig {
css_modules: false,
..Default::default()
};
// 解析CSS为AST
let mut stylesheet = parse_str(css, Default::default(), config)
.expect("Failed to parse CSS");
println!("=== 原始解析结果 ===");
println!("{:#?}", stylesheet);
// 转换AST - 替换颜色
stylesheet.visit_mut_with(&mut ColorReplacer);
// 生成新的CSS
let mut buf = String::new();
let mut gen = CodeGenerator::new(
&mut buf,
None,
CodegenConfig {
minify: false,
..Default::default()
},
);
gen.emit(&stylesheet).expect("Failed to generate CSS");
println!("\n=== 转换后的CSS ===");
println!("{}", buf);
}
示例说明
- 首先我们定义了一个
ColorReplacer
访问器,用于遍历AST并修改颜色值 - 然后解析CSS字符串为AST(抽象语法树)
- 使用访问器修改AST中的颜色值
- 最后将修改后的AST重新生成为CSS字符串
输出结果
运行上述代码将输出类似以下内容:
=== 原始解析结果 ===
Stylesheet {
rules: [
QualifiedRule {
prelude: [...],
block: Block {
value: [
Declaration {
property: "color",
value: [
HexColor {
value: "ff0000",
span: [...]
}
],
important: false,
[...]
},
[...]
]
}
},
[...]
]
}
=== 转换后的CSS ===
.header {
color: #00ff00;
background: #0000ff;
font-size: 24px;
}
.footer {
color: #00ff00;
padding: 10px;
}
性能提示
- 对于重复解析操作,重用
ParserConfig
和SourceMap
实例 - 在批处理时考虑使用并行处理
- 对于大型CSS文件,流式处理可能更高效
swc_css
作为SWC工具链的一部分,特别适合需要高性能CSS处理的场景,如构建工具、静态站点生成器等。