| Crates.io | mni |
| lib.rs | mni |
| version | 0.1.0 |
| created_at | 2025-11-08 22:55:53.003633+00 |
| updated_at | 2025-11-08 22:55:53.003633+00 |
| description | A world-class minifier for JavaScript, CSS, and JSON written in Rust |
| homepage | |
| repository | https://github.com/epistates/mni |
| max_upload_size | |
| id | 1923365 |
| size | 146,811 |
A blazing-fast, production-ready minifier for JavaScript, CSS, and JSON written in Rust.
Built on industry-leading libraries:
cargo install mni
Or build from source:
git clone https://github.com/epistates/mni
cd mni
cargo build --release
# Minify JavaScript
mni input.js -o output.min.js
# Minify CSS
mni styles.css -o styles.min.css
# Minify JSON
mni data.json -o data.min.json
# Auto-detect format and show stats
mni input.js --stats
# Read from stdin, write to stdout
echo "const x = 1 + 2;" | mni
# Pipe through mni
cat input.js | mni > output.min.js
# Development preset (fast, readable, source maps)
mni input.js --preset dev -o output.js
# Production preset (balanced compression and speed)
mni input.js --preset prod -o output.js
# Aggressive preset (maximum compression, slower)
mni input.js --preset aggressive -o output.js
# Customize minification
mni input.js \
--target es2020 \
--mangle \
--compress \
--drop-console \
--keep-fnames \
--passes 2 \
--stats
| Option | Description | Default |
|---|---|---|
--target |
ECMAScript version (es5, es2015, es2020, esnext) | es2020 |
--mangle |
Enable identifier mangling | true |
--compress |
Enable compression optimizations | true |
--source-map |
Generate source maps | false |
--keep-fnames |
Preserve function names | false |
--keep-classnames |
Preserve class names | false |
--drop-console |
Remove console.* statements | false |
--drop-debugger |
Remove debugger statements | true |
--passes |
Number of compression passes | 1 |
--stats |
Show minification statistics | false |
use mni::{Minifier, MinifyOptions, Target};
fn main() -> anyhow::Result<()> {
let code = r#"
function hello(name) {
console.log("Hello, " + name + "!");
}
"#;
let options = MinifyOptions {
target: Target::ES2020,
mangle: true,
compress: true,
..Default::default()
};
let minifier = Minifier::new(options);
let result = minifier.minify_js(code)?;
println!("Original: {} bytes", result.stats.original_size);
println!("Minified: {} bytes", result.stats.minified_size);
println!("Reduction: {:.1}%", result.stats.compression_ratio * 100.0);
println!("Time: {} ms", result.stats.time_ms);
println!("\n{}", result.code);
Ok(())
}
Benchmarks on real-world files:
| Format | Original | Minified | Reduction | Time |
|---|---|---|---|---|
| JavaScript (1.3KB) | 1,307 bytes | 757 bytes | 42.1% | 18ms |
| CSS (1.7KB) | 1,657 bytes | 1,218 bytes | 26.5% | 6ms |
| JSON (671B) | 671 bytes | 519 bytes | 22.7% | <1ms |
mni leverages SWC which is:
CSS minification via LightningCSS is:
See the examples/ directory for sample files:
# JavaScript minification
cargo run -- examples/sample.js --stats
# CSS minification
cargo run -- examples/sample.css --stats
# JSON minification
cargo run -- examples/sample.json --stats
# Build
cargo build
# Run tests
cargo test
# Run benchmarks
cargo bench
# Format code
cargo fmt
# Lint
cargo clippy
mni prioritizes correctness over compression. We've disabled certain aggressive SWC optimizations that can produce invalid JavaScript in edge cases:
collapse_vars - Can create invalid left-hand assignmentsinline - Aggressive inlining can break code semanticssequences - Comma sequence optimization can produce invalid syntaxResult: All output is guaranteed to be valid JavaScript that re-parses correctly.
See BUGS.md for detailed information about known issues and fixes.
Completed:
Planned:
mni is designed as a unified orchestrator around best-in-class libraries:
┌─────────────────────────────────────────┐
│ mni CLI │
│ (Unified interface & orchestration) │
└─────────────────────────────────────────┘
│
┌─────────────┼─────────────┐
│ │ │
┌───▼───┐ ┌───▼────┐ ┌───▼──────┐
│ SWC │ │Lightning│ │serde_json│
│ JS │ │CSS CSS │ │ JSON │
└───────┘ └─────────┘ └──────────┘
This approach:
MIT
Contributions welcome! Please read our contributing guidelines and submit PRs.
Built with: