Уважаемые читатели! Этой статье 3 года, но, по-моему мнению, в ней содержатся интересные вещи. Спасибо за понимание.
Node.js, в целом, вызывает две реакции у людей, которым я представляю его. В основном они либо понимают его сразу, либо заканчивается тем, что они ничего не понимают.
Если ты до сих пор относишься ко второй категории, давай я попробую объяснить Node:
- Это инструмент для командной строки. Ты скачиваешь архив, компилируешь исходники и устанавливаешь.
- Ты сможешь запускать свои JavaScript программы, написав «node my_app.js» в терминале.
- JavaScript код выполняется в V8 javascript engine (штука, которая делает Google Chrome таким быстрым).
- Node представляет JavaScript API для доступа к файловой системе и к сети.
Но ведь я могу сделать все, что мне нужно на Ruby, Python, PHP, Java, etc
Я слышу тебя! 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 два задания: прочитать и записать файл, а потом он ложится спать. Как только Node завершил задачу, вызовется callback. Но только одна callback-функция вызывается за раз. До тех пор, пока эта функция не закончит работу, все остальные callback'и стоят в очереди и ждут. Кроме того, нет никаких гарантий, в каком порядке вызовутся эти функции.
Так мне не придется беспокоиться о том, использует ли мой код одинаковые структуры данных в одно и то же время?
Именно! Вот вся красота однопоточного/event loop дизайна JavaScript!
Это все здорово, но зачем мне это использовать?
Одна из причин – эффективность. В веб-приложении, обычно, время отклика – это сумма времени, которое затрачивается на выполнение всех запросов к базе данных. С помощью Node ты можешь сразу все запросы сразу, из этого следует, что время отклика приложения сократится до времени выполнения самого долгого запроса.
Другая причина – JavaScript. Ты можешь использовать Node для обмена кодом между браузером и сервером. Также, JavaScript становится действительно универсальным языком. Не важно, что вы писали на Python, Ruby, Java, PHP,… в прошлом вы, вероятно, писали что-то на JS, ведь так?
И последняя причина – скорость кода. V8 постоянно расширяется и остается одним из самых быстрых динамических интерпретаторов на планете. Я даже и не знаю о каком-либо другом языке, который бы так же агрессивно, как JavaScript сейчас, налегал на скорость. В добавок ко всему, Node'вские средства ввода/вывода действительно легковесны, что позволяет использовать ввод/вывод на вашей системе так быстро, как это вообще возможно.
Так ты говоришь, что я должен начать писать все свои приложения на Node, начиная с этого момента?
И да, и нет. Как только ты начнешь раскачивать молот Node, все, очевидно, будет выглядеть гвоздями. Но, если ты работаешь над чем-то с дедлайном, можешь основывать свое решение на этих вещах:
- Важны ли низкое время отклика и параллелизм? У Node с этими вещами все хорошо.
- Насколько большой это проект? Для маленьких подойдет отлично, а вот большие проекты следует качественно оценить на предмет наличия нужных библиотек и других вещей.
Работает ли Node на Windows?
Нет, если у тебя Windows, то тебе нужно поставить виртуальную машину (я рекомендую VirtualBox) с Linux на борту. Поддержка Windows планируется, но не стоит задерживать дыхание на несколько месяцев, если ты не хочешь помочь с портированием.
Могу ли я получить доступ к DOM в Node?
Отличный вопрос! Нет, DOM – это браузерная штуковина, и Node'вский JS движок (V8), к счастью, отделен от всего этого беспорядка. Тем не менее, есть люди, работающие над реализацией DOM в Node в качестве модуля, который может открыть очень интересные возможности, такие как модульное тестирование client-side кода.
Разве событейно-ориентированное программирование не слишком сложное?
Все зависит от тебя. Если ты уже научился жонглировать AJAX запросами и пользовательскими событиями в браузере, то привыкнуть к Node не составит большого труда.
В любом случае, TDD может реально помочь тебе с поддержкой проектов.
Кто это использует?
Есть небольшой/неполный лист на Node wiki (поскрольте до «Компании, использующие Node»). Yahoo эксперементирует с Node для YUI, Plurk использует его для massive comet, Пол Биказ (создатель JQuery) делает умопомрачительный игровой движок, который использует немного Node на сервере. Joyent наняла Райана Дала (создателя Node) и активно спонсирует проект.
Ах, да. Heroku только что анонсировала (экпериментальную) поддержку хостинга Node проектов.
Где я могу узнать больше?
Тим Касвелл запустил отличный блог о Node. Читайте #nodejs в Твиттере. Подпишитесь на рассылку. А потом приходите на IRC канал #node.js (да-да, точка в имени). Нас там уже скоро будет 200.
Я также продолжаю писать статьи здесь, на debuggable.com.
Это перевод статьи.
Спасибо за внимание и инвайт.
Автор: slaykovsky