簡體   English   中英

當我在同一目錄或父目錄中時,為什么“require”的行為會有所不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM