JavaScript является одним из наиболее часто используемых языков программирования в мире. Это общий язык в веб -мире и используется всеми браузерами. Рождение JavaScript восходит к эпохе Netscape, и его основной контент был поспешно разработан для борьбы с Microsoft и участия в жесткой войне браузера в то время. Из -за преждевременного выпуска некоторые из его плохих функций неизбежно привели.
Хотя время его разработки короткое, JavaScript по -прежнему имеет много мощных функций, за исключением функции обмена пространством глобального пространства имен для каждого сценария.
После того, как веб -страница загружена кодом JavaScript, она вводится в глобальное пространство имен и поделится тем же адресным пространством, что и все другие загруженные сценарии, что приведет ко многим вопросам безопасности, конфликты и некоторым общим проблемам, что затрудняет отслеживание ошибок и трудно решить.
Но, к счастью, Node установил некоторые спецификации для JavaScript на стороне сервера, а также реализует стандарт модуля CommonJS. В этом стандарте каждый модуль имеет свой собственный контекст и отличается от других модулей. Это означает, что модули не будут загрязнять глобальную область, потому что вообще нет так называемой глобальной области, и модули не будут мешать друг другу.
В этой главе мы узнаем о нескольких различных модулях и о том, как их загрузить.
Разделение кода на серию четко определенных модулей может помочь вам контролировать ваше приложение. Ниже мы узнаем, как создавать и использовать ваши собственные модули.
Узнайте, как узлы загружают модули
В узле модули могут быть направлены на пути файла или имена модулей. Если на неточном модуле ссылается имя, узел в конечном итоге будет ссылаться на имя модуля с соответствующим путем файла модуля. И эти основные модули, содержащие основные функции, будут предварительно загружены при запуске узла.
Неточные модули включают сторонние модули, установленные с использованием NPM (диспетчер пакетов узлов), а также локальные модули, созданные вами или вашими коллегами.
Каждый модуль, импортируемый текущим сценарием, будет обнародовать набор открытых API для программиста. Перед использованием модуля вам необходимо использовать функцию «Восстания» для его импорта, например:
Кода -копия выглядит следующим образом:
var module = require ('module_name')
Приведенный выше код будет импортировать модуль с именем module_name. Это может быть модуль ядра или модуль, установленный с NPM. Функция «Требование» возвращает объект, содержащий все общедоступные API модуля. В зависимости от модуля возвращенным объектом может быть любое значение JavaScript, это может быть функция или объект, содержащий ряд атрибутов (функции, массивы или любой объект JavaScript).
Экспортный модуль
Система модулей CommonJS - единственный способ поделиться объектами и функциями между файлами под узлом. Для очень сложной программы вы должны реконструировать некоторые классы, объекты или функции в серию четко определенных многократных модулей. Для пользователей модулей модуль только раскрывает код, который вы указали внешнему миру.
В следующем примере вы поймете, что в узле файлы и модули соответствуют одно за другим. Мы создали файл под названием Circle.js, который только экспортирует конструктор круга снаружи.
Кода -копия выглядит следующим образом:
Функциональный круг (x, y, r) {
функция r_squared () {
return Math.pow (r, 2);
}
Функциональная область () {
вернуть math.pi * r_squared ();
}
возврат {область: область};
}
module.exports = circle;
Самая важная вещь в коде - это последняя строка, которая определяет, что модуль экспортирует снаружи. Модуль - это специальная переменная, которая представляет сам текущий модуль, а модуль. Exports - это объект, экспортируемый из модуля. Это может быть любой объект. В этом примере мы экспортируем круговой конструктор, чтобы пользователи модулей могли использовать этот модуль для создания экземпляров круга.
Вы также можете экспортировать некоторые сложные объекты, Module.exports инициализируется в пустой объект, и вы экспортируете все, что хотите выставить во внешний мир как атрибуты объекта Module.exports. Например, вы разработали модуль, который разоблачает набор функций снаружи:
Кода -копия выглядит следующим образом:
function printa () {
console.log ('a');
}
function printb () {
console.log ('b');
}
функция printc () {
console.log ('c');
}
module.exports.printa = printa;
module.exports.printb = printb;
module.exports.pi = math.pi;
Этот модуль экспортирует две функции (printa и printb) и номер (PI), а вызывающий код выглядит следующим образом:
Кода -копия выглядит следующим образом:
var mymodule2 = require ('./ mymodule2');
mymodule2.printa (); // -> а
mymodule2.printb (); // -> б
console.log (mymodule2.pi); // -> 3.141592653589793
Загрузка модуля
Как упоминалось ранее, вы можете использовать функцию «Восстания» для загрузки модулей, и не беспокойтесь о том, что вызывание требуется в коде, повлияет на глобальное пространство имен, поскольку в узле нет концепции глобального пространства имен. Если модуль существует без каких -либо ошибок синтаксиса или инициализации, функция «Восстания» вернет объект модуля, и вы также можете назначить этот объект любой локальной переменной.
Существует несколько различных типов модулей, которые можно примерно разделить на основные модули, локальные модули и сторонние модули, установленные через NPM. Согласно типу модуля, есть несколько способов обращения к модулям. Давайте узнаем об этих знаниях ниже.
Загрузка модуля ядра
Узел имеет несколько модулей, скомпилированных в двоичные файлы, называемые модулями Core. На них нельзя ссылаться пути, и могут использоваться только с именами модулей. Модуль Core имеет самый высокий приоритет загрузки, и даже если уже есть сторонний модуль того же имени, модуль Core будет загружен сначала.
Например, если вы хотите загрузить и использовать модуль HTTP Core, вы можете сделать это:
Кода -копия выглядит следующим образом:
var http = require ('http');
Это вернет объект, содержащий модуль HTTP, который содержит API этих HTTP -модулей, определенных в документации API узла.
Загрузка модуля файла
Вы также можете использовать абсолютные пути для загрузки модулей из файловой системы:
Кода -копия выглядит следующим образом:
var mymodule = require ('/home/pedro/my_modules/my_module');
Вы также можете использовать относительный путь на основе текущего файла:
Кода -копия выглядит следующим образом:
var mymodule = require ('../ my_modules/my_module');
var mymodule2 = require ('./ lib/my_module_2');
Обратите внимание на приведенный выше код. Вы можете опустить расширение имени файла. Если узел не может найти этот файл, вы попытаетесь добавить суффикс JS для поиска снова после имени файла (примечание переводчика: на самом деле, в дополнение к JS, вы также будете искать JSON и Node. Для получения подробной информации вы можете увидеть официальную документацию веб -сайта). Поэтому, если в текущем каталоге существует файл, называемый my_module.js, будет два метода загрузки:
Кода -копия выглядит следующим образом:
var mymodule = require ('./ my_module');
var mymodule = require ('./ my_module.js');
Загрузка модуля каталога
Вы также можете использовать путь каталога для загрузки модуля:
Кода -копия выглядит следующим образом:
var mymodule = require ('./ mymoduledir');
Узел предполагает, что этот каталог является пакетом модуля и попытается найти файл файла определения пакета.
Если не найдено, Node предполагает, что точка входа пакета является файлом index.js (примечание переводчика: в дополнение к index.js, он также будет искать Index.node, а файл .node - пакет бинарного расширения Node, см. Официальный документ для подробностей). Приведенный выше код является примером. Узел попытается найти файл ./mymoduledir/index.js.
Напротив, если найден файл package.json, Node попытается проанализировать его и найти основной атрибут в определении пакета, а затем использовать значение основного атрибута в качестве относительного пути точки входа. В этом примере, если Package.json определяется следующим образом:
Кода -копия выглядит следующим образом:
{
"имя": "mymodule",
"Main": "./lib/mymodule.js"
}
Узел попытается загрузить файл ./mymoduledir/lib/mymodule.js
Загружать из каталога Node_Modules
Если параметрами функции «Восставление» не являются относительными путями или именами модулей ядра, узел будет искать в подкаталоге NODE_Modules текущего каталога. Например, в следующем коде узел попытается найти файл./node_modules/mymodule.js:
Кода -копия выглядит следующим образом:
var mymodule = require ('mymodule.js');
Если не найдено, узел будет продолжать искать в папке Node_Modules верхнего каталога. Если не найдено, продолжайте искать в верхнем каталоге до тех пор, пока не будет найден соответствующий модуль, или корневой каталог не будет достигнут.
Вы можете использовать эту функцию для управления контентом или модулями каталога node_modules, но лучше всего передать задачи управления модулями NPM (см. Главу 1). Каталог локального NODE_MODULES является местоположением по умолчанию для модуля установки NPM. Этот дизайн связывает узел и NPM вместе. Обычно, как разработчик, вам не нужно слишком заботиться об этой функции. Вы можете просто установить, обновлять и удалять пакеты с помощью NPM, что поможет вам сохранить каталог node_modules.
Модуль кеша
Модуль будет кэширован после первой успешной загрузки, то есть, если имя модуля будет разрешено до того же пути файла, тогда каждый вызов, который требует ('mymodule'), вернет точно такой же модуль.
Например, существует модуль с именем my_module.js, который содержит следующее содержание:
Кода -копия выглядит следующим образом:
console.log ('module my_module инициализация ...');
module.exports = function () {
console.log ('Привет!');
};
console.log ('my_module инициализирован.');
Затем используйте следующий код для загрузки модуля:
Кода -копия выглядит следующим образом:
var mymoduleinstance1 = require ('./ my_module');
Он производит следующий выход:
Кода -копия выглядит следующим образом:
модуль my_module инициализация ...
my_module инициализирован
Если мы импортируем его дважды:
Кода -копия выглядит следующим образом:
var mymoduleinstance1 = require ('./ my_module');
var mymoduleinstance2 = require ('./ my_module');
Вывод все еще:
Кода -копия выглядит следующим образом:
модуль my_module инициализация ...
my_module инициализирован
То есть код инициализации модуля выполняется только один раз. Когда вы создаете свой собственный модуль, если код инициализации модуля содержит код, который может иметь побочные эффекты, вы должны уделять особое внимание этой функции.
краткое содержание
Узел отменил глобальный объем JavaScript по умолчанию и вместо этого принял систему модулей CommonJS, чтобы вы могли лучше организовать свой код и избежать многих проблем безопасности и ошибок. Вы можете использовать функцию «Требование» для загрузки модулей ядра, сторонних модулей или загружать свои собственные модули из файлов и каталогов.
Вы также можете использовать относительные или абсолютные пути для загрузки неточных модулей. Если вы поместите модуль в каталог NODE_MODULES или для модулей, установленных с помощью NPM, вы также можете напрямую использовать имя модуля для загрузки.
Примечание переводчика:
Рекомендуется, чтобы читатели прочитали главы модуля официального документа. Я лично чувствую, что это яснее, чем автор. Был прикреплен очень репрезентативный пример, который будет иметь большую помощь, чтобы понять загрузку модуля узла. Также цитируется следующее:
Кода -копия выглядит следующим образом:
Использование требуется (x) для загрузки модулей по пути y
1. Если x - основной модуль,
а Загрузить и вернуть модуль ядра
беременный Конец
2. Если X начинается с './' или '/' или '../
а Load_as_file (y + x)
беременный Load_as_directory (y + x)
3. load_node_modules (x, dirname (y))
4. Выберите исключение: «не найдено»
Load_as_file (x)
1. Если X - файл, загрузите x в качестве сценария JavaScript и завершить после загрузки
2. Если X.JS - файл, загрузите X.JS как сценарий JavaScript и завершить после загрузки
3. Если x.node-это файл, загрузите x.node в виде бинарного плагина и конца узла после загрузки.
Load_as_directory (x)
1. Если существует файл x/package.json,
а Подставки x/package.json и найдите поле «основное».
беременный Также m = x + (значение основного поля)
в Load_as_file (m)
2. Если существует файл x/index.js, загрузите x/index.js как сценарий JavaScript и заканчиваться после загрузки.
3. Если существует файл x/index.node, загрузите x/index.node в виде бинарного плагина и окончания узла после загрузки.
Load_node_modules (x, start)
1. Также dirs = node_modules_paths (Start)
2. Сделайте следующие операции для каждого DIR DIRS UNI DIRS:
а Load_as_file (dir/x)
беременный Load_as_directory (dir/x)
Node_modules_paths (start)
1. Также части = PATH SPLIT (START)
2. также root = индекс первого экземпляра "node_modules" в частях или 0
3. Также I = Подсчет частей - 1
4. также dirs = []
5. Пока я root,
а Если Parts [i] = "node_modules", то будет продолжаться операция, в противном случае следующий цикл
в Dir = joint path (части [0 .. i] + "node_modules")
беременный Dirs = dirs + dir
в Также я = я - 1
6. Вернитесь в Dirs