rewireで強引にプライベートな関数を取得
2015年2月3日
rewire という npm パッケージを使うと、モジュールの内部で定義されている変数を外側で抽出することができます。
例えば、以下の get-full-name.js というモジュールがあるとして:
var SEPARATOR = ' '; module.exports = function(firstName, lastName){ return firstName + SEPARATOR + lastName; };
上記の SEPARATOR 変数を抽出したい場合は、こう書きます:
var rewire = require('rewire'); var rewiredGetFullName = rewire('./get-full-name.js'); // モジュール直下に定義されている変数を取得できる var separator = rewiredGetFullName.__get__('SEPARATOR');
付属機能として、
__set__ で上書きしたり
revert してそれを戻したり
__with__ で自動で戻したり
できます(詳細は README 参照)。
どうやって実現しているかは、このファイルの internalRewire を見ると、require('module') を使っているようです。
自分は module モジュールの挙動を理解していないので、詳細は不明です。
以上
どうしても、ある npm パッケージ内のある変数が取りたーい!
.. という時は使えるかも。
ただし、
1.「モジュール直下の変数が特別な意味を持つ」というローカルルールが出来る
2. それに伴いビルドツールや AltJS などとクッソ相性が悪くなる
3. Node.js の内部仕様に影響を受けてしまう
これらの制約が生まれるので、使うには注意が必要だと感じました。