LoginSignup
0
1

More than 5 years have passed since last update.

nodejsのcommon jsモジュールに状態を持たせてはいけない。

Posted at

CommonJSでたまにある以下の書き方。


const lib = require("./lib");
lib.data = "module-1";
function libの値をmodule1から取得() {
  return lib.data;
}
exports.libの値をmodule1から取得 = libの値をmodule1から取得;

モジュールのプロパティを使う側で簡単に設定出来るから使ってしまう事があるかもしれない。例えばnpmの日付フォーマッタであるdateformatは曜日を国際化する時に以下のような書き方を指示している。

image.png

しかし、この書き方はするべきではない。何故なら、プロパティが他のモジュールで上書きされてしまう。

以下のサンプルでindex.jsを実行した時にコンソールに表示される値に注目。

image.png

lib.jsの中のLib.dataというプロパティは、module-1.jsでもmodule-2.jsでも同じインスタンスが使われる。module-1.jsの中ではLib.dataのプロパティはmodule-1だが、module-2.jsで値が上書きされてしまう。せっかくモジュールを使っているのに、これじゃあ意味がない。

今回のようにどこでrequireしているか明らかな場合はいいが、npmからモジュールをインストールしたり、そのモジュールが依存した先が依存したりと全てをチェックする事は不可能。

自分で作ったモジュールであればこのような書き方はするべきではないし、既存のモジュールであれば、使う直前に値を再度上書きする必要がある。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1