Интерпретатор Node построен на основе механизма V8 JavaScript, разработанного компанией Google. Версия Node 0.4 использует версию V8 3.1, которая реализует все особенности ECMAScript 5, за исключением строгого режима.
После загрузки, компиляции и установки Node вы сможете запускать программы, написанные для этого интерпретатора, как показано ниже:
node program.js
******************************************
Знакомство с интерпретатором Rhino мы начали с функций print и load. Интерпретатор Node имеет похожие инструменты, но с другими именами:
// Подобно
броузерам, для вывода отладочной информации Node определяет
// функцию console.log.
console.log("Hello Node"); // Выведет отладочную информацию в консоль
// Вместо load в нем используется функция require.
// Она загружает и выполняет (только один) указанный модуль и возвращает объект,
// содержащий имена, экспортируемые модулем.
var fs = require("fs"); // Загрузит модуль ”fs" и вернет объект с его API
Интерпретатор Node реализует в глобальном объекте все стандартные конструкторы, свойства и функции, предусмотренные стандартом ECMAScript 5. Однако в дополнение к этому он также поддерживает клиентские функции для работы с таймером:
setTimeout, setlnterval, clearTimeout и clearlnterval:
process.chdir // Выполняет переход в другой каталог
process.exit // Завершает программу (после запуска всех обработчиков)
Поскольку функции и методы, реализуемые интерпретатором Node, являются асинхронными, они не блокируют выполнение программы в ожидании завершения операций. Неблокирующий метод не может вернуть результат выполнения асинхронной операции. Если в программе потребуется получить результат или просто определить, когда завершится операция, необходимо определить функцию, которую интерпретатор Node сможет вызвать, когда результат будет доступен или когда операция завершится (или возникнет ошибка). В некоторых случаях (например, в вызове
setTimeout
выше) достаточно просто передать методу функцию в виде аргумента, и Node вызовет ее в соответствующий момент времени. В других случаях можно воспользоваться инфраструктурой событий интерпретатора Node. Объекты, реализованные в интерпретаторе Node,
которые генерируют события (их часто называют источниками (emitter) событий), определяют метод
on
для регистрации обработчиков. Они принимают в первом аргументе тип события (строку) и функцию-обработчик во втором аргументе. Для различных типов событий функциям-обработчикам передаются различные аргументы, поэтому вам может потребоваться обратиться к документации по API, чтобы точно узнать, как писать свои обработчики:
emitter.on(name, f) // Регистрирует f для обработки события name,
// генерируемого объектом emitter
emitter.addListener(name, f) // То же самое: addListener - синоним для оп
emitter.once(name, f) // Для обработчиков однократного срабатывания,
// Сигналы POSIX, такие как SIGINT, SIGHUP и SIGTERM, также генерируют события
process.on("SIGINT", function { console.logCIgnored Ctrl-C"); });
Поскольку интерпретатор Node позволяет выполнять высокопроизводительные операции ввода/вывода, его прикладной интерфейс к потокам ввода/вывода является одним из наиболее часто используемых в программах. Потоки, открытые для чтения, генерируют события, когда появляются данные, готовые для чтения. В следующем примере предполагается, что s - это поток, открытый для чтения, созданный где-то в другом месте программы. Ниже будет показано, как создавать объекты потоков для файлов и сетевых сокетов:
// Входной поток
s.on("data", f); // При появлении данных передать их функции f в аргументе
s.on("end", f); // событие "end" возникает по достижении конца файла,
// когда данные больше не могут поступить
s.оп("еrror", f); // Если что-то не так, передаст исключение функции f
s.readable // => true, если поток по-прежнему открыт для чтения