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を直接使うようにしても良いかもしれません。