Введение
В Node.js модуль — это набор функций и объектов JavaScript, которые могут использоваться внешними приложениями. Любой файл Node.js или набор файлов можно считать модулем, если его функции и данные доступны для использования внешними программами.
Возможность писать модули, которые экспортируют полезные функции и данные, позволит вам внести свой вклад в сообщество Node.js, ведь все пакеты, которые вы используете в npm, сгруппированы и разделены как модули. Это делает создание модулей важным навыком для разработчика Node.js.
В этом руководстве вы создадите модуль Node.js, который предлагает, какой цвет веб-разработчикам следует использовать в своих проектах. Вы разработаете модуль, сохранив цвета в виде массива и предоставив функцию для получения одного из них случайным образом. Далее мы рассмотрим различные способы импорта модуля в приложение Node.js.
Предпосылки
Вам понадобятся Node.js и NPM, установленные в вашей среде разработки. Следуйте одному из следующих руководств в зависимости от вашей операционной системы:
- Как установить Node.js и NPM на CentOS 8 Linux.
- Как установить Node.js и NPM на Ubuntu 18.04.
- Как установить Node.js и NPM на Debian 10.
- Как установить Node.js на Fedora 30
- Как установить Node.js и NPM на Linux Mint 19 Tara
- Как установить Node.js и NPM на Raspberry Pi
Шаг 1: Создайте форму
Этот шаг поможет вам создать свой первый модуль Node.js. Модуль будет содержать набор цветов в массиве и предоставлять функцию для получения одного из них случайным образом. Вы будете использовать свойство exports
, встроенное в Node.js, чтобы сделать функцию и массив доступными для внешних программ.
Во-первых, вы начнете с решения, какие данные о цвете будут храниться в форме. Каждый цвет будет объектом, содержащим свойство name
, которое можно легко идентифицировать, и свойство code
, представляющее собой строку, содержащую код цвета HTML. Цветовые коды HTML – это шестизначные шестнадцатеричные числа, которые позволяют изменять цвет элементов на веб-странице. Подробнее о цветовых кодах HTML можно узнать, прочитав эту статью Цветовые коды и имена HTML.
Затем вы решите, какие цвета вы хотите поддерживать в своей форме. Ваш модуль будет содержать массив с именем allColors
, который будет содержать шесть цветов. Модуль также будет включать функцию getRandomColor()
, которая будет случайным образом выбирать цвет из массива и возвращать его.
В терминале создайте новую папку с названием colors
и перейдите в нее:
mkdir colors
cd colors
Инициализируйте npm, чтобы другие программы могли импортировать этот модуль позже в этом руководстве:
npm init -y
Вы использовали флаг -y
, чтобы пропустить обычные инструкции по настройке вашего package.json
. Если вы хотите опубликовать форму на npm, вы должны ответить на все эти инструкции соответствующими данными.
В этом случае на выходе будет:
{
"name": "colors",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Теперь откройте текстовый редактор командной строки, например nano, и создайте новый файл, который будет использоваться в качестве точки входа для вашего модуля:
nano index.js
Сначала определите класс Color
. Ваш класс Color
будет создан с его именем и HTML-кодом. Добавьте следующие строки, чтобы создать класс:
class Color {
constructor(name, code) {
this.name = name;
this.code = code;
}
}
Теперь, когда у вас есть структура данных для Color
, добавьте в форму несколько экземпляров. Запишите следующий выделенный массив в свой файл:
class Color {
constructor(name, code) {
this.name = name;
this.code = code;
}
}
const allColors = [
new Color('brightred', '#E74C3C'),
new Color('soothingpurple', '#9B59B6'),
new Color('skyblue', '#5DADE2'),
new Color('leafygreen', '#48C9B0'),
new Color('sunkissedyellow', '#F4D03F'),
new Color('groovygray', '#D7DBDD'),
];
Наконец, вставьте функцию, которая случайным образом выбирает элемент из только что созданного массива allColors
:
class Color {
constructor(name, code) {
this.name = name;
this.code = code;
}
}
const allColors = [
new Color('brightred', '#E74C3C'),
new Color('soothingpurple', '#9B59B6'),
new Color('skyblue', '#5DADE2'),
new Color('leafygreen', '#48C9B0'),
new Color('sunkissedyellow', '#F4D03F'),
new Color('groovygray', '#D7DBDD'),
];
exports.getRandomColor = () => {
return allColors[Math.floor(Math.random() * allColors.length)];
}
exports.allColors = allColors;
Ключевое слово exports
относится к глобальному объекту, доступному в каждом модуле Node.js. Все функции и объекты, хранящиеся в объекте exports
модуля, отображаются, когда другие модули Node.js импортируют его. Функция getRandomColor()
была создана непосредственно на объекте exports
. Затем к объекту exports
было добавлено свойство allColors
, которое ссылается на локальный постоянный массив allColors
, созданный ранее в сценарии.
Когда другие модули импортируют этот модуль, allColors
и getRandomColor()
будут открыты и доступны для использования.
Сохраните и закройте файл.
Итак, вы создали модуль, содержащий массив цветов и функцию, возвращающую случайный цвет. Вы также экспортировали массив и функцию, чтобы внешние программы могли их использовать. На следующем этапе вы будете использовать свой модуль в других приложениях, чтобы продемонстрировать эффекты export
.
Шаг 2. Протестируйте форму с помощью REPL
Прежде чем создавать полное приложение, найдите время, чтобы убедиться, что ваша форма работает. На этом этапе REPL будет использоваться для загрузки модуля colors
. Находясь в REPL, мы будем вызывать getRandomColor()
, чтобы увидеть, ведет ли она себя так, как ожидалось.
Запустите Node.js REPL в той же папке, что и файл index.js
:
node
Когда REPL запустится, появится сообщение >
. Это означает, что вы можете ввести код JavaScript, который будет немедленно оценен.
Сначала введите следующее:
colors = require('./index');
В этой команде require()
загружает модуль colors
в точке входа. Когда вы нажмете ENTER
, вы получите следующий вывод:
{
getRandomColor: [Function],
allColors: [
Color { name: 'brightred', code: '#E74C3C' },
Color { name: 'soothingpurple', code: '#9B59B6' },
Color { name: 'skyblue', code: '#5DADE2' },
Color { name: 'leafygreen', code: '#48C9B0' },
Color { name: 'sunkissedyellow', code: '#F4D03F' },
Color { name: 'groovygray', code: '#D7DBDD' }
]
}
REPL показывает нам значение colors
, которые являются всеми функциями и объектами, импортированными из файла index.js
. При использовании ключевого слова require
Node.js возвращает весь контент в объекте exports
модуля.
Помните, что вы добавили getRandomColor()
и allColors
в exports
в модуле colors
. По этой причине они оба появляются в REPL при импорте.
Протестируйте getRandomColor()
:
colors.getRandomColor();
Вам будет показан случайный цвет:
Color { name: 'groovygray', code: '#D7DBDD' }
Поскольку индекс является случайным, вывод может варьироваться. Теперь, когда вы убедились, что модуль colors
работает, выйдите из Node.js REPL:
.exit
Это вернет вас в командную строку вашего терминала.
Вы только что подтвердили, что ваша форма работает должным образом, используя REPL. Далее вы примените эти же концепции и загрузите свой модуль в приложение, как в реальном проекте.
Шаг 3: Сохраните локальный модуль как зависимость
При тестировании модуля в REPL он был импортирован с относительным путем. Это означает, что вы использовали расположение файла index.js
по отношению к рабочему каталогу, чтобы получить его содержимое. Обычно удобно импортировать модули с их именами, чтобы импорт не прерывался при изменении контекста. На этом шаге вы установите модуль colors
с помощью функции локального модуля npm install
.
Настройте новый модуль Node.js за пределами папки colors
. Сначала перейдите в предыдущий каталог и создайте новую папку:
cd..
mkdir really-large-application
Теперь переключитесь на новый проект:
cd really-large-application
Как и в случае с модулем colors
, инициализируйте папку с помощью npm:
npm init -y
package.json
будет сгенерирован ниже:
{
"name": "really-large-application",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Теперь установите модуль colors
и используйте флаг --save
, чтобы он был зарегистрирован в вашем файле package.json
:
npm install --save../colors
Вы только что установили модуль colors
в новый проект. Откройте файл package.json
, чтобы увидеть новую локальную зависимость:
nano package.json
Вы обнаружите, что были добавлены следующие выделенные строки:
{
"name": "really-large-application",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"colors": "file:../colors"
}
}
Выйдите из файла.
Модуль colors
был скопирован в ваш каталог node_modules
. Убедитесь, что он есть, с помощью следующей команды:
ls node_modules
Это даст следующий результат:
colors
Используйте локальный модуль, установленный в этой новой программе. Снова откройте текстовый редактор и создайте еще один файл JavaScript:
nano index.js
Ваша программа сначала импортирует модуль colors
. Затем он выберет случайный цвет, используя getRandomColor()
, предоставляемую модулем. Наконец, он напечатает на консоли сообщение, сообщающее пользователю, какой цвет использовать.
Вставьте следующий код в index.js
:
const colors = require('colors');
const chosenColor = colors.getRandomColor();
console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);
Сохраните и закройте файл.
Теперь ваше приложение сообщит пользователю случайный вариант цвета для компонента веб-сайта.
Запустите этот скрипт с помощью:
node index.js
Ваш вывод будет выглядеть так:
You should use leafygreen on your website. It's HTML code is #48C9B0
Теперь вы успешно установили модуль colors
и можете работать с ним, как с любым другим пакетом npm, используемым в вашем проекте. Однако, если вы добавили больше цветов и функций в свой модуль локальных colors
, вам следует запустить npm update
в своих приложениях, чтобы использовать новые параметры. На следующем шаге вы будете использовать модуль локальных colors
по-другому и получать автоматические обновления при изменении кода модуля.
Шаг 4: Подключите локальный модуль
Если ваш локальный модуль находится в стадии интенсивной разработки, постоянное обновление пакетов может быть утомительным. Альтернативой может быть подключение модулей. Связывание модуля гарантирует, что любые обновления модуля будут немедленно отражены в приложениях, которые его используют.
На этом шаге вы подключите модуль colors
к вашему приложению. Вы также измените модуль colors
и подтвердите, что его последние изменения работают в приложении без переустановки или обновления.
Сначала удалите локальный модуль:
npm un colors
npm связывает модули с помощью символических ссылок (или символических ссылок), которые указывают на файлы или каталоги на вашем компьютере. Подключение модуля происходит в два этапа:
- Создание глобальной ссылки на модуль. npm создает символическую ссылку между вашим глобальным каталогом
node_modules
и каталогом вашего модуля. Глобальный каталогnode_modules
— это место, где установлены все общесистемные пакеты npm (любые пакеты, установленные с флагом-g
). - Создайте локальную ссылку. npm создает символическую ссылку между локальным проектом, использующим модуль, и глобальной ссылкой модуля.
Сначала создайте глобальную ссылку, вернувшись в папку с colors
и используя команду link
:
cd../colors
sudo npm link
После завершения ваша оболочка будет производить:
/usr/local/lib/node_modules/colors -> /home/sammy/colors
Вы только что создали символическую ссылку в папке node_modules
в каталоге colors
.
Вернитесь в папку really-large-application
и свяжите пакет:
cd../really-large-application
sudo npm link colors
Вы получите вывод, аналогичный следующему:
/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors
Примечаниеlinklnnpm ln colors
Как видно из вывода, вы только что создали символическую ссылку из really-large-application
в локальном node_modules
на символическую ссылку colors
в вашем глобальном node_modules
, указывающую на фактический каталог с модулем colors
.
Процесс связывания завершен. Запустите файл, чтобы убедиться, что он все еще работает:
node index.js
Ваш вывод будет выглядеть так:
You should use sunkissedyellow on your website. It's HTML code is #F4D03F
Функциональность программы не нарушена. Затем убедитесь, что обновления применяются немедленно. В текстовом редакторе повторно откройте файл index.js
в модуле colors
:
cd../colors
nano index.js
Теперь добавьте функцию, которая выбирает лучший из существующих оттенков синего. Он не принимает аргументов и всегда возвращает третий элемент массива allColors
. Добавьте эти строки в конец файла:
class Color {
constructor(name, code) {
this.name = name;
this.code = code;
}
}
const allColors = [
new Color('brightred', '#E74C3C'),
new Color('soothingpurple', '#9B59B6'),
new Color('skyblue', '#5DADE2'),
new Color('leafygreen', '#48C9B0'),
new Color('sunkissedyellow', '#F4D03F'),
new Color('groovygray', '#D7DBDD'),
];
exports.getRandomColor = () => {
return allColors[Math.floor(Math.random() * allColors.length)];
}
exports.allColors = allColors;
exports.getBlue = () => {
return allColors[2];
}
Сохраните и выйдите из файла, затем снова откройте файл index.js
в папке really-large-application
:
cd../really-large-application
nano index.js
Сделайте вызов только что созданной getBlue()
и напечатайте предложение со свойствами цвета. Добавьте эти инструкции в конец файла:
const colors = require('colors');
const chosenColor = colors.getRandomColor();
console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);
const favoriteColor = colors.getBlue();
console.log(`My favorite color is ${favoriteColor.name}/${favoriteColor.code}, btw`);
Сохраните и закройте файл.
В коде теперь используется новая функция сборки getBlue()
. Запустите файл, как и раньше:
node index.js
Вы получите вывод, например:
You should use brightred on your website. It's HTML code is #E74C3C
My favorite color is skyblue/#5DADE2, btw
Ваш скрипт смог использовать последнюю функцию в вашем модуле colors
без необходимости запуска npm update
. Это облегчит внесение изменений в это приложение в процессе разработки.
При написании более крупных и сложных приложений подумайте о том, как сгруппировать связанный код в модули и как эти модули должны быть настроены. Если ваш модуль будет использоваться только одной программой, он может оставаться в том же проекте и ссылаться на него по относительному пути. Если модуль позже будет доступен отдельно или будет находиться в другом месте, чем проект, над которым вы сейчас работаете, установка или связывание могут быть более жизнеспособными. Активные модули разработки также выигрывают от автоматического обновления ссылок. Если модуль не находится в активной разработке, использование npm install
может быть самым простым вариантом.
Вывод
Из этого руководства вы узнали, что модуль Node.js — это файл JavaScript с функциями и объектами, которые могут использоваться другими программами. Затем мы создали модуль и связали функции и объекты с глобальным объектом exports
, чтобы сделать их доступными для внешних программ. Наконец, вы импортировали этот модуль в программу, демонстрируя, как модули объединяются в более крупные приложения.