deviant
v0.1.1
Published
Override node's builtin require to use browserify transform streams directly in node
Downloads
12
Readme
deviant
Deviant breaks the rules a bit and overrides node's builtin require
behavior to allow you to use browserify's
transform streams
directly in node.
This is handy for a few reasons, for example using
installify to automatically install
missing dependencies, es6ify to get a
bunch of ES6 features without needing to use the --harmony
flag, or
sweetify to get hygenic macros from
sweet.js.
You can find a list of browserify transforms here.
Usage
The easiest way to get started is from the command-line, using the -t
argument as you would with browserify to add transforms:
# Install the command-line tool globally
$ npm install -g deviant
# Followed by your source transform modules:
$ npm install coffeeify installify
# Then you're good to go:
$ deviant -t coffeeify -t installify ./index.coffee
If you prefer to load deviant directly, you just have to run the following code before making any other calls to require:
// Specify the transforms you want to use
// here, if any
require('deviant')([
'es6ify'
, 'sweetify'
, 'installify'
])
// Now you can make require calls
// as usual, but with transforms
// enabled
require('./app')
How does it work?
Using the execSync module, we can fork out to a separate process to get the results of a transform synchronously. It's pretty hacky, but I believe the functionality is coming to node 0.12.x.
Launching a new process is expensive – especially when it's pulling in a lot of
dependencies – so a TCP server is created and kept alive, with execSync
being
used to spawn light processes which just pipe the data onto the server while
still blocking the main loop. The server has to be run in a separate process,
because otherwise execSync
will block it and prevent the response from ever
being recieved.
Overriding require is done by replacing Module.prototype._compile
, e.g:
// This will read in all of your dependencies
// uppercased, and probably breaking them in
// the process:
var Module = require('module')
var _compile = Module.prototype._compile
Module.prototype._compile = function(content, filename) {
content = content.toUpperCase()
return _compile.call(this, content, filename)
}
License
MIT. See LICENSE.md for details.