С момента своего создания никто никогда не рассматривал JavaScript как язык программирования. В эпоху Интернета этот язык сценариев в основном использовался для проверки формы и спецэффектов веб -страницы. Только в ERA Web 2.0 инженеры фронт-конечности использовали его, чтобы значительно улучшить пользовательский опыт на веб-странице, JS был широко оценен. По мере того, как JS становится все более популярным, он примерно претерпевает изменения в библиотеке инструментов, библиотеке компонентов, фронтальной структуре и фронтальных приложениях. JavaScript по своей природе отсутствует функция: модули, и появление спецификации CommonJS компенсирует этот недостаток. В этой статье будет представлен механизм модуля CommonJS и модуля узлов.
На других языках высокого уровня у Java есть файлы классов, Python имеет механизм импорта, а PHP включает и требует. То, как JS представляет код через тег <croppl> кажется грязным. В прошлом люди должны были использовать пространства имен и другие методы для искусственного ограничения кода. Только когда появилась спецификация CommonJS, фронт-END и Back-End JavaScript смог достичь большого единства. Node заимствует спецификацию модулей CommonJS для реализации очень простой в использовании модуле.
1. Спецификация модуля CommonJS
Спецификация модуля CommonJS разделена на 3 части:
1). Ссылка на модуль: введите API модуля в текущий контекст с помощью метода require () и проход в идентификатор модуля, такой как var math = require ('math');
2). Модуля определение: экспортировать методы или переменные текущего модуля через объект Exports. В модуле также есть объект модуля, и экспорт на самом деле является атрибутом модуля. В узле файл является модулем, а «глобальные переменные» в модуле невидимы для внешнего мира. Только атрибуты, установленные на экспорте, являются общедоступными, например, exports.add = function () {}; exports.pi = 3,1415926;
3). МОДУЛ ИД: На самом деле это параметр, переданный TO TOR (). Например, «математика», упомянутая выше, должна быть строка, которая соответствует номенклатуре верблюда, или относительный или абсолютный путь, начиная с «». ".." У него не может быть суффикс имени файла ".js"
2. Процесс реализации модуля узла
В узле модули делятся на две категории: одна - модуль Core, предоставляемый самим узлом, а другой - модуль файла, записанный самим пользователем. Некоторые из основных модулей собираются в двоичные файлы во время компиляции исходного кода узла. Когда начинается узел, модуль ядра напрямую загружается в память, поэтому его скорость загрузки является самой быстрой. Модуль файла загружается динамически во время выполнения и требует трех шагов: анализ пути, местоположение файла, а также компиляция и выполнение. Обратите внимание, что кэши узлов ввели модули, чтобы уменьшить накладные расходы во время вторичного введения, и принимает наиболее предпочтительную стратегию для вторичной нагрузки того же модуля.
2.1 Анализ пути
Анализ пути в основном анализирует идентификаторы модулей, упомянутые выше, которые в основном делятся на следующие категории:
1) Основные модули, такие как HTTP, FS, PATH и т. Д.
2) Модуль файла относительного пути, начиная с. или .
3) Модуль файла абсолютного пути, начиная с /
4) Пользовательский файл модуль, который может быть в форме файла или пакета. Узел попытается найти целевой файл один за другим в соответствии с модулем массива модулей. Путы, обычно вдоль текущего каталога шаг за шагом до корневого каталога, ищет каталог с именем node_modules, так что это самый трудоемкий способ его найти.
2.2 Расположение файла
Основываясь на анализе пути, необходимо обратить внимание на следующие детали:
1) Анализ расширения файлов: поскольку спецификация CommonJS позволяет заполнять идентификаторы модулей, узлы будут пытаться в порядке .js, .json и .node
2) Анализ и пакет каталогов: если после приведенного выше анализа расширения файла нет соответствующего файла, но получается каталог, узел будет рассматривать каталог как пакет.
2.3 Компиляция и исполнение
После найма конкретного файла узел создаст новый объект модуля, загружать и компилировать в соответствии с пути. Для различных расширений метод загрузки отличается:
1) .JS Файл: Синхронно прочитайте файл через модуль FS и компилируйте и выполните его
2) .node File: это файл расширения, записанный в C/C ++, загруженный методом dlopen ()
3) .JSON FILE: прочитайте файл синхронно через модуль FS и используйте json.parse () для анализа и возврата результата
4) Другие файлы расширения: они загружаются как файлы .js
Мы знаем, что каждый файл модуля имеет три переменных: потребность, экспорт и модуль по умолчанию. Даже в документе API узла мы знаем, что каждый модуль также имеет две переменные: имя файла и dirname. Откуда они? Как модуль узла достигает того, что объявленные «глобальные переменные» на самом деле не загрязняют другие модули? На самом деле, Node завершит содержимое файла в начале и закончилось во время составления модуля JS. Вот пример того, что файл JS обернут головой и хвостом:
Кода -копия выглядит следующим образом:
(Функция (экспорт, потребность, модуль, __filename, __dirname) {
/* Середина является фактическим содержанием файла JS*/
var math = require ('математика');
exports.area = function (radius) {
вернуть math.pi * radius * radius;
};
/* Фактическое содержание файла JS заканчивается*//
});
Таким образом, каждый файл модуля является изоляцией, и такие переменные, как потребности, экспорт, модули и т. Д. Также вводятся в контекст модуля. Это реализация спецификации модуля Node CommonJS. Процесс компиляции модуля C/C ++ и модуля ядра узла относительно сложный, поэтому я больше не буду повторять его.
3. Стек вызовов модуля
Необходимо прояснить призывные отношения различных модулей в узле, как показано на рисунке ниже:
Встроенный модуль C/C ++ является модулем самого низкого уровня и принадлежит модулю Core. В основном он предоставляет API для вызова основных модулей JavaScript и сторонних файловых модулей JavaScript. На самом деле, почти нет контакта с такими модулями. Существует две основные обязанности модулей ядра JavaScript: одна из них состоит в том, чтобы служить в качестве уровня инкапсуляции и мостовой слой встроенного модуля C/C ++ для вызовов модуля файла, а другой-чистый функциональный модуль, которому не нужно иметь дело с базовым слоем. Файловые модули обычно пишут третьими лицами, включая обычные модули JavaScript и модули расширения C/C ++.
4. Пакет и NPM
4.1 Структура упаковки
Пакет, по сути, представляет собой архивный файл (обычно .zip или .tar.gz), который декомпрессируется и восстанавливается в каталог после установки. Спецификация пакета CommonJS состоит из двух частей: структура пакета и файл описания пакета. Структура пакета, которая полностью соответствует спецификации CommonJS, должна содержать следующие файлы:
1) .package.json: файл описания пакета
2) .bin: каталог, где хранятся исполняемые двоичные файлы
3) .lib: каталог, где хранится код JavaScript
4) .doc: каталог, где хранится документ
5) .test: каталог, в котором хранятся модульные тестовые случаи
4.2 Файл описания пакета
Файл Описания пакета представляет собой файл JSON - Package.json, расположенный в корневом каталоге пакета, является важной частью пакета и используется для описания обзорной информации пакета. Все поведения NPM, которые будут упомянуты позже, тесно связаны с полями этого файла. Ниже мы будем использовать файл package.json известного проекта Web Framework Express в качестве примера, чтобы проиллюстрировать значение некоторых обычно используемых полей.
1) .name: имя пакета
2) .description: введение пакета
3) .version: номер версии должен соответствовать «Семантическому контролю версий», см. Http://semver.org/
4). Заястости: используйте список пакетов, от которых должен зависеть текущий пакет. Это свойство очень важно. NPM автоматически загружает зависимый пакет через это свойство
5) .Repositories: Список местоположений для хостинга исходного кода
Использование других полей может быть направлено на NPM Package.json Описание
4.3 Общие функции NPM
NPM (диспетчер пакетов узлов), широко известный как диспетчер пакетов узлов. Его основная функция - управление пакетами узлов, включая: установку, удаление, обновление, просмотр, поиск, публикация и т. Д.
4.3.1 Установка пакета NPM
Существует два типа установки пакетов узлов: локальная установка и глобальная установка. Разница между ними заключается в следующем:
1). Local Installation NPM Install <cade-name>: пакет будет загружен в текущий каталог и может использоваться только в текущем каталоге.
2). Глобальная установка NPM Install -g <cade -name>: пакет будет загружен в определенный системный каталог, а установленное пакет может использоваться во всех каталогах.
4.3.2 Управление пакетами NPM
Ниже приведен список широко используемых команд управления пакетами с использованием Grunt-CLI (инструмент командной строки Grunt) В качестве примера:
1) .NPM Установка: Установите все пакеты, объявленные полями зависимостей и DevDependencies в файле Package.json
2) .NPM Установите [email protected]: Установите конкретную версию Grunt-Cli
3) .NPM Установите Grunt-Contrib-Copy-Save: Установите Grunt-Contrib-Copy и сохраните зависимость от файла Package.json
4) .NPM УБОВАНИЕ
5) .NPM Список: проверьте, какие пакеты установлены
6) .npm publish <polder>: опубликовать пакет