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);
}

功能特性

  1. 高性能的CSS解析器,完全用Rust编写
  2. 支持CSS模块化
  3. 支持现代和传统CSS语法
  4. 可配置的代码生成选项
  5. 与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);
}

示例说明

  1. 首先我们定义了一个ColorReplacer访问器,用于遍历AST并修改颜色值
  2. 然后解析CSS字符串为AST(抽象语法树)
  3. 使用访问器修改AST中的颜色值
  4. 最后将修改后的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;
}

性能提示

  1. 对于重复解析操作,重用ParserConfigSourceMap实例
  2. 在批处理时考虑使用并行处理
  3. 对于大型CSS文件,流式处理可能更高效

swc_css作为SWC工具链的一部分,特别适合需要高性能CSS处理的场景,如构建工具、静态站点生成器等。

回到顶部