benvを使う時にはrequire.resolveを使ったほうが良いかも

以前angular.jsをnode.js上で動くようにするためにbenvを使う記事を書きました。 そこでは以下の様なコードを書いていました。しかしもう少しマシにできそうなのでその辺りのアップデートをします。

benv.setup(function(){
    global.Node = window.Node;
    benv.expose({
      angular: benv.require('./node_modules/angular/angular.js', 'angular')
    });
  });
}

以下のような不満があります。

  • angular.jsの在処を直接pathを指定して渡すのは不格好
  • global.Nodeの記述やっぱり気になる
  • requireしたものがjshintやeslintでundefinedと解釈される

angular.jsの在処を直接pathを指定して渡すのは不格好

これは require.resolve を使うのが良さそうです。

 require.resolve("angular")
'/home/podhmo/js-sandbox/angular/api-test/node_modules/angular/index.js'

global.Nodeの記述がやっぱり気になる

benv/index.jsの以下のような domGlobals の定義部分に "Node" を追加できれば解決しそうでした。 あるいはexportしてくれていると楽なのですが。

// benv/index.js
var domGlobals = [
  'navigator',
  'document',
  'location',
  'getComputedStyle',
  'btoa'
];

benv.exposeしたものがjshintやeslintでundefinedと解釈される。

特に解決策が思いつきません。lintをごまかすcommentを書くとかで暫定的に対応してます。

以下のような

/* global angular */

さいごに

以下の様なコードになりました。

'use strict';
/* global angular */

benv.setup(function(){
    global.Node = window.Node;
    benv.expose({
      angular: benv.require(require.resolve('angular/angular'), 'angular')
    });
  });
}

benv のコードはすごく小さいので中の挙動を把握するのは難しく無さそうです。 やる気があったり気に入らなかったら自分で似たようなモジュールを書くかjsdomを直接使うようにしても良いかもしれません。