【问题标题】:Require in global scope or local scope?需要在全局范围内还是在本地范围内?
【发布时间】:2021-04-30 20:56:34
【问题描述】:

要求节点模块的正确方法是什么?在全局范围内声明模块更准确/易于理解,还是在本地范围内声明模块更准确/易于理解?

例如,以下哪个最有意义:

全球:

let dns = require('dns') // <-- Global scope declaration
function lookup(subdomain, domain){
    let fqdn
    if(subdomain == '@'){
        fqdn = domain
    } else {
        fqdn = `${subdomain}.${domain}`
    }
    dns.resolveTxt(fqdn, (err, records) => {
        if(records){
            console.log(records)
        } else {
            console.log("no recrods")
        }
    })
}

本地:

function lookup(subdomain, domain){
    let dns = require('dns') // <-- Local scope declaration
    let fqdn
    if(subdomain == '@'){
        fqdn = domain
    } else {
        fqdn = `${subdomain}.${domain}`
    }
    dns.resolveTxt(fqdn, (err, records) => {
        if(records){
            console.log(records)
        } else {
            console.log("no recrods")
        }
    })
}

这是一个意见问题吗?如果是这样,我很抱歉,我会删除这个问题。

我希望改进我的代码,以便其他人更容易理解它,我认为这个问题与此目的相关,因此不应将其视为一个固执己见的问题。

【问题讨论】:

    标签: javascript node.js module scope


    【解决方案1】:

    首先,一个小的修正。您的第一个示例不是全局范围。那是模块范围。声明位于模块文件开头的模块范围是首选实现,原因如下:

    1. 它在启动时加载(请参阅下面的文字了解为什么这样做很好)。
    2. 将所有这些内容放在模块文件的开头,以一种易于查看的方式清楚地在代码中说明了您拥有哪些外部模块依赖项,这对于将来返回此代码进行维护的任何人(包括您)。
    3. 你在这个模块中只require()这个模块一次。虽然缓存了模块,但最好不要在每次要引用它时都调用require()。加载一次并使用保存的模块引用。

    关于上面的第 1 点,require() 是阻塞和同步的,并且涉及访问文件系统(第一次加载该文件时)。您通常希望在服务器启动时完成所有 require() 操作,因此在处理请求时不会发生阻塞操作。而且,如果您从require() 收到任何错误(例如模块安装丢失或版本冲突或错误配置或缺少依赖项或类似的东西),您还希望这些错误发生在启动时,而不是稍后发生的更快的地方更容易诊断。

    【讨论】:

    • 在您的第一段中对我来说有一点困惑:如果我正在编写一个将使用 node.js 运行的 javascript 文件:例如$&gt; node myFile.js 没有 module exports,那还是一个模块吗?我正在从 js 文件的角度查看 localglobal 范围......也许我错过了一些东西......
    • @Dshiz - 是的,它仍然是一个模块。如果您要在顶层声明此变量,然后加载其他模块,则您的变量将仅在此文件中可用,其他模块无法全局使用。您在 nodejs 中使用的每个 commonjs 代码文件,无论是从命令行加载的主要文件还是通过 require() 加载的文件,都将其代码包装到 module wrapper 中,这使得所有顶级声明仅在模块范围内。有关详细信息,请参阅该链接。
    • 谢谢你.. 你在这个网站上无处不在;我一直很感激您对我和其他人的问题的回答......
    • @Dshiz - 是的,我可能应该做其他事情,但我喜欢在这里回答问题。很高兴能提供帮助。
    猜你喜欢
    • 2019-01-25
    • 2013-11-06
    • 1970-01-01
    • 2021-03-05
    • 2012-08-19
    • 2013-08-18
    • 1970-01-01
    • 2019-07-04
    • 2022-07-06
    相关资源
    最近更新 更多