MCJS
Merge Common JS modules into a single module.
MCJS produces a single module with all inner requirements merged into a single scope with resolved name conflicts. That way it gains maximum compressability and minimal overhead. Smaller than browserify, component, webpack, powerbuild, small.
Some stats
Compare minified gzip-sizes:
Package | Browserify | bundle-collapser | MCJS | Effect |
---|---|---|---|---|
plotly.js | 516kb | 508kb | 494kb | 4.5% |
color-space | 5kb | 4.4kb | 12% | |
mcjs | 4.02kb | 2.71kb | 32.6% | |
mod | 16.5kb | 13kb | 27% |
Usage
Install
$ npm install mcjs
Use as a browserify plugin:
browserify index.js -p mcjs/plugin
dep.js:
var z = 123;
module.exports = z;
index.js:
var a = require('./dep');
module.exports = a;
Resulting bundle.js:
var m_a, m_index;
var z = 123;
m_a = z;
var a = m_a;
module.exports = a;
Motivation
Closure compiler can expand any objects, so if to merge modules into a single scope, which means to resolve global vars conflict and to replace all module.exports
and require
calls, then we get one-scoped bundle, which closure compiler compresses the way better than separated by scopes browserified/compiled bundle.
Mcjs does the same task as a ClosureCompiler with --process_commonjs_modules
flag, but avoids creating of goog.provide
's and makes variables more human-readable.