サーバーサイド

【Node.js】 同じスクリプトをrequireした中でrequireするとどうなるのか

更新日:2020/05/05

Node.jsで同じスクリプトを複数回requireしたときの挙動を調べてみました。

 

同じスクリプト内で複数回呼び出す

まずは一つのスクリプト内で、同じスクリプトを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

■結論

  1. 同じスクリプトがロードされるのは、一度だけ。
  2. requireは同じオブジェクトを返す

 

同じスクリプトを、requireしたスクリプト内でも呼び出す

次は同じスクリプトを、requireしたスクリプト内でも呼び出してみます。

具体的には、次のようなことを実行します。

  1. require-main.jsでrequire-test.jsを呼び出す。
  2. 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

■結論

  1. 呼び出す階層に関係なく同じスクリプトがロードされるのは、一度だけ。
  2. requireは同じオブジェクトを返す

 

まとめ

同じスクリプトをrequireすると、親子関係に関係なく同じオブジェクトを参照します。

他から入手したライブラリなどで、同じスクリプトを使用していると不具合が出そうです。

注意が必要ですね。

なおimportについても調べているので、一度チェックしてください。
Node.jsで同じスクリプトをrequireした中でrequireするとどうなるのか
注:結論 importも親子関係に関係なく同じオブジェクトを参照します。

更新日:2020/05/05

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。