Автор оригинала: FreeCodeCamp Community Member.
Srishti Gupta
Модули
Например, если у вас есть файл, содержащий какой-код, и этот файл называется xyz.js
Затем этот файл рассматривается как модуль В узле, и вы можете сказать, что вы создали модуль с именем XYZ
Отказ
Давайте возьмем пример, чтобы понять это лучше.
У вас есть файл с именем Circle.js
Который состоит из логики для расчета области и окружности круга данного радиуса, как указано ниже:
Circle.js.
Вы можете позвонить Circle.js
Файл модуль с именем круг
Отказ
Вам может быть интересно, почему есть необходимость иметь несколько модулей? Вы могли бы только написать весь код в одном модуле. Ну, очень важно написать модульный код. Модульным, я хочу сказать, что ваш код должен быть независимым и должен быть свободно связан. Представьте себе, что есть большое приложение, и у вас есть весь ваш код, написанный только в одном месте, только один файл. Слишком грязный, верно?
Как код написан внутри модуля?
Перед выполнением кода, написанного внутри модуля, узел берет весь код и включает его в функциональную обертку. Синтаксис этой функциональной обертки:
Функциональная обертка для круг
Модуль будет выглядеть так, как указано ниже:
Вы можете видеть, что на корневом уровне есть функциональная обертка, охватывающая весь код, написанный внутри круг
модуль.
Это самое значительное преимущество имеющих модулей в Node.js. Даже если вы определяете глобальную переменную в модуле, используя var
, Пусть
или Const
Ключевые слова, переменные находятся на местном уровне к модулю, а не находятся на уровне глобально. Это происходит, потому что каждый модуль имеет собственную функцию, и код, написанный внутри одной функции, является локальным для этой функции и не может быть доступна вне этой функции.
Представьте, что есть два модуля – А и B Отказ Код, написанный внутри Модуль A заключен в функциональную обертку, соответствующую Модуль A Отказ Подобное случается с кодом, написанным внутри Модуль B Отказ Поскольку код, относящийся к обеим модулям, заключается в различных функциях, эти функции не смогут получить доступ к коду друг друга. (Помните, что каждая функция в JavaScript имеет свой локальный объем?) Это причина, по которой Модуль A не может получить доступ к коду, написанному внутри Модуль B и наоборот.
Пять параметров – Экспорт
, требуется
, модуль
, __Filename
, __dirname
Доступны внутри каждого модуля в узле. Хотя эти параметры глобальные к коду в модуле, но они являются локальными для модуля (из-за функциональной обертки, как описано выше). Эти параметры предоставляют ценную информацию, связанную с модулем.
Давайте пересмотрим круг
Модуль, который вы посмотрели ранее. Есть три конструкции, определенные в этом модуле – постоянная переменная PI
, функция по имени Calculatearea
и другая функция имени CalculateCircummenter
Отказ Важным моментом, чтобы иметь в виду, что все эти конструкции являются частными для круг
модуль по умолчанию. Это означает, что вы не можете использовать эти конструкции в любом другом модуле, если явно не указан.
Итак, вопрос, который возникает сейчас, заключается в том, как вы указываете что-то в модуле, который можно использовать каким-то другим модулем? Это когда модуль
& требуется
Параметры функциональной обертки полезны. Давайте обсудим эти два параметра в этой статье.
модуль
модуль
Параметр (скорее ключевое слово в модуле в узле) относится к объекту, представляющему Текущий модуль Отказ Экспорт
это ключ модуль
объект, соответствующее значение которого является объектом. Значение по умолчанию Module.exports
Объект это {}
(пустой объект). Вы можете проверить это, войдя в систему со значением модуль
ключевое слово внутри любого модуля. Давайте проверим, какова стоимость модуль
Параметр внутри круг
модуль.
Circle.js.
Обратите внимание, что есть console.log (модуль);
Заявление в конце кода в файле, указанном выше. Когда вы видите вывод, он будет регистрировать модуль
Объект, который имеет ключ с именем Экспорт
и значение, соответствующее этому ключу, является {}
(пустой объект).
Теперь, что делает Module.exports
объект делает? Ну, он используется для определения вещей, которые можно экспортировать модулем. Все равно, что экспортируется из модуля, может быть, в свою очередь, доступно для других модулей. Экспорт чего-то довольно просто. Вам просто нужно добавить его в Module.exports
объект. Есть три способа добавить что-то в Module.exports
объект будет экспортирован. Давайте обсудим эти методы один за другим.
Метод 1: (Определение конструкций, а затем используя несколько Module.exports
утверждения для добавления свойств)
В первом способе вы сначала определяете конструкции, а затем используете несколько Module.exports Заявления, где каждое утверждение используется для экспорта чего-либо из модуля. Давайте посмотрим на этот метод в действии и посмотрим, как вы можете экспортировать две функции, определенные в круг
модуль.
Circle.js.
Как я говорил вам ранее, модуль
это объект, имеющий ключ с именем Экспорт
И этот ключ ( Module.exports
), в свою очередь, состоит из другого объекта. Теперь, если вы заметите указанный выше код, все, что вы делаете, добавляет новые свойства (пары клавишных значений) в Module.exports
объект.
Первая недвижимость имеет ключ Calculatearea
(Определено на линии 19) И значение, написанное на правой стороне оператора назначения, является функция, определенная с именем Calculatearea
(на линии 9).
Второе свойство (определено в строке 20) имеет ключ CalculateCircummenter
И значение – это функция, определенная с именем CalculateCircummenter
(на линии 16).
Таким образом, вы назначили два свойства (пары клавишных пар) на Module.exports
объект.
Также давайте не будем забывать, что вы использовали здесь нотацию. Вы можете альтернативно использовать нотацию кронштейна для присвоения свойств для Module.exports
Объект и добавить функции – Calculatearea
и CalculateCircummenter
Указав ключи после нотации кронштейна. Таким образом, вы можете написать следующие две строки для добавления свойств на Module.exports
Объект с использованием нотации кронштейна при замене последних двух строк (используя точечную обозначение) в указанном выше:
// exporting stuff by adding to module.exports object using the bracket notation
module.exports['calculateArea'] = calculateArea;module.exports['calculateCircumference'] = calculateCircumference;
Давайте теперь попробуем регистрировать значение Module.exports
Объект после добавления свойств. Обратите внимание, что в конце кода добавляется следующее утверждение в файле, указанном ниже:
// logging the contents of module.exports object after adding properties to it
console.log(module.exports);
Circle.js.
Давайте проверим вывод этого кода и посмотрите, все ли работает нормально. Для этого сохранить свой код и запустите следующую команду в своем Терминал :
node circle
Выход:
{ calculateArea: [Function: calculateArea], calculateCircumference: [Function: calculateCircumference] }
Конструкции – Calculatearea
и CalculateCircummenter
, добавлен к Module.exports
, объект зарегистрирован. Таким образом, вы успешно добавили два свойства в Module.exports
объект так, чтобы функции – Calculatearea
и CalculateCircummenter
можно экспортировать из круг
Модуль к другому модулю.
В этом методе вы сначала определили все конструкции, а затем используемые несколько Module.exports Заявления, где каждое утверждение используется для добавления свойства для Module.exports
объект.
Способ 2: (Определение конструкций, а затем используя единое Module.exports
Заявление для добавления свойств)
Другой способ – сначала определить все конструкции (как вы делали в более раннем методе), но используйте один Module.exports
заявление для экспорта их всех. Этот метод аналогичен синтаксису объекта буквального обозначения, где вы добавляете все свойства на объект одновременно.
Здесь вы использовали буквальную обозначение объекта и добавили как функции – Calculatearea
и CalculateCircummenter
(все сразу) к Module.exports
Объект, написав один Module.exports утверждение.
Если вы проверяете выход этого кода, вы получите тот же результат, что и у вас ранее при использовании метода 1.
Метод 3: (Добавление свойств на Module.exports
объект при определении конструкций)
В этом методе вы можете добавить конструкции для Module.exports
объект при определении их. Давайте посмотрим, как этот метод может быть принят в нашем круг
модуль.
В указанном выше коде вы можете видеть, что функции в модуле добавлены к Module.exports
объект, когда они определяются. Давайте посмотрим на то, как это работает. Вы добавляете ключ Calculatearea
к Module.exports
Объект и значение, соответствующее этому ключу, является определение функции.
Обратите внимание, что функция больше не имеет никакого имени и является анонимной функцией, которая просто рассматривается как значение для ключа объекта. Таким образом, эта функция не может быть ссылаться в круг
Модуль, и вы не можете вызывать эту функцию внутри этого модуля, написав следующее утверждение:
calculateArea(8);
Если вы попытаетесь выполнить вышеуказанное утверждение, вы получите Собственный ресурс
СТАЙТЕ Calculatearea не определена
Отказ
Теперь, когда вы узнали, как вы можете указать, что необходимо экспортировать из модуля, как вы думаете, насколько другой модуль сможет использовать экспортированный материал? Вам необходимо импортировать модуль на какой-то другой модуль, чтобы иметь возможность использовать экспортированный материал из первого в последнем. Это когда нам нужно обсудить другой параметр с именем требуется
Отказ
требовать
требуется
Ключевое слово относится к функции, которая используется для импорта всех конструкций, экспортируемых с использованием Module.exports
объект из другого модуля. Если у вас есть модуль х В котором вы экспортируете некоторые конструкции, используя Module.exports
Объект, и вы хотите импортировать эти экспортированные конструкции в модуле y Тогда вам нужно требовать модуля х В модуле y используя требуется
функция. Значение, возвращенное требуется
Функция в модуле y равно Module.exports
объект в модуле х Отказ
Давайте понять это, используя пример, который мы обсуждали ранее. У тебя уже есть круг
Модуль, из которого вы экспортируете функции Calculatearea
и CalculateCircummenter
Отказ Теперь давайте посмотрим, как вы можете использовать требуется
Функция для импорта экспортируемых вещей в другом модуле.
Давайте сначала создам новый файл, в котором вы будете использовать экспортированный код из круг
модуль. Давайте назвать этот файл app.js
И вы можете назвать это приложение
модуль.
Цель состоит в том, чтобы импортировать в приложение
Модуль весь код экспортируется из круг
модуль. Итак, как вы можете включить ваш код, написанный в одном модуле внутри другого модуля?
Рассмотрим синтаксис требуется
Функция, приведенная ниже:
const variableToHoldExportedStuff = require('idOrPathOfModule');
требуется
Функция принимает аргумент, который может быть идентификатор или путь. ID относится к идентификатору (или имени) модуля, необходимого. Вы должны предоставить идентификатор в качестве аргумента, когда вы используете сторонние модули или основные модули, предоставленные управляющим узлом пакета. С другой стороны, когда у вас есть пользовательские модули, определенные вами, вы должны предоставить путь модуля в качестве аргумента. Вы можете прочитать больше о функции нужды из это ссылка на сайт.
Потому что вы уже определили пользовательский модуль с именем круг
Вы будете предоставлять путь в качестве аргумента для требуется
функция.
app.js.
Если вы заметите четко, точка в начале пути означает, что это относительный путь и что модули приложение
и круг
хранятся на том же пути.
Давайте войдем в консоль круг
Переменная, которая содержит результат, возвращаемый требуется
функция. Давайте посмотрим, что содержится внутри этой переменной.
app.js.
Проверьте выходные данные, сохраняя весь свой код и запустив следующую команду в вашем терминале (последнее не требуется, если у вас есть Nodemon
Установлен пакет):
node app
Выход:
{ calculateArea: [Function: calculateArea],calculateCircumference: [Function: calculateCircumference] }
Как вы можете видеть, требуется
Функция Возвращает объект, ключи которых являются именами переменных/функций, которые были экспортированы из требуемого модуля ( Circle
). Короче говоря, требуется
Функция возвращает Module.exports
объект.
Давайте теперь доступ к функциям, импортированным из круг
модуль.
app.js.
Выход:
Area = 200.96, Circumference = 50.24
Как вы думаете, что произойдет, если я попытаюсь получить доступ к переменной имени PI
Определяется в круг
Модуль внутри приложение
модуль?
app.js.
Выход:
Area = 200.96, Circumference = 50.24pi = undefined
Можете ли вы понять, почему PI
это undefined
? Ну, это потому, что переменная PI
не экспортируется из круг
модуль. Помните, как я сказал вам, что вы не можете получить доступ к коду, написанному внутри модуля в другом модуле для всего кода, написанного внутри модуля, является частным для него, если не экспортируется? Здесь вы пытаетесь получить доступ к чему-то, что не было экспортировано из круг
модуль и является частным для него.
Итак, вам может быть интересно, почему вы не получили Собственный ресурс
Отказ Это потому, что вы пытаетесь получить доступ к ключу с именем PI
внутри Module.exports
Объект, возвращенный требуется
функция. Вы также знаете, что ключ с именем PI
не существует в Module.exports
объект.
Обратите внимание, что когда вы пытаетесь получить доступ к несуществующей ключе в объекте, вы получаете результат как undefined
Отказ Это причина, по которой вы получаете PI
как undefined
вместо того, чтобы получить Собственный ресурс
Отказ
Теперь, давайте экспортируем переменную PI
от круг
Модуль и посмотрите, изменяется ли ответ.
Circle.js.
Обратите внимание, что здесь вы не используете имя переменной PI
Как ключ от свойства добавлен в Module.exports
объект. Вы вместо этого используете другое имя, которое является lifeofpi
Отказ
Это интересная вещь, чтобы отметить. Когда вы экспортируете некоторые кодирующие конструкции, вы можете дать любое имя ключ при добавлении свойства, добавленного в Module.exports
объект. Не обязательно использовать то же имя, что и имя, которое вы использовали при определении конструкции. Это потому, что вы можете использовать любой действительный идентификатор в качестве ключа в объекте JavaScript. Таким образом, на левой стороне оператора назначения вы можете использовать любой действительный идентификатор, но с правой стороны оператора назначения вам необходимо предоставить значение, которое определяется как конструкция в объеме текущего модуля (как вы определил переменные и функции в модуле «круга»).
Важным моментом, который следует отметить, является то, что при импорте чего-либо из другого модуля в текущем модуле необходимо использовать тот же ключ, который вы использовали во время экспорта.
app.js.
Потому что вы использовали ключ lifeofpi
, вам нужно использовать один и тот же ключ для доступа к переменной PI
Определяется в круг
Модуль, как делается в указанном выше коде.
Выход:
Area = 200.96, Circumference = 50.24pi = 3.14
Как вы думаете, что произойдет, если вы используете имя переменной вместо того, чтобы использовать ключ, который использовался во время экспорта? Короче говоря, давайте попробуем доступ к PI
(Имя переменной) вместо lifeofpi
(Ключ используется во время экспорта Pi
).
app.js.
Выход:
Area = 200.96, Circumference = 50.24pi = undefined
Это происходит потому, что Module.exports
Объект не знает переменную PI
больше. Он просто знает о ключах, добавленных к нему. Потому что ключ используется для экспорта переменной PI
это lifeofpi
Последние могут быть использованы только для доступа к первым.
TL; доктор
- Каждый файл в Node.js называется модуль Отказ
- Перед выполнением кода, написанного в модуле, Node.js принимает весь код, написанный внутри модуля, и преобразует его в функциональную обертку, которая имеет следующий синтаксис:
(function(exports, require, module, __filename, __dirname) { // entire module code lives in here});
- Функциональная обертка гарантирует, что весь код, написанный внутри модуля, является частным для него, если явно не указано иное (экспортировано). Параметры
Экспорт
,требуется
,модуль
,__Filename
и__dirname
Выступайте в качестве переменных Global для всего кода в модуле. Поскольку каждый модуль имеет собственную функциональную обертку, код, написанный внутри одной функциональной обертки, становится локальным к этой функциональной оболочке (чтение модуля) и недоступна внутри другой обертки функции (модуль чтения). модуль
Ключевое слово относится к объекту, представляющему текущий модуль.модуль
Объект имеет ключ с именемЭкспорт
ОтказModule.exports
Это еще один объект, который используется для определения того, что может быть экспортировано модулем и может быть доступным для других модулей. Короче говоря, если модуль хочет что-то экспортировать, его следует добавить кModule.exports
объект.- Значение по умолчанию
Module.exports
Объект это{}
Отказ - Есть три метода, в которых вы можете экспортировать что-то из модуля или добавить что-то в
Module.exports
Объект: 1. Определите все конструкции сначала, а затем используйте несколькоModule.exports
Заявления, когда каждое утверждение используется для экспорта конструкции. 2. Сначала определите все конструкции, а затем используйте одинModule.exports
Заявление для экспорта всех конструкций сразу после буквального обозначения объекта. 3. Добавить конструкции наModule.exports
объект при определении их. требуется
Ключевое слово относится к функции, которая используется для импорта всех переменных и функций, экспортированных с использованиемModule.exports
объект из другого модуля. Короче говоря, если файл хочет импортировать что-то, он должен объявить его, используя следующий синтаксис:
require('idOrPathOfModule');
- При экспорте что-то из модуля вы можете использовать любой действительный идентификатор. Не обязательно, что вам нужно дать точное имя переменной/функции в качестве ключа свойства, добавленного в
Module.exports
объект. Просто убедитесь, что вы используете один и тот же ключ для доступа к тому, что вы использовали во время экспорта.