Требуется в глобальной или локальной области?

#javascript #node.js #module #scope

#javascript #node.js #модуль #область

Вопрос:

Каков правильный способ потребовать модуль узла? Является ли более точным / понятным объявление модуля в глобальной области или более точным / понятным объявление модуля в локальной области?

Например, какой из них имеет наибольший смысл:

Глобальный:

 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:

Во-первых, небольшое исправление. Ваш первый пример не является глобальной областью. Это область модуля. Область модуля с объявлением, расположенным в начале вашего файла модуля, является предпочтительной реализацией по следующим причинам:

  1. Он загружается при запуске (см. Текст ниже, почему это хорошо).
  2. Расположение всего этого в начале вашего файла модуля четко указывает в коде, какие зависимости от внешних модулей у вас есть, в удобном для просмотра виде, что полезно для любого, кто вернется к этому коду в будущем для выполнения обслуживания (включая вас).
  3. Вы используете этот модуль только require() один раз в этом модуле. Пока модули кэшируются, лучше не вызывать require() их каждый раз, когда вы хотите ссылаться на них. Загрузите его один раз и используйте эту сохраненную ссылку на модуль.

Что касается пункта 1 выше, require() он является блокирующим и синхронным и включает доступ к файловой системе (при первой загрузке этого файла). Обычно вы хотите выполнять все свои require() операции при запуске сервера, чтобы во время обработки запросов не происходило никаких операций блокировки. И, если вы получаете какие-либо ошибки require() (например, отсутствие установки модуля или конфликт версий, плохая конфигурация или отсутствующая зависимость или что-то в этом роде), вы также хотите, чтобы это происходило во время запуска, а не позже, когда их быстрее увидеть и легче диагностировать.

Комментарии:

1. Одна из проблем для меня в вашем первом абзаце: если я пишу файл javascript, который будет запускаться с использованием node.js : например $> node myFile.js , у которого нет module exports , это все еще модуль? Я смотрю на local vs global scope с точки зрения файла js… Может быть, я что-то упускаю…

2. @Dshiz — Да, это все еще модуль. Если бы вы объявили эту переменную на верхнем уровне, а затем загрузили какой-либо другой модуль, ваша переменная была бы доступна только в этом файле, она не была бы доступна глобально для других модулей. Каждый файл кода commonjs, который вы используете в nodejs, будь то основной, загружаемый из командной строки или загружаемый через require() all, получает свой код, завернутый в оболочку модуля , которая делает все объявления верхнего уровня только в области модуля. Подробности см. По этой ссылке.

3. Спасибо.. Вы довольно вездесущи на этом сайте; Я всегда ценю ваши ответы на мои вопросы и на другие…

4. @Dshiz — Да, я, вероятно, должен работать над другими вещами, но мне нравится отвечать на вопросы здесь. Рад помочь.