Top Related Projects
🗜 JavaScript parser, mangler and compressor toolkit for ES6+
JavaScript parser / mangler / compressor / beautifier toolkit
A JavaScript checker and optimizer.
Terser Plugin
An extremely fast bundler for the web
Rust-based platform for the Web
Quick Overview
Babel Minify (also known as babili) is a JavaScript minifier designed to leverage Babel's toolchain for optimal minification. It aims to provide a configurable, ES6+-aware minification solution that can be used as a Babel preset or as a standalone tool.
Pros
- Leverages Babel's parsing and transformation capabilities for better ES6+ support
- Highly configurable with various optimization options
- Can be used as a Babel preset or standalone CLI tool
- Actively maintained and part of the Babel ecosystem
Cons
- May be slower than some other minifiers due to its comprehensive approach
- Requires Babel as a dependency, which can increase project size
- Some optimizations might be less aggressive compared to specialized minifiers
- Limited browser support information for certain optimizations
Code Examples
- Using Babel Minify as a preset:
// babel.config.js
module.exports = {
presets: ['minify']
};
- Configuring specific minification options:
// babel.config.js
module.exports = {
presets: [
['minify', {
mangle: {
keepClassName: true
},
deadcode: {
keepFnArgs: true
}
}]
]
};
- Using Babel Minify programmatically:
const babel = require('@babel/core');
const minifyPreset = require('babel-preset-minify');
const result = babel.transformSync('const x = 5; console.log(x);', {
presets: [minifyPreset]
});
console.log(result.code); // Output: console.log(5);
Getting Started
To use Babel Minify in your project:
-
Install the necessary packages:
npm install --save-dev @babel/core babel-preset-minify
-
Create or update your
babel.config.js
:module.exports = { presets: ['minify'] };
-
Run Babel on your JavaScript files:
npx babel src --out-dir dist
This will minify your JavaScript files using Babel Minify's default settings. Adjust the configuration as needed for your specific use case.
Competitor Comparisons
🗜 JavaScript parser, mangler and compressor toolkit for ES6+
Pros of Terser
- Faster execution and better performance optimization
- More active development and frequent updates
- Wider community adoption and support
Cons of Terser
- Less integration with Babel ecosystem
- May require additional configuration for advanced use cases
Code Comparison
Minify:
const minify = require("babel-minify");
const result = minify("function add(a, b) { return a + b; }");
console.log(result.code);
Terser:
const Terser = require("terser");
const result = Terser.minify("function add(a, b) { return a + b; }");
console.log(result.code);
Key Differences
- Terser is a fork of UglifyJS, while Minify is built on Babel
- Terser focuses on JavaScript minification, while Minify leverages Babel's parsing capabilities
- Terser generally produces smaller output and has better performance
Use Cases
- Terser: Ideal for projects requiring fast and efficient minification
- Minify: Better suited for projects already using Babel or requiring advanced ES6+ transformations
Community and Maintenance
- Terser: More active development, larger user base
- Minify: Less frequent updates, smaller community
Integration
- Terser: Widely supported in build tools and bundlers
- Minify: Tighter integration with Babel ecosystem
JavaScript parser / mangler / compressor / beautifier toolkit
Pros of UglifyJS
- More mature and widely adopted project with a larger community
- Faster execution time for minification tasks
- Supports a broader range of JavaScript versions and features
Cons of UglifyJS
- Less integrated with modern JavaScript toolchains
- May require additional configuration for optimal results with ES6+ code
- Slower development cycle and less frequent updates
Code Comparison
UglifyJS:
UglifyJS.minify(code, {
compress: {
dead_code: true,
drop_debugger: true,
conditionals: true,
evaluate: true,
booleans: true,
loops: true,
unused: true,
hoist_funs: true,
keep_fargs: false,
hoist_vars: true,
if_return: true,
join_vars: true,
cascade: true,
side_effects: true,
warnings: false
}
});
Babel Minify:
const babel = require("@babel/core");
const minifyPreset = require("babel-preset-minify");
babel.transform(code, {
presets: [minifyPreset()]
});
Both UglifyJS and Babel Minify are popular JavaScript minification tools, each with its own strengths. UglifyJS is a more established project with faster execution times and broader JavaScript support. However, Babel Minify integrates better with modern JavaScript toolchains and may be more suitable for projects already using Babel. The code comparison shows that UglifyJS offers more granular control over minification options, while Babel Minify provides a simpler API through its preset system.
A JavaScript checker and optimizer.
Pros of Closure Compiler
- More advanced optimization techniques, including dead code elimination and function inlining
- Supports type checking and annotation-based optimizations
- Mature project with extensive documentation and community support
Cons of Closure Compiler
- Steeper learning curve due to its complexity and advanced features
- Slower compilation times, especially for large projects
- Requires specific coding patterns and annotations for optimal results
Code Comparison
Babel Minify:
function greet(name) {
console.log("Hello, " + name + "!");
}
greet("World");
Closure Compiler (Advanced mode):
console.log("Hello, World!");
Key Differences
- Closure Compiler performs more aggressive optimizations, potentially resulting in smaller output
- Babel Minify is easier to set up and use, especially for projects already using Babel
- Closure Compiler provides better support for large-scale applications and library development
- Babel Minify focuses on JavaScript-specific optimizations, while Closure Compiler can handle other languages like TypeScript
Use Cases
- Choose Closure Compiler for large, complex projects requiring advanced optimizations
- Opt for Babel Minify for simpler projects or when already using the Babel ecosystem
- Consider Closure Compiler when type checking and annotation-based optimizations are important
- Use Babel Minify for quick and easy minification without extensive configuration
Terser Plugin
Pros of terser-webpack-plugin
- Seamless integration with Webpack, optimized for its ecosystem
- Utilizes Terser, a modern JavaScript minifier with better performance
- Supports caching for faster subsequent builds
Cons of terser-webpack-plugin
- Limited to Webpack projects, less versatile than babel-minify
- May require additional configuration for optimal results
- Focuses primarily on minification, lacking some of babel-minify's transformation capabilities
Code Comparison
terser-webpack-plugin:
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserPlugin()],
},
};
babel-minify:
const MinifyPlugin = require('babel-minify-webpack-plugin');
module.exports = {
plugins: [
new MinifyPlugin()
],
};
Summary
terser-webpack-plugin is tailored for Webpack projects, offering seamless integration and leveraging Terser for efficient minification. It excels in performance and caching capabilities. However, it's limited to the Webpack ecosystem and may require more setup for optimal results.
babel-minify, on the other hand, provides a more versatile solution that can be used in various JavaScript projects, not just Webpack. It offers additional code transformation features beyond minification but may have slightly lower performance in some scenarios.
Choose terser-webpack-plugin for Webpack-specific projects prioritizing performance, and babel-minify for broader JavaScript optimization needs or when additional code transformations are required.
An extremely fast bundler for the web
Pros of esbuild
- Significantly faster build times due to its Go-based implementation
- Supports modern JavaScript features and TypeScript out of the box
- Offers a simple API and configuration options
Cons of esbuild
- Less mature and may have fewer plugins available compared to Babel ecosystem
- Limited customization options for advanced use cases
- May not support older JavaScript syntax or certain edge cases
Code Comparison
esbuild:
import * as esbuild from 'esbuild'
await esbuild.build({
entryPoints: ['app.js'],
bundle: true,
minify: true,
outfile: 'out.js',
})
babel-minify:
const minify = require('babel-minify');
const {code, map} = minify('input code', {
mangle: true,
deadcode: true
});
Summary
esbuild offers superior performance and modern language support, making it ideal for projects prioritizing build speed. However, minify, being part of the Babel ecosystem, provides more extensive customization options and better support for older JavaScript syntax. The choice between the two depends on project requirements, with esbuild excelling in speed and simplicity, while minify offers more flexibility and compatibility with legacy code.
Rust-based platform for the Web
Pros of swc
- Significantly faster performance due to being written in Rust
- Supports both JavaScript and TypeScript out of the box
- Actively maintained with frequent updates and improvements
Cons of swc
- Less mature ecosystem compared to Babel
- May have fewer plugins and customization options
- Potential compatibility issues with some existing Babel-based workflows
Code Comparison
swc:
use swc_ecma_minifier::option::MinifyOptions;
use swc_ecma_minifier::optimize;
let result = optimize(
ast,
source_map,
handler,
&MinifyOptions::default(),
&mut Default::default(),
);
babel-minify:
const minify = require("babel-minify");
const { code, map } = minify("input code", {
mangle: true,
deadcode: true
});
While both tools aim to minify JavaScript code, swc's implementation in Rust offers potential performance benefits. However, babel-minify's JavaScript-based approach may be more familiar to some developers and easier to integrate into existing JavaScript projects. swc provides a more comprehensive solution for both transpilation and minification, while babel-minify focuses specifically on minification within the Babel ecosystem.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
babel-minify (beta)
An ES6+ aware minifier based on the Babel toolchain.
babel-minify
is consumable via API, CLI, or Babel preset. Try it online - babeljs.io/repl
Historical note: babel-minify was renamed from babili.
Table of Contents
Experimental
babel-minify
is an experimental project that attempts to use Babel's toolchain (for compilation) to do something in a similar vein, minification. It's currently in 0.x, so we don't recommend using it in production.
Checkout our CONTRIBUTING.md if you want to help out!
Requirements
- node >= 6
- babel >= 6.20.0
Why
Current tools don't support targeting the latest version of ECMAScript. (yet)
- BabelMinify can because it is just a set of Babel plugins, and Babel already understands new syntax with our parser Babylon.
- When it's possible to only target browsers that support newer ES features, code sizes can be smaller because you don't have to transpile and then minify.
Check out our blog post for more info!
// Example ES2015 Code
class Mangler {
constructor(program) {
this.program = program;
}
}
new Mangler(); // without this it would just output nothing since Mangler isn't used
Before
// ES2015+ code -> Babel -> BabelMinify/Uglify -> Minified ES5 Code
var a=function a(b){_classCallCheck(this,a),this.program=b};new a;
After
// ES2015+ code -> BabelMinify -> Minified ES2015+ Code
class a{constructor(b){this.program=b}}new a;
CLI
Package | Version | Dependencies |
---|---|---|
babel-minify |
Install
npm install babel-minify --save-dev
Usage
minify src -d lib
Babel preset
Package | Version | Dependencies |
---|---|---|
babel-preset-minify |
Install
npm install babel-preset-minify --save-dev
Usage
note: minify is still in beta, so we don't recommend using it for production code but rather the production environment.
When testing, it's recommended to run minifiers for production so less code is sent to end-users vs. in development where it can be an issue for readability when debugging. Check out the env docs for more help.
Options specific to a certain environment are merged into and overwrite non-env specific options.
.babelrc
:
{
"presets": ["es2015"],
"env": {
"production": {
"presets": ["minify"]
}
}
}
Then you'll need to set the env variable which could be something like BABEL_ENV=production npm run build
Individual Plugins
The minify
repo is comprised of many npm packages. It is a lerna monorepo similar to babel itself.
The npm package babel-preset-minify
is at the path packages/babel-preset-minify
Usage
Normally you wouldn't be consuming the plugins directly since the preset is available.
Add to your .babelrc
's plugins array.
{
"plugins": ["babel-plugin-transform-undefined-to-void"]
}
Other
Package | Version | Dependencies |
---|---|---|
babel-plugin-transform-inline-environment-variables | ||
babel-plugin-transform-node-env-inline | ||
babel-plugin-transform-remove-console | ||
babel-plugin-transform-remove-debugger |
Benchmarks
Bootstrap:
npm run bootstrap
Build:
npm run build
Running the benchmarks:
./scripts/benchmark.js [file...]
- defaults to a few packages fetched from unpkg.com and is defined in benchmark.js.
Note: All Input sources are ES5.
Benchmark Results for react.js:
Input Size: 54.79KB
Input Size (gzip): 15.11KB
minifier | output raw | raw win | gzip output | gzip win | parse time (ms) | minify time (ms) |
---|---|---|---|---|---|---|
babel-minify | 15.97KB | 71% | 6.08KB | 60% | 1.00 | 1039.06 |
terser | 15.65KB | 71% | 5.98KB | 60% | 0.93 | 532.19 |
uglify | 15.6KB | 72% | 6KB | 60% | 1.09 | 463.69 |
closure-compiler | 15.74KB | 71% | 6.04KB | 60% | 1.22 | 2361.41 |
closure-compiler-js | 18.21KB | 67% | 6.73KB | 55% | 1.08 | 3381.47 |
Benchmark Results for vue.js:
Input Size: 282.52KB
Input Size (gzip): 77.52KB
minifier | output raw | raw win | gzip output | gzip win | parse time (ms) | minify time (ms) |
---|---|---|---|---|---|---|
babel-minify | 104.21KB | 63% | 38.71KB | 50% | 6.09 | 3538.30 |
terser | 103.12KB | 63% | 37.92KB | 51% | 6.42 | 1680.85 |
uglify | 102.71KB | 64% | 38.08KB | 51% | 6.59 | 1662.50 |
closure-compiler | 101.93KB | 64% | 38.6KB | 50% | 10.41 | 4413.06 |
closure-compiler-js | 105.18KB | 63% | 39.5KB | 49% | 6.79 | 12082.80 |
Benchmark Results for lodash.js:
Input Size: 527.18KB
Input Size (gzip): 94.04KB
minifier | output raw | raw win | gzip output | gzip win | parse time (ms) | minify time (ms) |
---|---|---|---|---|---|---|
babel-minify | 69.59KB | 87% | 24.37KB | 74% | 5.38 | 2587.27 |
terser | 68.66KB | 87% | 24.31KB | 74% | 6.41 | 1913.43 |
uglify | 68.15KB | 87% | 24.05KB | 74% | 5.89 | 2075.71 |
closure-compiler | 71.05KB | 87% | 24.19KB | 74% | 6.24 | 4119.43 |
closure-compiler-js | 73.51KB | 86% | 24.94KB | 73% | 5.17 | 9650.59 |
Benchmark Results for three.js:
Input Size: 1.05MB
Input Size (gzip): 212.43KB
minifier | output raw | raw win | gzip output | gzip win | parse time (ms) | minify time (ms) |
---|---|---|---|---|---|---|
babel-minify | 535.88KB | 50% | 134.66KB | 37% | 27.24 | 9988.57 |
terser | 536.16KB | 50% | 132.78KB | 37% | 28.39 | 3919.34 |
uglify | 533.42KB | 50% | 133.21KB | 37% | 26.15 | 4025.20 |
closure-compiler | 532.44KB | 51% | 134.41KB | 37% | 29.96 | 9029.19 |
closure-compiler-js | 543.08KB | 50% | 136.3KB | 36% | 24.36 | 95743.77 |
Browser support
Babel Minify is best at targeting latest browsers (with full ES6+ support) but can also be used with the usual Babel es2015 preset to transpile down the code first.
Team
Amjad Masad | Boopathi Rajaa | Juriy Zaytsev | Henry Zhu | Vignesh Shanmugam |
@amasad | @boopathi | @kangax | @hzoo | @vigneshshanmugam |
@amasad | @heisenbugger | @kangax | @left_pad | @_vigneshh |
Top Related Projects
🗜 JavaScript parser, mangler and compressor toolkit for ES6+
JavaScript parser / mangler / compressor / beautifier toolkit
A JavaScript checker and optimizer.
Terser Plugin
An extremely fast bundler for the web
Rust-based platform for the Web
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot