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

*: Я, очевидно, утрирую, но найти аналог для понятия неблокирующего выполнения кода в реальности довольно трудно.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 48

    +4
    Легко читаемо. Спасибо за перевод.
      +4
      Евангелистская статья должна быть простой и понятной :-)
      +4
      Очень удачная метафора про царя. Браво.
        0
        «Могу ли я получить доступ к DOM в Node?»

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


        Несколько недель назад я экспериментировал с этим — получилось очень интересно, но скорость выполнения операций c DOM на порядок ниже скорости их выполнения в браузере, из-за чего пришлось переписать систему на ruby(используя гемы, работающие на нативных либах).
          0
          Было бы интересно узнать, какую реализацию вы пробовали.
          Уверен, появятся и нативные модули для DOM.
            0
            Пользовался этой библиотекой.
            Пока в некоторых местах поведение отличается от поведения браузера, но, применив голову, легко можно пофиксить и отдать автору патч :)
            Библиотека быстро развивается. Думаю, ее тесты позволят быстрее разработать нативную библиотеку.
              +1
              Моей первой статьей на хабре как раз было использование node.js как веб-майнера, в которой я использовал одну из реализаций «прощающего» html-парсера, превращающего текст в dom-дерево — априкот. Но сам априкот использует jsdom.

              Ссылка на статью — habrahabr.ru/blogs/personal/102840/
              Тогда еще не хватало кармы перенести в блок «Javascript». Может кому полезно будет :)
              0
              Не вот так? Вообще уже есть jsdom, на нём работает jQuery. Т.е. можно сделать робота который будет обходить страницы и извлекать данные, например. Правда для тестирования интерфейсов имхо пока возможностей маловато.
                0
                Примерно так, да, только jQuery мы не использовали. Писали json rest сервис для обработки html данных.
              +1
              > Нет. Если вы используете Windows, вам нужна виртуальная машина (я рекомендую VirtualBox) с Linux.
              Еще можно скомпилировать в Cygwin.
                0
                Все давно скомпилировано и работает. Вопрос только в автоматическом билде под винды каждой новой версии, т.к. разработчики под виндоус не привыкли замарачиваться с компилированием средств разработки после каждого обновления.
                  0
                  Месяца два назад смотрел его и скомпилированная версия под виндовс отставала на несколько версий и некоторые функции не работали. Убил с время на поиске багов, пересобрал и всё заработало. Теперь с недоверием отношусь к собранному.
                +1
                Про Socket.IO не рассказали
                  +1
                  Все претензии к Феликсу :-)

                  P.S. А тем, кто хочет почитать про Socket.IO на русском, могу посоветовать kuroikaze85.wordpress.com/2010/06/15/socket-io-node-js-game-making/.
                    +2
                    Отличная штука с неприятной схемой разработки. Посмотрите в гитхабе — за все время ни одного стороннего коммита они не приняли, при наличии порядка 40 веток от сторонних разработчиков с баг-фиксами. Такое чувство, что стараются сохранить копирайт для каких-то целей, мне непонятных. В худшем случае — для смены лицензии.
                      +1
                      Да, такое отношение не очень приятно. Мне пока с коллабораторами по Node везёт.
                    +1
                    «Работает ли Node на Windows?»

                    Да, работает же.
                    Сделать node.exe дело пяти минут, при наличии быстрого интернета (качать git+python иногда долго), и настроить nginx+apache локально еще 20 минут.
                      0
                      Простите, действительно указано как в комментариях к статье, так и в одном комменте.
                        0
                        Пожалуй напишу развёрнутое дополнение «от переводчика».
                      +1
                      Дополню по поводу того, где узнать о нём
                      прекрасный источник: kuroikaze85.wordpress.com от одноименного хабрапользователя, + nodejs.ru, аналог хабры вокруг темы node.js
                        0
                        Не находит:
                        Checking for openssl: not found
                        Checking for function SSL_library_init: not found
                        Checking for header openssl/crypto.h: not found
                        Checking for header port.h: not found
                        Checking for header sys/event.h: not found
                        Checking for function kqueue: not found

                        OS Kubuntu
                          0
                          Должно помочь:
                          $> sudo apt-get install openssl libssl-dev
                            0
                            Однако это не обязательно, только если вам нужна поддержка SSL и шифрования.

                            Остальные проверки же совсем не обязательны. Node.js собирается на многих платформах и использует нативные средства для организации event-loop. На BSD — kqueue, на Linux epoll/select. У вас Linux и при сборке будет использоваться epoll, судя по всему.
                              0
                              Спасибо! установил, уже тестирую :)
                          +1
                          Поставил плюс за статью из-за ссылки на Aves engine Очень круто
                            +1
                            Не паралельно, а асинхронно. См libevent. Тру параллельность будет только в случае нескольких воркеров и ядер.
                              0
                              И так можно.
                                0
                                Думаю автор использовал 'parallel' вместо 'async' из-за выбранной метафоры, цари с асинхронностью как-то совсем не сочетаются. Да и статья не нацелена на техническую точность.

                                В Node, кстати, используется другая реализация цикла, libev.
                                +2
                                Меня очень порадовал клиент для Redis redis-node-client, который поддерживает redis 2.0 с pub/sub-ом. Очень пригодилось, когда делали Comet сервер с большим колличеством подписок
                                  0
                                  Почему-то по упоминаниям (в основном в комментах) на хабре был уверен, что node.js — это веб-сервер или он «превращается» в него путем запуска команды «node.js mywebserver.js», после чего начинает слушать 80-й порт и обрабатывать HTTP запросы, как это может делать, скажем, скрипт на python?
                                    +1
                                    Это его основное применение, скажем так. Однако это может быть любой другой TCP сервер, а также можно писать обычные утилиты командной строки. Так, для Node есть обётртки для JSLint и различных JSMin'ов, есть система сборки приложений Jake и много другого.
                                    +1
                                    А как в ноде сейчас с отладкой обстоят? Когда я ее последний раз смотрел, там было что-то вроде «ну… э… этож йаваскрипт. Отлаживайтесь print'ами» :(
                                      +1
                                      Есть туториалы по отладке nodejs в eclipse
                                        +1
                                        Можно отлаживать в Eclipse, как уже сказали, и есть пошаговый дебагер для командной строки. Хуже всего тем, кто бинарные аддоны пишет, вот тогда сложно :-)
                                          0
                                          Сами понимаете, пошаговый отладчк для более-мене сложной отладки это инкарнация пушного зверя. А не подскажете, где туториалы по отладке в eclipse залегают?
                                            +1
                                            В вики описано, как подключить: github.com/ry/node/wiki/Using-Eclipse-as-Node-Applications-Debugger.
                                            Пробовал уже давно, но и тогда проблем не возникало.

                                            Ndb «пошаговый» ровно настолько же, насколько и gdb, т.е. можно просто поставить брейк в нужные места (причём это можно сделать и в самом коде с помощью строчки «debugger;») и дальше запускать выполнение пока не встретится брейк.
                                          +1
                                          Не пробовал, но из этой статьи можно узнать, как дебажить привычным образом в Хроме.
                                          0
                                          И приходите в IRC, #node.js (да, в имени точка).

                                          В какой IRC-сети?
                                            +1
                                            irc.freenode.net уже стандартно
                                              +1
                                              Или webchat.freenode.net — прямо из браузера :)
                                            0
                                            Я пытался поставить на Убунту-сервер 9.0 — просит очень много дополнительных ресурсов — у меня почти чистая установка. Кажется, хотело даже cc compiler. Ставил .deb пакет. Так как вы в теме, может посоветуете, как убить все недостающие зависимости одним выстрелом?
                                              +1
                                              Список зависимостей был бы кстати. Заодно расскажите. Какая версия Node лежит в вашем репозитории. Есть мнение, что лучше собирать самостоятельно из исходников.
                                                0
                                                Верное мнение, нод обновляется довольно часто. А сборка не очень тяжеловесная — она хорошо параллелится waf'ом.
                                              0
                                              Не могли бы вы рассказать какие существуют альтернативы node.js, и какие у него преимущества по сравнению с альтернативами?
                                                0
                                                Есть Tornado и Twisted на питоне, PHPDaemon. Насчёт остальных языков не в курсе.
                                                Подробно сравнить их не могу, не пробовал, однако Node удобен языком, удобно переиспользовать код и сам яваскрипт под события и цепочки колбеков хорошо заточен.
                                                  +1
                                                  Из той же оперы есть ещё eventmachine для ruby.
                                                  0
                                                  Так ли хороша парадигма одного процесса на приложение? Нужно либо очень внимательно следить за тем, чтобы в основном приложении не было узких мест, либо смириться с неэффективностью при отсутствии возможности ручного распараллеливания на многоядерных процессорах.
                                                    0
                                                    В той нише, которую занял node, это вполне оправдано. Врядли вы будете спорить с тем, что Nginx справляется со своеими задачами, а он в основном и сделан на event-loop. Вы можете возразить, что в Nginx параллельно работают несколько таких обработчиков. Но это можно сделать и на node, просто запустив несколько копий приложения. Если нужно связать отдельные потоки, то уже есть готовые библиотеки.

                                                    Наличие нескольких потоков в приложении не освобождает программиста от необходимости следить за узкими местами. Если есть вероятность, что какой-то поток намертво повиснет, то это подрывает доверие к такому приложению, так как могу повиснуть и два, и большее количество потоков. Фишка же node заключается в том, что подобные длительные операции, например обращение к диску или БД, выполняются в отдельном потоке или с помощью асинхронных функций операционной системы, а значит никогда не блокируют основной поток (цикл) выполнения.

                                                  Only users with full accounts can post comments. Log in, please.