Рубрики
Без рубрики

Все, что вы должны знать о «модуле» и «требуют» в Node.js

Srishti Gupta Все, что вы должны знать о «модуле» и «требуют» в Node.jsmodulesnode.js, обрабатывает каждый файл JavaScript как отдельный модуль. Для экземпляра, если у вас есть файл, содержащий какой-код, и этот файл называется xyz.js, Тогда этот файл рассматривается как модуль в узле,

Автор оригинала: 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 объект. Просто убедитесь, что вы используете один и тот же ключ для доступа к тому, что вы использовали во время экспорта.