Snockets
A JavaScript/CoffeeScript concatenation tool for Node.js inspired by Sprockets. Used by connect-assets to create a Rails 3.1-style asset pipeline.
Written in CoffeeScript by the author of CoffeeScript: Accelerated JavaScript Development.
The state of the package
As of May 1st, 2013, @pthrasher became the maintainer of this package. It was taken over from @TrevorBurnham. I'm currently working on a 2.0.0 release that will be complete by the end of May. Main changes/features:
- Source-map support
- Move tests from node-unit over to jasmine.
- Break out pieces into separate files.
- More tests
- More documentation
You can track my progress on these tasks via Pull Request #43
Usage (script-side)
In your CoffeeScript files, write Sprockets-style comments to indicate dependencies, e.g.
#= require dependency
(or //= require dependency
in JavaScript). If you want to bring in a whole folder of scripts, use
#= require_tree dir
Usage (Node-side)
First,
npm install snockets
Then in your app:
Snockets = require 'snockets'
snockets = new Snockets()
Each Snockets
instance has a depGraph
property, an instance of dep-graph. You can scan
a file to just update the dependency graph:
snockets.scan 'dir/foo.coffee', (err, depGraph) -> ...
To get a list of filenames showing the series of dependencies the scanned file has, you'd use depGraph.getChain 'dir/foo.coffee'
.
You can get a list of compiled JavaScripts corresponding to the dependency chain (starting from the first required file to the requested file) using getCompiledChain
:
snockets.getCompiledChain 'dir/foo.coffee', (err, jsList) -> ...
The result is in the format [{filename: "dependency1.js", js: "// code"}, ...]
. Note that those JavaScript files are not actually created by getCompiledChain
.
Snockets can also provide a single compiled, concatenated file (optionally run through UglifyJS if the minify
option is passed in):
snockets.getConcatenation 'dir/foo.coffee', minify: true, (err, js) -> ...
Note that you don't need to scan
before or after running getCompiledChain
or getConcatenation
; they update the dependency graph the same way that scan
does.
Synchronous mode
By default, Snockets uses only async file methods. You can pass the option async: false
to either of its methods if you want it to be synchronous instead. In synchronous mode, you can use either callbacks or return values, e.g.
js = snockets.getConcatenation 'dir/foo.coffee', async: false