![](/img/trans.png)
[英]Why does require not behave the same as import when same structure is given
[英]Why does “require” behave differently when I am in the same directory or a parent directory?
在測試一些代碼時,我遇到了一個我無法解釋的情況。 經過幾個小時的谷歌搜索,我無法找出正確的問題。 任何正確方向的幫助或正確的術語將不勝感激..!
所以,..當我需要一個位於同一工作目錄中的文件時,我能夠做到這一點:
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
,我收到錯誤。
為什么這種行為會有所不同,具體取決於我從中導入的位置? 或者這與我導出模塊的方式有關?
我想保持我的代碼干凈整潔,所以我寧願避免編寫第二個require
。 是否有一種不同的方法可以在一行中完成所有這些操作?
我試圖要求的模塊是一個包含以下代碼的Singleton:
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將簡單地從緩存中提取先前導出的對象,並且它不會執行分配。
嘗試在嚴格模式下運行代碼,在activeConfig.js
的頂部添加"use strict"
,您將看到它不會讓您泄漏全局變量。
泄漏全局變量很糟糕,我建議你在導出的對象中引用同一個實例,這樣就可以在需要時對其進行“解構”。
例如:
"use strict"
module.exports = (() => {
// ....
return {
// ....
get instance() {
return this;
},
};
})();
然后當你需要它時:
const { ports, keys, instance: activeConfig } = require('./config/activeConfig');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.