Rust高性能JavaScript压缩库minify-js的使用,minify-js可高效压缩和优化JS代码

Rust高性能JavaScript压缩库minify-js的使用

minify-js是一个用Rust编写的极快JavaScript压缩器,专注于高效压缩和优化JS代码。

目标特性

  • 完全用Rust编写,兼容Rust生态(FFI、WASM、嵌入式等)
  • 优化单核CPU性能,易于扩展和集成
  • 专注于单个文件压缩,不包含打包功能
  • 优先考虑简单性和性能,而非最大可配置性

性能表现

minify-js在性能上表现出色,与esbuild等工具相比有显著优势。

核心功能

  • 使用SIMD指令加速解析
  • 采用快速内存分配arena
  • 完整支持JSX语法
  • 智能变量作用域分析
  • 标识符压缩
  • 语法优化(移除多余符号、转换函数形式等)

基础用法示例

Rust项目集成

在Cargo.toml中添加依赖:

[dependencies]
minify-js = "0.6.0"

基本压缩示例:

use minify_js::{Session, TopLevelMode, minify};

let mut code: &[u8] = b"const main = () => { let my_first_variable = 1; };";
let session = Session::new();
let mut out = Vec::new();
minify(&session, TopLevelMode::Global, code, &mut out).unwrap();
assert_eq!(out.as_slice(), b"const main=()=>{let a=1}");

Node.js环境使用

安装Node模块:

npm i @minify-js/node

使用示例:

import {minify} from "@minify-js/node";

const src = Buffer.from("let x = 1;", "utf-8");
const min = minify(src);

完整Rust示例代码

use minify_js::{Session, TopLevelMode, minify};

fn main() {
    // 准备要压缩的JS代码
    let js_code = r#"
        function calculate(a, b) {
            // 简单的加法计算
            const result = a + b;
            
            // 返回计算结果
            return {
                value: result,
                log: function() {
                    console.log("Result is: " + this.value);
                }
            };
        }
    "#;
    
    // 转换为字节切片
    let code = js_code.as_bytes();
    
    // 创建压缩会话
    let session = Session::new();
    
    // 准备输出缓冲区
    let mut output = Vec::new();
    
    // 执行压缩操作
    minify(&session, TopLevelMode::Global, code, &mut output)
        .expect("压缩失败");
    
    // 输出压缩结果
    println!("压缩后的JS代码:\n{}", String::from_utf8_lossy(&output));
    
    /* 预期输出类似:
    function calculate(a,b){const c=a+b;return{value:c,log(){console.log("Result is: "+this.value)}}}
    */
}

实际应用场景示例

use minify_js::{Session, TopLevelMode, minify};
use std::fs;

fn minify_js_file(input_path: &str, output_path: &str) -> std::io::Result<()> {
    // 读取原始JS文件
    let original_code = fs::read(input_path)?;
    
    // 创建压缩会话
    let session = Session::new();
    
    // 准备输出缓冲区
    let mut minified_code = Vec::new();
    
    // 执行压缩
    minify(&session, TopLevelMode::Global, &original_code, &mut minified_code)
        .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
    
    // 写入压缩后的文件
    fs::write(output_path, minified_code)?;
    
    println!("文件压缩完成: {} -> {}", input_path, output_path);
    Ok(())
}

fn main() {
    // 压缩示例文件
    if let Err(e) = minify_js_file("input.js", "output.min.js") {
        eprintln!("压缩出错: {}", e);
    }
}

这个完整示例展示了:

  1. 如何从文件读取JS代码
  2. 使用minify-js进行压缩
  3. 将压缩结果写入新文件
  4. 完整的错误处理机制

1 回复

Rust高性能JavaScript压缩库minify-js使用指南

minify-js是一个用Rust编写的高性能JavaScript压缩库,能够高效地压缩和优化JS代码。它提供了比传统JS压缩工具更快的处理速度,特别适合需要批量处理JS文件或在构建流程中集成压缩功能的场景。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
minify-js = "0.5"

基本使用方法

压缩字符串形式的JS代码

use minify_js::{minify, Session, TopLevelMode};

fn main() {
    let js_code = r#"
        function helloWorld() {
            console.log('Hello, world!');
        }
    "#;
    
    let mut output = Vec::new();
    let session = Session::new();
    
    minify(&session, TopLevelMode::Global, js_code.as_bytes(), &mut output).unwrap();
    
    let minified = String::from_utf8(output).unwrap();
    println!("{}", minified);
}

压缩JS文件

use std::fs;
use minify_js::{minify, Session, TopLevelMode};

fn minify_file(input_path: &str, output_path: &str) {
    let session = Session::new();
    let input = fs::read(input_path).unwrap();
    let mut output = Vec::new();
    
    minify(&session, TopLevelMode::Global, &input, &mut output).unwrap();
    
    fs::write(output_path, output).unwrap();
}

fn main() {
    minify_file("input.js", "output.min.js");
}

高级配置

minify-js提供了一些配置选项来控制压缩行为:

use minify_js::{minify, Session, TopLevelMode, Cfg};

fn main() {
    let js_code = "const x = 1; console.log(x);";
    let mut output = Vec::new();
    
    let mut cfg = Cfg::new();
    cfg.rename_variables = true;  // 启用变量名压缩
    cfg.rename_properties = true; // 启用属性名压缩
    
    let session = Session::with_cfg(cfg);
    
    minify(&session, TopLevelMode::Global, js_code.as_bytes(), &mut output).unwrap();
    
    println!("{}", String::from_utf8(output).unwrap());
}

性能优化技巧

  1. 重用Session:Session对象可以重用,避免重复创建的开销
  2. 批量处理:对多个文件使用同一个Session
  3. 并行处理:结合Rayon等并行库处理多个文件
use minify_js::{minify, Session, TopLevelMode};
use rayon::prelude::*;
use std::fs;

fn minify_files(files: &[&str]) {
    let session = Session::new();
    
    files.par_iter().for_each(|file| {
        let input = fs::read(file).unwrap();
        let mut output = Vec::new();
        
        minify(&session, TopLevelMode::Global, &input, &mut output).unwrap();
        
        let output_file = format!("{}.min.js", file);
        fs::write(output_file, output).unwrap();
    });
}

fn main() {
    let files = ["file1.js", "file2.js", "file3.js"];
    minify_files(&files);
}

与其他工具集成

minify-js可以很容易地集成到构建工具中,例如与webpack或rollup配合使用,或者作为Rust构建脚本的一部分。

在build.rs中使用

// build.rs
use std::fs;
use minify_js::{minify, Session, TopLevelMode};

fn main() {
    let js_code = fs::read("src/raw.js").unwrap();
    let mut output = Vec::new();
    let session = Session::new();
    
    minify(&session, TopLevelMode::Global, &js_code, &mut output).unwrap();
    
    fs::write("src/minified.js", output).unwrap();
}

完整示例代码

// 完整示例:使用minify-js压缩多个JS文件并输出统计信息
use minify_js::{minify, Session, TopLevelMode, Cfg};
use rayon::prelude::*;
use std::fs;
use std::time::Instant;

fn main() {
    // 要压缩的文件列表
    let files = ["file1.js", "file2.js", "file3.js"];
    
    // 配置压缩选项
    let mut cfg = Cfg::new();
    cfg.rename_variables = true;
    cfg.rename_properties = true;
    
    // 创建共享Session
    let session = Session::with_cfg(cfg);
    
    // 记录开始时间
    let start = Instant::now();
    
    // 并行处理所有文件
    files.par_iter().for_each(|file| {
        // 读取原始文件
        let input = fs::read(file).expect("读取文件失败");
        
        // 准备输出缓冲区
        let mut output = Vec::new();
        
        // 执行压缩
        minify(&session, TopLevelMode::Global, &input, &mut output)
            .expect("压缩失败");
            
        // 写入压缩后文件
        let output_file = format!("{}.min.js", file);
        fs::write(&output_file, output).expect("写入文件失败");
        
        println!("已压缩: {} -> {}", file, output_file);
    });
    
    // 输出统计信息
    println!("处理完成!耗时: {:?}", start.elapsed());
    println!("共压缩 {} 个文件", files.len());
}

minify-js是一个功能强大且高效的JS压缩工具,特别适合需要处理大量JS代码或对构建性能有严格要求的项目。

回到顶部