Понимание Node.js

Уважаемые читатели! Этой статье 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.

Это перевод статьи.

Спасибо за внимание и инвайт.
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 18

    +8
    Работает ли Node на Windows?

    Работает. Поправьте, пожалуйста, чтобы не вводить в заблуждения людей :)
      0
      Работает конечно :)
      Пять минут назад cmd.exe вполне нормально скушал npm install -g phonegap

      А… вон оно чего, оригинал то 29/4/10
      +8
      в Node все работает параллельно, за исключением твоего кода.


      Может сами сначала поймем node.js перед тем как кого-то учить?

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

      Posted 3 years ago,
        0
        Извините, но этой статье 3 года, да. Но мне показалось, людям она будет интересна в общем случае.
          +4
          Так об этом же и надо предупредить в самом начале статьи: внимание, читатели, это статья старая, но интересная. Но я бы лично не стал бы переводить для такой сильно меняющейся технологии такую старую статью. В худшем случае, если альтернатив нет, можно сделать свою компиляцию мнений по нескольким статьям.
            0
            Простите, пожалуйста. Как будет доступ к нормальному интернету — обязательно укажу.
          0
          в Node все работает параллельно, за исключением твоего кода.

          Может сами сначала поймем node.js перед тем как кого-то учить?

          А в чем проблема? Эта фраза как раз очень хорошо описывает, как работает node.
            +2
            асинхронно != параллельно
              0
              В данном-то случае параллельно. То есть после вызова асинхронного API код Node продолжает выполняться дальше, отвлекаясь только на обработку приходящих событий об окончании операций ввода-вывода, до этого параллельно коду Node выполнявшихся.
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            Отчасти из-за отсутствия нативного бинарного типа данных
            Вообще-то в джаваскрипте таких типов полным-полно (глобальные типы Float32Array, Float64Array, Int16Array, Int32Array, Int8Array, Uint16Array, Uint32Array, Uint8Array), просто Node.js совершает операции ввода-вывода не с ними, а со своими буферами (считать ли и этот двоичный тип «нативным» — решайте сами).

            Проблема этого различия решается посредством jParser, например.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                Обладателям отрицательной кармы на Хабрахабре запрещено употреблять язык HTML в комментариях.

                Теги автоматически выкусываются поэтому.
            0
            Хоть и не очень много программировал на node.js, но он мне очень нравится. Для продакшена делал только конвертер синхронных запросов в асинхронную систему. Сервис на node.js держал входящие соединения, пока с запросами производилась сложная асинхронная обработка, и в асинхронном-же режиме отдавалась конвертеру результат, который возвращался в исходный запрос. Простота реализации такого на node.js просто зашкаливает. На данный момент, хоть я на нем и не пишу, но он в тройке моих любимых языков. :)
              +1
              Могу ли я получить доступ к DOM в Node?
              За годы, прошедшие с публикации первоисточника, ответ изменился на положительный.

              И здесь можно иметь в виду не только модуль jsdom, но и, например, модуль cheerio, название которого порадует поклонников аниме «Katanagatari» (а ряд отличий от jsdom в лучшую сторону порадует и остальных).
                +1
                Да простят меня фанаты, но мне больно смотрнеть на устройство модульной системы.
                Это самое ужасное что мне доводилось видеть.

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

                Такой стандартный функционал как readln (gets) и то отсутствует из коробки, реализован несколькими модулями, большинство из которых вообще не пригодны.

                Проект у меня вызывает двоякие чувство откровенно говоря… И не приятных будет побольше.
                  +1
                  В итоге у нас один и тот же модуль может встречаться в проекте несколько раз только потому, что каждый модуль, который его захочет — поставит свою копию.
                  Это-то как раз и есть одно из величайших достоинств системы модулей Node.

                  Во-первых, оно позволяет исключить проблемы в таких обстоятельствах, когда модуль A зависит от модулей B и C, каждый из которых хочет свою версию модуля D, из-за чего никак не понятно, какую версию модуля D ставить им. (Эти обстоятельства могут возникнуть не только на этапе установки B и C, но и после очередного обновления их.) Когда каждый модуль получает все свои необходимые модули в своих подкаталогах, конфликты всецело исключены.

                  Во-вторых, когда каждый модуль получает все свои необходимые модули в своих подкаталогах, то можно удалить его, просто грохнув его собственный каталог (в файловом менеджере) и не прибегая ко вводу загадочных команд. Потому что после него не останутся в других каталогах такие модули, которые были ему нужны, а теперь никому не нужны. Потому что с его удалением не будут удалены какие-то такие модули, которые были установлены с ним вместе и в его каталоге, но со временем стали нужны и другим модулям.

                  После чего Роджерс (Mikeal Rogers) слегка рехнулся от счастья и начал проповедовать вон там (и есть перевод на Хабрахабре), что все эти подкаталоги неплохо бы ещё и в репозиторий отправлять дословно — чтобы, значит, гарантия была, что из репозитория извлекается гарантированно работоспособная версия приложения со всеми необходимыми ему модулями точно в той версии, которая проверена была разработчиком.

                  Но это он сильно хватил лишнего. Сейчас принято полагаться на то, что npm хранит все необходимые версии модулей, так что достаточно сказать, например, npm install step@0.0.4 для того, чтобы получить в точности ту же самую ноль-ноль-четвёртую версию модуля step и на рабочей машине, если именно эта версия у разработчика на машине была проверена и признана приемлемою.
                    +1
                    На самом деле все это связано с другой, не менее большой болячкой nodejs, а именно абсолютная нестабильность api, ни самого nodejs, ни каких либо модулей. Люди не могу гарантировать работоспособность чего-бы то ни было при минорных обновлениях версий.

                    Из всех возможных вариантов решения данной проблемы был выбран наиболее «в лоб».

                    Ну вот не лежит у меня душа к такой идеологии, ничего не могу с этим поделать :(

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

                Самое читаемое