Awesome
NibJS
nib.js - Package CommonJS (Node.js) java/coffeescript libraries for the browser
nib.js is a library allowing to maintain javascript projects ala 'node.js' (CommonJS conventions about modules, exports, require) while also targetting the web browser as execution platform. It contains a simple packager command (nibjs) that will convert your sources to a single and minified .js file to be embedded in the browser. Node.js's exports and require are correctly resolved.
Getting started
gem install nibjs
nibjs --help
See also the online presentation at http://blambeau.github.com/nib.js
How to use it
Let assume that your project has the structure below.
mylib/
dist/
lib/
Foo.[js,coffee] # exports.Foo = ...
Bar.[js,coffee] # require('./Foo')
index.[js,coffee] # exports.X = ...
spec/
foo_spec.[js,coffee]
bar_spec.[js,coffee]
package.json
EXAMPLE 1 (embedded javascript):
In a shell:
# if the sources are .js
nibjs --libname=mylib --output=dist/mylib.js lib
# if the sources are .coffee
nibjs --coffee --libname=mylib --output=dist/mylib.js lib
In the browser:
<script src="js/nibjs.js" type="text/javascript">
<script src="js/mylib.js" type="text/javascript">
<script>
// mylib contains what index.[js,coffee] exports
var mylib = NibJS.require('mylib')
</script>
EXAMPLE 2 (embedded coffeescript):
In a shell:
nibjs --coffee --no-coffee-compile --libname=mylib --output=dist/mylib.coffee lib
In the browser:
<script src="js/coffee-script.js" type="text/javascript">
<script src="js/nibjs.js" type="text/javascript">
<script src="js/mylib.coffee" type="text/coffeescript">
<script>
/* But be warned of coffeescript's issue 1054
https://github.com/jashkenas/coffee-script/issues/#issue/1054 */
var mylib = NibJS.require('mylib')
</script>
EXAMPLE 3 (get rid of nibjs.js):
In a shell:
nibjs --standalone --libname=mylib --output=dist/mylib.js lib
In the browser:
<script src="js/mylib.js" type="text/coffeescript">
<script>
// NibJS is itself included in mylib.js
var mylib = NibJS.require('mylib')
</script>
See also
This project is related to CommonJS Module specification. In a sense, it is an offline "compiler" implementation of the version 1.0 of that specification (not even complete). I'll strongly consider any patch that would lead to respecting such specification more completely!
Other projects that implement the CommonJS module specification in a similar way: