同じディレクトリまたは親ディレクトリにいるときに、「require」の動作が異なるのはなぜですか?

フィリップパニック

いくつかのコードをテストしているときに、説明できない状況に遭遇しました。何時間もグーグルした後、私は尋ねるべき正しい質問を本当に理解することができませんでした。正しい方向または正しい用語での助けをいただければ幸いです。

したがって、..同じ作業ディレクトリにあるファイルが必要な場合、休憩をとることができます。

const { ports, keys } = require('./activeConfig');
console.log(ports, keys, activeConfig);

この状況ports, keys,activeConfigは、すべてが定義されており、モジュールを使用したかのように使用できます。

const { ports, keys } = require('./activeConfig');
const activeConfig = require('./activeConfig');
console.log(ports, keys, activeConfig);

ただし、次のように外部ディレクトリからまったく同じことを実行しようとすると、次のようになります。

const { ports, keys } = require('../../config/activeConfig');

または

const { ports, keys } = require('./config/activeConfig');

activeConfig が定義されなくなり、エラーが発生します。

インポート元の場所によってこの動作が異なるのはなぜですか?または、これはモジュールをエクスポートする方法と関係がありますか?
私は自分のコードをきちんと整理したいので、2番目のコードを書く必要は避けたいと思いますrequireこれをすべて1行で行う別の方法はおそらくありますか?

私が要求しようとしているモジュールは、休眠コードを持つシングルトンです。

const database = {...}
const keys = {...}
const ports = {...}
const tokens = {...}

module.exports = activeConfig = (() => {
    let _database = database;
    let _keys = keys;
    let _ports = ports;
    let _tokens = tokens;

    return {
        setDatabase: (value) => {
            if (value) {...}
            return activeConfig;
        },
        setKeys: (value) => {
            if (value) {...}
            return activeConfig;
        },
        setPorts: (value) => {
            if (value) {...}
            return activeConfig;
        },
        setTokens: (value) => {
            if (value) {...}
            return activeConfig;
        },
        updateConfig: () => {
               ...
            return activeConfig;
        },
        get database() {
            return _database;
        },
        get keys() {
            return _keys;
        },
        get ports() {
            return _ports;
        },
        get tokens() {
            return _tokens;
        },
        set database(value) {...},
        set keys(value) {...},
        set ports(value) {...},
        set tokens(value) {...}
    };
})();
クリスチャンC.サルバド

何が起こっているのかというと、activeConfigモジュールが暗黙のグローバル変数を宣言しているということです。

この線:

module.exports = activeConfig = (() => { //...

これactiveConfigにより、最初にモジュールが必要になったときに変数がグローバルスコープにリークされます。

その後、他の場所でモジュールが再度必要になると、NodeJSは以前にエクスポートされたオブジェクトをキャッシュからプルするだけで、割り当ては実行されません。

strictモードでコードを実行してみて"use strict"、上部に追加するactiveConfig.jsと、グローバル変数がリークされないことがわかります。

グローバルのリークは悪いことです。代わりに、エクスポートするオブジェクトに同じインスタンスへの参照を配置することをお勧めします。そうすれば、必要なときに「非構造化」できます。

例えば:

"use strict"
module.exports = (() => {
    // ....
    return {
       // ....
        get instance() {
            return this;
        },
    };
})();

そして、あなたがそれを必要とするとき:

const { ports, keys, instance: activeConfig } = require('./config/activeConfig');

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

mvが宛先に同じ名前のディレクトリが存在することに対処できないのはなぜですか?

分類Dev

削除するときにFileZillaがディレクトリに移動するのはなぜですか?

分類Dev

ApacheとRailsは同じサーバーの異なるディレクトリで実行できますか?

分類Dev

「rvmdocsgenerate」が「gemserver」とは異なるディレクトリを出力に使用するのはなぜですか?

分類Dev

同じディレクトリにモジュールをインポートするときにModuleNotFoundが見つかるのはなぜですか?

分類Dev

不完全なディレクトリ名が与えられたときにCDが自動的に選択するのは標準的な動作ですか?

分類Dev

親ディレクトリを失うことなく、同じ名前の複数のファイルを子ディレクトリから別のディレクトリにコピーするにはどうすればよいですか?

分類Dev

ディレクトリが常に同じであるとは限らない場合に、ディレクトリ内の各ディレクトリ名から変数を作成するループを作成することは可能ですか?

分類Dev

このディレクトリを参照する方法に基づいて、同じディレクトリ/ dev / fd /のlsの出力が異なるのはなぜですか?

分類Dev

ルートディレクトリ「/」にその「親」への参照があるのはなぜですか?

分類Dev

Ubuntuサーバーのnodejsでディレクトリを動的に作成しているときにエラーが発生するのはなぜですか?

分類Dev

親ディレクトリにアクセスするためのこのコードがMatlabで機能しないのはなぜですか?

分類Dev

Gitリポジトリが作業ディレクトリよりもはるかに大きいのはなぜですか?

分類Dev

Jupyterツリーの親ディレクトリに移動することはできますか?

分類Dev

「ホームディレクトリにchdirできませんでした」というエラーが表示されるのはなぜですか

分類Dev

MavenがターゲットとgroupIdディレクトリに同じソース用に2つのjarを作成するのはなぜですか

分類Dev

実行可能ファイルと同じディレクトリにあるのに、System.Security.Cryptography.ProtectedDataを読み込めないのはなぜですか

分類Dev

名前は同じで拡張子が異なるファイルのリストを新しいディレクトリにコピーします

分類Dev

〜ディレクトリにあるとき、なぜlsは/ usr /ディレクトリを表示しないのですか?

分類Dev

異なるディレクトリでコンパイルすると、cmakeの動作が異なります

分類Dev

vimの現在の作業ディレクトリがvimが開始された場所と異なるのはなぜですか?

分類Dev

Perlは、パスがディレクトリであるにもかかわらず、まったく同じ上でopendir()を呼び出すことができないことをどのように確認できますか?

分類Dev

refed Dllを.Netのexeファイルと同じディレクトリに配置する必要があるのはなぜですか?

分類Dev

なぜscrパスがないのですか。/それらが同じディレクトリにある場合は?

分類Dev

Djangoの異なるディレクトリで同じ名前のテンプレートを呼び出すにはどうすればよいですか?

分類Dev

Djangoの異なるディレクトリで同じ名前のテンプレートを呼び出すにはどうすればよいですか?

分類Dev

なぜduは同じディレクトリに対して異なるサイズを報告するのですか?

分類Dev

Cargoが同じレジストリに複数のディレクトリを作成するのはなぜですか?

分類Dev

binreleaseディレクトリにSystem。*。* dllがあるのはなぜですか?

Related 関連記事

  1. 1

    mvが宛先に同じ名前のディレクトリが存在することに対処できないのはなぜですか?

  2. 2

    削除するときにFileZillaがディレクトリに移動するのはなぜですか?

  3. 3

    ApacheとRailsは同じサーバーの異なるディレクトリで実行できますか?

  4. 4

    「rvmdocsgenerate」が「gemserver」とは異なるディレクトリを出力に使用するのはなぜですか?

  5. 5

    同じディレクトリにモジュールをインポートするときにModuleNotFoundが見つかるのはなぜですか?

  6. 6

    不完全なディレクトリ名が与えられたときにCDが自動的に選択するのは標準的な動作ですか?

  7. 7

    親ディレクトリを失うことなく、同じ名前の複数のファイルを子ディレクトリから別のディレクトリにコピーするにはどうすればよいですか?

  8. 8

    ディレクトリが常に同じであるとは限らない場合に、ディレクトリ内の各ディレクトリ名から変数を作成するループを作成することは可能ですか?

  9. 9

    このディレクトリを参照する方法に基づいて、同じディレクトリ/ dev / fd /のlsの出力が異なるのはなぜですか?

  10. 10

    ルートディレクトリ「/」にその「親」への参照があるのはなぜですか?

  11. 11

    Ubuntuサーバーのnodejsでディレクトリを動的に作成しているときにエラーが発生するのはなぜですか?

  12. 12

    親ディレクトリにアクセスするためのこのコードがMatlabで機能しないのはなぜですか?

  13. 13

    Gitリポジトリが作業ディレクトリよりもはるかに大きいのはなぜですか?

  14. 14

    Jupyterツリーの親ディレクトリに移動することはできますか?

  15. 15

    「ホームディレクトリにchdirできませんでした」というエラーが表示されるのはなぜですか

  16. 16

    MavenがターゲットとgroupIdディレクトリに同じソース用に2つのjarを作成するのはなぜですか

  17. 17

    実行可能ファイルと同じディレクトリにあるのに、System.Security.Cryptography.ProtectedDataを読み込めないのはなぜですか

  18. 18

    名前は同じで拡張子が異なるファイルのリストを新しいディレクトリにコピーします

  19. 19

    〜ディレクトリにあるとき、なぜlsは/ usr /ディレクトリを表示しないのですか?

  20. 20

    異なるディレクトリでコンパイルすると、cmakeの動作が異なります

  21. 21

    vimの現在の作業ディレクトリがvimが開始された場所と異なるのはなぜですか?

  22. 22

    Perlは、パスがディレクトリであるにもかかわらず、まったく同じ上でopendir()を呼び出すことができないことをどのように確認できますか?

  23. 23

    refed Dllを.Netのexeファイルと同じディレクトリに配置する必要があるのはなぜですか?

  24. 24

    なぜscrパスがないのですか。/それらが同じディレクトリにある場合は?

  25. 25

    Djangoの異なるディレクトリで同じ名前のテンプレートを呼び出すにはどうすればよいですか?

  26. 26

    Djangoの異なるディレクトリで同じ名前のテンプレートを呼び出すにはどうすればよいですか?

  27. 27

    なぜduは同じディレクトリに対して異なるサイズを報告するのですか?

  28. 28

    Cargoが同じレジストリに複数のディレクトリを作成するのはなぜですか?

  29. 29

    binreleaseディレクトリにSystem。*。* dllがあるのはなぜですか?

ホットタグ

アーカイブ