CommonJSでたまにある以下の書き方。
const lib = require("./lib");
lib.data = "module-1";
function libの値をmodule1から取得() {
return lib.data;
}
exports.libの値をmodule1から取得 = libの値をmodule1から取得;
モジュールのプロパティを使う側で簡単に設定出来るから使ってしまう事があるかもしれない。例えばnpmの日付フォーマッタであるdateformatは曜日を国際化する時に以下のような書き方を指示している。
しかし、この書き方はするべきではない。何故なら、プロパティが他のモジュールで上書きされてしまう。
以下のサンプルでindex.jsを実行した時にコンソールに表示される値に注目。
lib.jsの中のLib.dataというプロパティは、module-1.jsでもmodule-2.jsでも同じインスタンスが使われる。module-1.jsの中ではLib.dataのプロパティはmodule-1だが、module-2.jsで値が上書きされてしまう。せっかくモジュールを使っているのに、これじゃあ意味がない。
今回のようにどこでrequireしているか明らかな場合はいいが、npmからモジュールをインストールしたり、そのモジュールが依存した先が依存したりと全てをチェックする事は不可能。
自分で作ったモジュールであればこのような書き方はするべきではないし、既存のモジュールであれば、使う直前に値を再度上書きする必要がある。