旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

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 の内部仕様に影響を受けてしまう

これらの制約が生まれるので、使うには注意が必要だと感じました。