【Node.js】 同じスクリプトをrequireした中でrequireするとどうなるのか
更新日:2020/05/05
ツイート
Node.jsで同じスクリプトを複数回requireしたときの挙動を調べてみました。
■お願い
去年ECMAScript2020を頑張って日本語訳しましたが、誰も見てくれません・・・
誰かみて!!
【JavaScript】 学習のためECMAScript2020を日本語訳してみました
同じスクリプト内で複数回呼び出す
まずは一つのスクリプト内で、同じスクリプトを2回requireするとどうなるのか確認してみます。
■呼び出されるスクリプト
require-test.js
console.log( "test:load"); exports.test = (()=>{ let m = "No Message"; return { set message(t){ m = t; }, get message(){ return m; } }; })();
■呼び出すスクリプト
require-main.js
console.log( "1回目" ); const test1 = require("./require-test.js"); test1.test.message = "hello"; console.log( "2回目" ); const test2 = require("./require-test.js"); console.log( test2.test.message ); console.log( "同一?:" + Object.is(test1 ,test2) );
■実行結果
> node require-main.js 1回目 test:load 2回目 hello 同一?:true
■結論
- 同じスクリプトがロードされるのは、一度だけ。
- requireは同じオブジェクトを返す
同じスクリプトを、requireしたスクリプト内でも呼び出す
次は同じスクリプトを、requireしたスクリプト内でも呼び出してみます。
具体的には、次のようなことを実行します。
- require-main.jsでrequire-test.jsを呼び出す。
- require-test.jsを呼び出すrequire-sub.jsを、require-main.jsで呼び出す。
■呼び出されるスクリプト
require-test.js
console.log( "test:load"); exports.test = (()=>{ let m = "No Message"; return { set message(t){ m = t; }, get message(){ return m; } }; })();
■呼び出すスクリプト main
require-main.js
console.log( "test呼び出し" ); const test1 = require("./require-test.js"); test1.test.message = "hello"; console.log( "sub呼び出し" ); const test2 = require("./require-sub.js"); console.log( test2.test.message ); console.log( "同一?:" + test2.sub.isObj( test1 ) );
■呼び出すスクリプト sub
require-sub.js
const rq = require("./require-test.js"); exports.sub ={ get message(){ return rq.test.message; }, isObj( obj ){ return rq.test.message; }, };
■実行結果
> node require-main.js test呼び出し test:load sub呼び出し hello 同一?:true
■結論
- 呼び出す階層に関係なく同じスクリプトがロードされるのは、一度だけ。
- requireは同じオブジェクトを返す
まとめ
同じスクリプトをrequireすると、親子関係に関係なく同じオブジェクトを参照します。
他から入手したライブラリなどで、同じスクリプトを使用していると不具合が出そうです。
注意が必要ですね。
なおimportについても調べているので、一度チェックしてください。
Node.jsで同じスクリプトをrequireした中でrequireするとどうなるのか
注:結論 importも親子関係に関係なく同じオブジェクトを参照します。
記事の内容について

説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
ご意見はこちら。
https://note.affi-sapo-sv.com/info.php
【お願い】

■このページのURL
■このページのタイトル
■リンクタグ