I have been using the fantastic "browserify", which works like a charm. This is an alternative to using Arunda's NPM Atmosphere package, or using Npm.require with package.js, that arguably has some advantages:
- My code can use plain old "require" instead of Npm.require or Meteor.require. Obviously this is not a huge deal, but if I want to use this code outside Meteor it's nice to feel it's not dependent on Meteor.
- I don't have to worry about whether Meteor will once again change the way it thinks about Npm integration again.
- It allows me to use local development version of my own npm modules using npm link.
Here's how it works:
- I create a separate project for npm dependencies in a hidden .npm folder
- I use browserify to create a bundle.js that will be loaded by meteor
- I use grunt watch to make sure that every time I install a new npm package, the bundle.js is updated
Here's my directory structure:
my_meteor_project/
lib/
bundle.js
.npm/
node_modules
README.md
Gruntfile.js
entrypoint.js
package.json
Here's an example of entrypoint.js (unfortunately I have to use globals so that assert, url, and _ are available in Meteor code)
assert = require('assert');
url = require("url");
_ = require('underscore');
Here's the gruntfile:
module.exports = function(grunt) {
grunt.initConfig({
watch: {
build: {
files: ['./entrypoint.js', './package.json'],
tasks: ['browserify2'],
options: {
}
}
},
browserify2: {
compile: {
entry: './entrypoint.js',
compile: '../lib/bundle.js'
}
},
});
grunt.loadNpmTasks('grunt-browserify2');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('build', ['browserify2']);
};
I then use grunt watch to watch for changes to entry.js or new NPM installs
$ cd .npm
$ grunt watch:build &
[2] 44617
$ Running "watch:build" (watch) task
Waiting...
And then if I install an npm module, or modify entrypoint.js, bundle.js is updated:
$ npm install url -save
npm http GET https://registry.npmjs.org/punycode
npm http GET https://registry.npmjs.org/querystring
npm http 304 https://registry.npmjs.org/punycode
npm http 304 https://registry.npmjs.org/querystring
url@0.7.9 node_modules/url
├── querystring@0.1.0
└── punycode@1.0.0
$ OK
>> File "package.json" changed.
Running "browserify2:compile" (browserify2) task
File written to: ../lib/bundle.js
Done, without errors.
Completed in 1.256s at Thu Jul 11 2013 11:36:22 GMT-0600 (MDT) - Waiting...