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);
}
}
这个完整示例展示了:
- 如何从文件读取JS代码
- 使用minify-js进行压缩
- 将压缩结果写入新文件
- 完整的错误处理机制
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());
}
性能优化技巧
- 重用Session:Session对象可以重用,避免重复创建的开销
- 批量处理:对多个文件使用同一个Session
- 并行处理:结合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代码或对构建性能有严格要求的项目。