Node.JS
14 September 2010

Understanding node.js

Original author: Felix Geisendörfer
Translation
Node.js обычно вызывал у людей, которым я о нём рассказывал, две различные реакции. В основном они воспринимали его «как есть», однако многие были сбиты с толку.

Если вы относитесь ко второй группе, я попробую объяснить, что же такое Node.js:
  • Это инструмент командной строки. Вы скачиваете архив, компилируете и устанавливаете его.
  • Это позволит вам выполнять программы на JavaScript, набрав 'node my_app.js' в терминале.
  • JavaScript выполняется движком V8 (тем самым, благодаря которому так быстро работает Google Chrome).
  • Node.js предоставляет API для доступа к сети и файловой системе из JavaScript.

«Но я могу сделать то, что мне необходимо, с помощью Python, Ruby, Java, PHP,… !».

Да, это я уже слышал. И вы правы! Node не волшебный единорог, который придёт и сделает всё за вас. Это просто инструмент, и он, вероятно, не сможет заменить все остальные, по крайней мере не сейчас.

«Ближе к делу!»

Хорошо. Node хорошо применим тогда, когда нужно сделать несколько вещей одновременно. Вы когда-нибудь, написав очередной кусок кода, говорили: «Я хотел бы, чтобы это работало параллельно»? Так вот в Node всё выполняется параллельно, за исключением вашего кода.

«Что?»

Всё верно, всё выполняется параллельно, за исключением вашего кода. Чтобы понять это, представьте себе, что ваш код царь, а Node — его слуга.

Каждый день начинается с того, что один слуга будит короля и спрашивает, нужно ли ему что-нибудь. Царь дает слуге список задач и идет спать дальше. Слуга распределяет эти задачи среди всех слуг, и они идут работать.

Как только слуга завершает какую-то задачу, он приходит к царю и докладывает. Царь одновременно принимает у себя только одного слугу. Иногда после доклада царь даёт слуге другие задания.

Слуги выполняют задания одновременно, только докладывают о результатах по одному, так чтобы царь мог сосредоточиться. *

«Это замечательно, но не могли бы вы не говорить метафорами?»

Конечно. Простая программа для Node выглядит следующим образом:

var fs = require('fs')
  , sys = require('sys');

fs.readFile('treasure-chamber-report.txt', function(report) {
  sys.puts("oh, look at all my money: "+report);
});

fs.writeFile('letter-to-princess.txt', '...', function() {
  sys.puts("can't wait to hear back from her!");
});

Этот код даёт Node 2 задачи для чтения и записи файлов, а затем перейдет в режим сна. Когда Node завершит выполнение задачи, будет вызвана функция обратного вызова. Но одновременно может выполняться только одна такая функция, так что до окончания её выполнения остальные будут ждать своей очереди. Кроме того, нет никакой гарантии, в каком порядке будут выполнены функции обратного вызова для этих задач.

«Значит не придется беспокоиться об одновременном доступе к данным из разных функций?»

Вы это поняли! Да, это замечательное следствие дизайна однопоточного цикла событий в JavaScripts!

«Очень хорошо, но почему я должен это использовать?»

Одной из причин является эффективность. В веб-приложении ваше время отклика, как правило, в основном складывается из времени, необходимого для выполнения всех ваших запросов к базе данных. Используя Node вы можете выполнить все ваши запросы сразу, сокращая времени отклика до продолжительности самого медленного запроса.

Другая причина кроется в использовании JavaScript. Используя Node вы можете переиспользовать часть кода на стороне и сервера, и клиента. JavaScript развивается в сторону того, чтобы стать действительно универсальным языком. Неважно, если вы раньше использовали Python, Ruby, Java, PHP,…, но вы наверняка использовали при этом и JavaScript, не так ли?

И последняя причина в скорости. V8 постоянно расширяет границы нашего представления о скорости выполнения динамических языков. Я не могу вспомнить какой-либо другой язык, который бы становился быстрее настолько агрессивно, как это делает в настоящее время JavaScript. Кроме того, операции ввода/вывода в Node действительно хорошо оптимизированы и позволяют задействовать потенциал системы настолько, насколько это возможно.

«Так вы говорите, я теперь должен писать свои приложения на Node?»

И да, и нет. Как только вы научитесь пользоваться Node также хорошо, как молотком, все задачи начнут казаться гвоздями. Но если вы работаете над чем-то с конкретными сроками, вы можете выбрать (или не выбрать) Node, ответив на следующие вопросы:
  • Важно ли малое время отклика? Node позволит вам достичь этого.
  • Насколько велик проект? В небольшие проекты node великолепно впишется. В случае большого проекта требуется тщательная оценка (есть ли необходимые библиотеки, человеческие ресурсы для исправления ошибок и т.д.).

«Работает ли Node на Windows?»

Нет. Если вы используете Windows, вам нужна виртуальная машина (я рекомендую VirtualBox) с Linux. Поддержка Windows планируется, но не стоит задерживать дыхание в течение следующих нескольких месяцев в ожидании, лучше помогите с портированием (прим. пер.: на данный момент Node должен работать в Windows+Cygwin).

«Могу ли я получить доступ к DOM в Node?»

Отличный вопрос! Нет, DOM определён в браузере отдельно от движка JavaScript (V8). Тем не менее, есть люди, работает над реализацией DOM в качестве модуля Node, что может открыть очень интересные возможности, такие как тестирование клиентского кода с помощью Node.

«Действительно ли программировать на языках с событиями тяжело?»

Это зависит от вас. Если вы уже научились жонглировать AJAX вызовами и пользовательскими событиями в браузере, не должно быть проблемой и привыкнуть к Node.

В любом случае, TDD может сильно помочь вам создавать легко обслуживаемые приложения.

«Кто уже использует Node?»

Неполный список есть в вики (пролистайте до «Companies using Node»). Yahoo экспериментирует с Node и YUI, Plurk использует его для крупномасштабного Comet-сервера, а Paul Bakaus (из команды JQuery UI) пишет умопомрачительных игровой движок, который использует Node на бекэнде. Joyent нанял автора Node и в значительной степени спонсирует её развитие.

Ах да, только что Heroku объявила (экспериментальную) поддержку хостинга Node приложений.

«Где я могу узнать больше?»

Tim Caswell открыл замечательны блог How To Node. Следите за #nodejs в Твиттере. Подпишитесь на рассылку. И приходите в IRC, #node.js (да, в имени точка).

Я также буду писать о Node в блоге debuggable.com.

Это всё на сегодня. Не стесняйтесь комментировать, если у вас есть вопросы!

— Felix Geisendörfer

*: Я, очевидно, утрирую, но найти аналог для понятия неблокирующего выполнения кода в реальности довольно трудно.

+87
9.5k 182
Comments 48