需要在全球范围内还是在本地范围内?

Require in global scope or local scope?

需要节点模块的正确方法是什么?是在全局范围内声明模块更accurate/understandable,还是在局部范围内声明模块更accurate/understandable?

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

全球:

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")
        }
    })
}

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

我希望改进我的代码,以便其他人可以更轻松地理解它,我认为这个问题与此目的相关,因此不应将其视为自以为是的问题。

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

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

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