Выбрать главу

Объект глобальной области видимости, который в браузере называется 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.