それなりブログ

とあるWebエンジニアのそれなりのブログ、JavaScript/Node.js/Python/PHP/ゲーム作成 など

rewireで強引にプライベートな関数を取得

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

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



コメントを残す

メールアドレスが公開されることはありません。

Categories

Archives