RequireJSが好きになれないのでcommonjs-everywhereを試してみた

RequireJS実際に使ったことはないんですが、[Why I stopped using AMD](http://codeofrob.com/entries/why-i-stopped-using-amd.html)の最初のコード例を見てもどうも好きになれないので代替ツールを探してcommonjs-everywhereというのを試してみました。

[And just like that Grunt and RequireJS are out, it's all about Gulp and Browserify now » { 100PercentJS }](http://www.100percentjs.com/just-like-grunt-gulp-browserify-now/) とコメントを見て、さらに検索してみたところ代替ツールとしては以下のものがあるようです。

* [browserify](http://browserify.org/)
* [webpack/webpack](https://github.com/webpack/webpack)
* [michaelficarra/commonjs-everywhere](https://github.com/michaelficarra/commonjs-everywhere)

webpackは高機能だけど覚えるのが大変そうなのでパスして、commonjs-everywhereを試してみました。
プロジェクトの説明に"minimal CommonJS browser bundler with aliasing, extensibility, and source maps"と書かれていて、minimalistな私にはグッときます。

```shell-session
npm install -g commonjs-everywhere
```

でインストール。

[Modules/1.1.1 - CommonJS Spec Wiki](http://wiki.commonjs.org/wiki/Modules/1.1.1)のサンプルのjsファイルを使いました。

```js:src/math.js
exports.add = function() {
    var sum = 0, i = 0, args = arguments, l = args.length;
    while (i < l) {
        sum += args[i++];
    }
    return sum;
};
```

```js:src/increment.js
var add = require('math').add;
exports.increment = function(val) {
    return add(val, 1);
};
```

```js:src/program.js
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
 
module.id == "program";
```

```shell-session
cjsify -r src program.js > bundle.js
```

で連結。結果はこちら。使い方も出力もシンプルでいい感じです。

```js:bundle.js
// Generated by CommonJS Everywhere 0.9.7
(function (global) {
  function require(file, parentModule) {
    if ({}.hasOwnProperty.call(require.cache, file))
      return require.cache[file];
    var resolved = require.resolve(file);
    if (!resolved)
      throw new Error('Failed to resolve module ' + file);
    var module$ = {
        id: file,
        require: require,
        filename: file,
        exports: {},
        loaded: false,
        parent: parentModule,
        children: []
      };
    if (parentModule)
      parentModule.children.push(module$);
    var dirname = file.slice(0, file.lastIndexOf('/') + 1);
    require.cache[file] = module$.exports;
    resolved.call(module$.exports, module$, module$.exports, dirname, file);
    module$.loaded = true;
    return require.cache[file] = module$.exports;
  }
  require.modules = {};
  require.cache = {};
  require.resolve = function (file) {
    return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0;
  };
  require.define = function (file, fn) {
    require.modules[file] = fn;
  };
  var process = function () {
      var cwd = '/';
      return {
        title: 'browser',
        version: 'v0.10.26',
        browser: true,
        env: {},
        argv: [],
        nextTick: global.setImmediate || function (fn) {
          setTimeout(fn, 0);
        },
        cwd: function () {
          return cwd;
        },
        chdir: function (dir) {
          cwd = dir;
        }
      };
    }();
  require.define('/program.js', function (module, exports, __dirname, __filename) {
    var inc = require('/increment.js', module).increment;
    var a = 1;
    inc(a);
    module.id == 'program';
  });
  require.define('/increment.js', function (module, exports, __dirname, __filename) {
    var add = require('/math.js', module).add;
    exports.increment = function (val) {
      return add(val, 1);
    };
  });
  require.define('/math.js', function (module, exports, __dirname, __filename) {
    exports.add = function () {
      var sum = 0, i = 0, args = arguments, l = args.length;
      while (i < l) {
        sum += args[i++];
      }
      return sum;
    };
  });
  require('/program.js');
}.call(this, this));
```

ちなみにbrowserifyも試してみたのですが、モジュールが見つけられないというエラーになってしまいました。よくわからないので放置。

```shell-session
$ browserify src/program.js > browser.js
Error: module "increment" not found from "/Users/hnakamur/sandbox/js/commonjs-example/src/program.js"
$ cd src
$ browserify program.js -o ../browser.js
Error: module "increment" not found from "/Users/hnakamur/sandbox/js/commonjs-example/src/program.js"
```