Объект глобальной области видимости, который в браузере называется window
, в Node имеет более осмысленное название global
.
Модули
Кроме нескольких упомянутых переменных, вроде console
и process
, Node держит мало функционала в глобальной области видимости. Для доступа к остальным встроенным возможностям вам надо обращаться к системе модулей.
Система CommonJS, основанная на функции require
, была описана в главе 10. Такая система встроена в Node и используется для загрузки всего, от встроенных модулей и скачанных библиотек до файлов, являющихся частями вашей программы.
При вызове require
Node нужно преобразовать заданную строку в имя файла. Пути, начинающиеся с "/"
, "./"
или "../"
, преобразуются относительно пути к текущему модулю, где "./"
означает текущую директорию, "../"
– директорию выше, а "/"
– корневую директорию файловой системы. Если вы запросите "./world/world"
из файла /home/marijn/elife/run.js
, Node попробует загрузить файл /home/marijn/elife/world/world.js
. Расширение .js
можно опускать.
Когда передаётся строка, которая не выглядит как относительный или абсолютный путь, то предполагается, что это либо встроенный модуль, или модуль, установленный в директории node_modules
. К примеру, require("fs")
выдаст вам встроенный модуль для работы с файловой системой, а require("elife")
попробует загрузить библиотеку из node_modules/elife/
. Типичный метод установки библиотек – при помощи NPM, к которому я вернусь позже.
Для демонстрации давайте сделаем простой проект из двух файлов. Первый назовём main.js
, и в нём будет определён скрипт, вызываемый из командной строки, предназначенный для искажения строк.
var garble = require("./garble");
// По индексу 2 содержится первый аргумент программы из командной строки
var argument = process.argv[2];
console.log(garble(argument));
Файл garble.js
определяет библиотеку искажения строк, которая может использоваться как заданной ранее программой для командной строки, так и другими скриптами, которым нужен прямой доступ к функции garble
.
module.exports = function(string) {
return string.split("").map(function(ch) {
return String.fromCharCode(ch.charCodeAt(0) + 5);
}).join("");
};
Замена module.exports
вместо добавления к нему свойств позволяет нам экспортировать определённое значение из модуля. В данном случае, результатом запроса нашего модуля получится сама функция искажения.
Функция разбивает строку на символы, используя split
с пустой строкой, и затем заменяет все символы на другие, с кодом на 5 единиц выше. Затем она соединяет результат обратно в строку.
Теперь мы можем вызвать наш инструмент:
$ node main.js JavaScript
Of{fXhwnuy
Установка через NPM
NPM, вскользь упомянутый в главе 10, это онлайн-хранилище модулей JavaScript, многие из которых написаны специально для Node. Когда вы ставите Node на компьютер, вы получаете программу npm
, которая даёт удобный интерфейс к этому хранилищу.
К примеру, один из модулей NPM зовётся figlet
, и он преобразует текст в “ASCII art”, рисунки, составленные из текстовых символов. Вот как его установить:
$ npm install figlet
npm GET https://registry.npmjs.org/figlet
npm 200 https://registry.npmjs.org/figlet
npm GET https://registry.npmjs.org/figlet/-/figlet-1.0.9.tgz
npm 200 https://registry.npmjs.org/figlet/-/figlet-1.0.9.tgz
figlet@1.0.9 node_modules/figlet
$ node
> var figlet = require("figlet");
> figlet.text("Hello world!", function(error, data) {
if (error)
console.error(error);
else
console.log(data);
});
_ _ _ _ _ _ _
| | | | ___| | | ___ __ _____ _ __| | __| | |
| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_| |_|\__,_(_)
После запуска npm
install NPM создаст директорию node_modules
. Внутри неё будет директория figlet
, содержащий библиотеку. Когда мы запускаем node
и вызываем require("figlet")
, библиотека загружается и мы можем вызвать её метод text
, чтобы вывести большие красивые буквы.
Что интересно, вместо простого возврата строки, в которой содержатся большие буквы, figlet.text
принимает функцию для обратного вызова, которой он передаёт результат. Также он передаёт туда ещё один аргумент, error
, который в случае ошибки будет содержать объект error
, а в случае успеха – null
.