bundle
bundle copied to clipboard
Generic asset pipeline with caching, etags, minification, gzipping and sourcemaps.
koa-bundle
Generic asset pipeline with caching, etags, minification, gzipping and sourcemaps.
The child of node-enchilada and static-cache.
Examples
- Browserify (with a callback and options)
var bundle = Bundle({ debug: true, root: __dirname) }, function(file, fn) {
Browserify({ debug: file.debug })
.add(file.path)
.transform(require('babelify'))
.bundle(fn);
}))
app.use(bundle('app.js'));
- Duo (using generators)
var bundle = Bundle(function *(file) {
return yield Duo(file.root)
.entry(file.path)
.use(require('duo-sass')())
.run();
})
app.use(bundle('app.css'));
- Gulp (using currying and globbing)
var bundle = Bundler({ root: __dirname }, function(file, fn) {
var gulp = Gulp.src(file.path, { cwd: file.root });
if ('styl' == file.type) {
gulp.pipe(styl())
.on('error', fn);
}
gulp.pipe(myth())
.on('error', fn)
if ('production' == process.env.NODE_ENV) {
gulp
.pipe(csso())
.on('error', fn);
}
gulp.on('end', fn);
});
// ... in another file, single middleware
app.use(bundle());
// multiple endpoints
bundle('app.styl');
bundle('app.js');
Installation
npm install koa-bundle
API
bundle(settings, handler) => bundler([path]) => middleware
bundle(handler)(glob) => bundler([path]) => middleware
Create a bundler with an optional set of settings and a handler.
A handler can be a synchronous function, asynchronous function, generator or promise. The handler passes a File object that has the following properties:
var File = {
type: "js",
src: "... JS ...",
path: "dashboard.js",
root: "/Users/Matt/Projects/..."
minify: true,
debug: false,
cache: true,
gzip: true,
}
The available settings are:
debug: enables sourcemapsminify: minify JS and CSScache: cache responses across requests and add etagsgzip: gzip the response if it's supported
The default settings depend on the environment (NODE_ENV):
-
Production:
debug: falseminify: truecache: truegzip: true
-
Development:
debug: trueminify: falsecache: falsegzip: false
The bundler returns a function that you can then pass a path into:
var bundle = Bundler(settings, handler);
app.use(bundle('app.js'));
The path is relative to settings.root or process.cwd(). The script[src] and link[href] is relative the root specified.
TODO
- Warmup cache in production
- More examples
- Testing
Credits
- node-enchilada and browserify-middleware for some ideas and general design.
- static-cache for the caching, etagging and gzipping.
- sponsored by Lapwing Labs.
License
MIT
Copyright (c) 2015 Matthew Mueller <[email protected]>