いくつかのコードをテストしているときに、説明できない状況に遭遇しました。何時間もグーグルした後、私は尋ねるべき正しい質問を本当に理解することができませんでした。正しい方向または正しい用語での助けをいただければ幸いです。
したがって、..同じ作業ディレクトリにあるファイルが必要な場合、休憩をとることができます。
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) {...}
};
})();
何が起こっているのかというと、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]
コメントを追加