Автор оригинала: Prosper Opara.
Node.js – это JavaScript Way-Time, построенный на верхней части двигателя Chrome V8. Кратко, Node.js в качестве платформы предоставляет среду за пределами традиционного веб-браузера для выполнения JavaScript Code (важно здесь отметить, что Node.js был создан для создания сетевых приложений с использованием JavaScript).
Типичное производство готовое Node.js приложение особенность Интенсивные (конечные точки спокойных API являются типичным примером, где каждая конечная точка является особенностью и имеет уникальную ответственность) и требует некоторой суммы логики, которая в свою очередь требует, которые вы кодируете множество функций, которые отвечают за реализацию различных функций, которые составляют ваш заявление. Чтобы сохранить нашу прикладную возможность, это хорошая практика, чтобы разделить разную логику на более мелкие кусочки, которые имеют конкретные обязанности, а затем импортируют эти кусочки логики в основное приложение для повторного использования. В Node.js нам дают Модульная система которые позволяют разработчикам приложений абстрактной логике в модули, экспортируйте модули, которые будут использоваться, где в нашем приложении. Понимание того, как работает система модулей, является неотъемлемой частью для написания приемы для обслуживания Node.js.
Модуль – это кусок программы с абстрагированной функциональностью, необходимой всей программой. Как правило, программа в большинстве случаев состоит из разных модулей.
NB: Для остальной части этой статьи я бы использовал Узел вместо Node.js В основном потому, что это забирает меньше нажатия клавиш, и это красиво, что он называется в экосистеме.
В узле каждый файл считается модулем и перед каждым файлом (модулем) выполняется, он завернут в Модуль обертки Функция, которая показывает следующие переменные/аргументы модуль , Экспорт, требуется, имя файла, dirname и выглядит что-то вроде;
(function(exports, require, module, __filename, __dirname) { // module code goes in here });
Экспорт и модуль Объект, выставленный функцией обертки, включите модуль выставить функции/объекты, которые будут использоваться другими модулями. Embize Object позволяет модулю импортировать другие модуль (ы), __Filename
, __dirname
Оба удобные переменные для доступа к файлу и пути каталога модуля соответственно. Одинаково важно отметить, что переменные, выставленные функцией обертки, не имеют глобально невыразимых. Вместо этого они находятся на местном уровне модуля, и любая другая переменная, объявленная в модуле (в глобальном объеме модуля), также непосредственно доступны для других модулей, когда модуль импортируется в другой модуль, за исключением этих переменной ясно экспортируется модуль. Следовательно, столкновение именования объекта легко избежать между импортирующим модулем и импортируемым модулем.
NB: Обратите внимание, что файл и модуль можно использовать взаимозаменяемо, но я все равно явно напомнил вам, что избежать недопонимания.
модуль
модуль Переменная – это объект, который представляет файл, в котором он выходит. Давайте рассмотрим эту переменную, создавая пустой index.js
Файл (модуль) и регистрацию переменной к консоли:
console.log(module); /* returns; Module { id: '.', path: 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module', exports: {}, parent: null, filename: 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module\\index.js', loaded: false, children: [], paths: [ 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module\\node_modules', 'C:\\Users\\kodekage\\Desktop\\projects\\node\\node_modules', 'C:\\Users\\kodekage\\Desktop\\projects\\node_modules', 'C:\\Users\\kodekage\\Desktop\\node_modules', 'C:\\Users\\kodekage\\node_modules', 'C:\\Users\\node_modules', 'C:\\node_modules' ] } */
NB: Выходной вывод, который вы видите здесь, немного отличаются от вашего из-за простого факта, что мы не используем ту же машину, и вы могли бы создать свой файл в совершенно другой папке.
модуль. Экспорты
Свойство Module.exports обнаруживает значения из модуля, который можно импортировать в другие модули по требуется ('/путь/к/модуль')
и повторно используется. Давайте создадим Utility.js Модуль, который выставляет дополнение и функцию вычитания.
//utility.js const add = (a, b) => { return a + b; } const subtract = (a, b) => { return a - b; } module.exports.add = add; module.exports.subtract = subtract;
module.exports.add толкает Добавить функцию в объект экспорта, назначающий Добавить Как ключ и Добавить функцию как значение. Module.exports.subtract Также присваивается вычесть в качестве второго свойства объекта экспорта в рамках модуль объект. Чтобы дополнительно проиллюстрировать это, давайте воспозим объект модуля к консоли.
// utility.js console.log(module); /* returns; Module { id: '.', path: 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module', exports: { add: [Function: add], subtract: [Function: subtract] }, parent: null, filename: 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module\\index.js', loaded: false, children: [], paths: [ 'C:\\Users\\kodekage\\Desktop\\projects\\node\\module\\node_modules', 'C:\\Users\\kodekage\\Desktop\\projects\\node\\node_modules', 'C:\\Users\\kodekage\\Desktop\\projects\\node_modules', 'C:\\Users\\kodekage\\Desktop\\node_modules', 'C:\\Users\\kodekage\\node_modules', 'C:\\Users\\node_modules', 'C:\\node_modules' ] } */
Имущество экспорта выглядит что-то вроде; Экспорт: {Добавить: [Функция: Добавить], вычесть: [Функция: count2]},
Отказ Указывает на то, что функции успешно выставлены. Когда Utility.js Требуется в другом модуле, функции могут быть вызваны в нужный модуль.
экспорт
Экспорт – это удобный метод для Module.exports Поскольку требуется меньше нажатия клавиш и также является кратким. Рисунок из нашего предыдущего образца кода, module.exports.add и Module.exports.subtract Может также быть написан как Exports.add и Exports.subtract соответственно.
требовать
требуется Функция, используемая для загрузки модуля в другой модуль. Он предоставляет импортируемый (модуль необходим) модули экспортируемые объекты и делают их пригодными для использования модуля требований.
// program.js const utility = require('./utility'); utility.add(5, 6); // returns 11 utility.substract(3, 6) // returns -3
Существуют различные типы модуля, которые вы обычно можете загрузить, вызывая функцию требуется;
- Модуль узла Core E.G HTTP, FS, NET и т. Д.
- Модуль зависимости приложений, как правило, загружен из Node_Modules
- Локальный модуль/файлы
При загрузке основного модуля или модуля в папке Node_Modules вы просто ссылаетесь на имя модуля E.G; const ('http')
, cosnt ('scoket.io')
Отказ Чтобы загрузить локальный модуль (файл), вам нужно добавить путь к файлу к модулю e.g const ('./Утилита)
Это означает, что коммунальный модуль находится в том же каталоге, что и модуль импортирует его.
Как работает модуль загрузки
При загрузке узла модуля проверяется, если идентификатор модуля (строка, передаваемая в нужный вызов функции), начинается с ‘./’ или ‘/’ или ‘..//’ И когда они не проверяют, если идентификатор соответствует ли идентификатору любого основного модуля (HTTP, NET, FS и т. Д.), И он находит совпадение, он загружает идентифицированный модуль Core Eзнания, знает, чтобы посмотреть на node_modules папка для требуемого модуля.
- ‘./’ является относительным путь к модулю, и это означает, что оба модуля (импортируемый модуль и модуль импорта) должны быть в одном каталоге
- ‘..//’ Также указывается относительный путь к файлу к модулю, но на этот раз оба модуля не находятся на одном уровне каталога.
- ‘/’ Это абсолютный путь к модулю, а узел начинает смотреть из корня файловой системы
Примечание на Node_Modules.
Справочник Node_Module – это репозиторий для сторонних модулей, загруженных из управляющих пакетов, таких как NPM или пряжа. Узел загружает модули (пакеты) из этой папки, когда идентификатор передается в требуется Функция не является основным модулем или идентификатор не начинается с «//’,’/’или’ ..//’,’/’или’ ..//’,’/’или’ ..//’. Для того, чтобы загрузить из Node_Modules, узел продолжает присоединяться “/node_modules” К пущету файла, начиная с родительского каталога модуля нужного модуля, то узел продолжает двигаться вверх по дереву, пока не найдет файл.
Представьте, что вы создали Program.js Файл в /home/projects/sample-node-app/program.js что требует Utility.js Модуль, который происходит не основным модулем, и идентификатор не начинается с абсолютного пути «/» или относительный путь «./» или «…./».
// program.js const utility = require("utility");
Узел Следующее предположение будет то, что этот модуль должен быть в папке Node_Modules. Узел начнет поиск, во-первых, добавление Node_Module в текущий каталог нужного модуля (файла), который, например, может быть /home/projects/sample-node-app/node_modules/utivy.js , если файл не найден, там узел переместится, это поиск в родительском каталоге; Главная/Проекты/Node_Modules/Utility.js Отказ Если модуль также не найден, узел продолжает двигаться вверх по родительскому каталогу, пока он не попадет в корневой каталог файловой системы, и если модуль до сих пор не найден, узел бросает ошибку, указав, что она не может найти требуемый модуль. Важным моментом к примечанию здесь является то, что узел не будет добавить /node_modules каталог в любом каталоге, который уже имеет папку Node_Modules, созданную в ней или путь, который заканчивается /node_modules Отказ Узел вместо этого переходит в существующий каталог Node_Module, чтобы искать необходимый модуль.
Это в основном одна из причин, по которой каталог Node_Modules создан в корневом каталоге вашего проекта при установке модулей третьего лица локально от NPM или пряжи.
Заключение
Реализация узла системы модуля действительно уникальна, особенно в том, что узел узел обрабатывает модуль Scoping (благодаря функции обертки модулей). Теперь создатели пакетов могут назвать объекты, как они выбирают, не беспокоясь о том, как называются столкновениями, менеджеры пакетов могут использовать мощность Node_Modules для доставки пакетов вашего узла зависит, а также как разработчик узла, вы можете меньше беспокоиться об этих тривиальных вопросах и сосредоточиться Энергия на письменном виде Код.
Я настоятельно рекомендую вам экспериментировать с идеей, которую вы просто поглощены, а также копаться в Документация API Для более глубокого погружения в модуль узла.