Изучение Node.js

Материал из AOW

Перейти к: навигация, поиск

Содержание

Введение

Node.js является серверной реализацией языка JavaScript, главной особенностью которой является асинхронное выполнение кода. Данное решение идеально подходит для высоконагруженных и realtime приложений, например игры, чаты, задачи, где требуется высокая скорость отклика и малое количество данных.

Установка

Быстрая установка Node.js на Windows

Скачать установщик (.msi) можно отсюда http://nodejs.org/download/

Node.js также содержит уже установленный npm (пакетный менеджер для Node.js). Он помогает быстро инсталлировать различные вспомогательные модули.

Материал для изучения

Прекрасный сайт для начала изучения - http://www.nodebeginner.ru/

Среды разработки

Лучшей IDE на данный момент это JetBrains WebStorm http://www.jetbrains.com/webstorm/

Также есть облачная IDE для неё (https://c9.io/), с помощью которой можно также совместно редактировать код как в Google Docs, но для серьёзных проектов считаю, что её использовать рановато

Достоинства и недостатки

Недостатки

  • Сред разработок под Node.js не так уж и много, большинство из тех, что есть больше заточены под клиентский JavaScript. Из всех хочется выделить WebStorm от компании JetBrains, но она стоит денег (99$ за коммерческую лицензию).
  • Вторым неприятным моментом станет необходимость перезапуска приложения после внесения каждого изменения. Несмотря на существование утилит, автоматизирующих этот процесс, некоторое время на это всё равно уходит. Так же быстро, как на PHP, внести изменение и сразу увидеть результат не получится. Однако, приложение перезапускается достаточно быстро — от одной до нескольких секунд, в зависимости от используемых модулей. В этом Node.JS, несомненно, выигрывает у Java — там перезапуск серьёзного WEB-приложения происходит намного дольше.
  • Следующей проблемой, с которой столкнутся начинающие Node.JS разработчики, будет, скорее всего, утечка памяти. За памятью надо следить всегда и везде, но быстро живущие PHP-скрипты или небольшой клиентский JavaScript сильно расслабляют. В таких приложениях многие разработчики особо не предают значения потере нескольких килобайт памяти, а некоторые вообще не следят за этим показателем. Node.JS таких поблажек не делает. Приложение на Node.JS работает долго, и в случае утечки, каждый запрос к сайту будет уносить с собой кусочек памяти, которая очень быстро закончится, что приведёт к известным последствиям. Специфика JavaScript также располагает к появлению этого типа ошибок. Одно лишнее замыкание в большой области видимости или один потерянный var могут подарить Вам незабываемые часы дебага. Но в этом есть и плюс — такой опыт заставит любого разработчика ценить память и контролировать её использование при программировании на других языках. Лично я не считаю эту особенность минусом.
  • Ещё одна особенность, которая доставляет неудобства — это возврат ошибок из асинхронного кода. Для сравнения, в PHP весь код выполняется синхронно, поэтому отловить ошибку на любом уровне вложенности можно с помощью конструкции try-catch. Мы можем завернуть в неё работу контроллера и при возникновении исключительной ситуации сделать throw, и ошибка «всплывёт» к ожидающему её обработчику, который покажет пользователю красивую страничку позора. Несмотря на то, что в JavaScript тоже есть конструкция try-catch, нам она не поможет, т.к. большая часть кода работает асинхронно (операции ввода/вывода). При этом исключительные ситуации, как правило, возникают не при вызове метода, а при работе его callback`а, который выполняется уже вне конструкции try-catch. Для передачи информации об ошибках в Node.JS принято использовать первый параметр callback-функции. Т.е. если у нас возникла ошибка, мы вызываем callback-функцию либо с одним единственным параметром, описывающем её, либо первый параметр выставляем в undefined/null, а в последующих передаём результаты работы нашего функционала. В реальных приложениях вложенность вызовов может быть довольно большой и каждый раз передавать ошибку наверх очень неудобно. Полагаю, что проблему всё же можно решить, применив AOP, но это тема выходит за рамки данной статьи.
  • Также заставят понервничать и самые простые ошибки, которые довольно часто добираются и до production-сервера. Опечатка в имени переменной в очень редко выполняемом блоке кода может привести к остановке всего сайта или одного из процессов, если используется cluser api. Чтобы избежать подобных неприятностей, можно использовать утилиты, мониторящие работу приложения и перезапускающие его при необходимости, но настоящие ниндзя просто хорошо тестируют свой код (хотя никто не застрахован от ошибки в стороннем модуле).
  • Сложные математические расчёты не подходят для Node.JS. Node.JS всё же возможно производить сложные математические расчёты, путём разбиения задачи на короткие итерации, выполняемые за несколько витков event loop, но это уже извращения и фанатизм. Сложные вычисления гораздо проще выносить за пределы event loop или вообще выбрать другую технологию для разработки.

Достоинства

  • Самым значимым преимуществом Node.JS я считаю асинхронный ввод/вывод и прозрачность работы с ним. В большинстве WEB-проектов самыми частыми операциями являются чтение данных из БД и их сохранение. Эти же операции обычно являются самыми медленными. Но далеко не всегда они зависят друг от друга, наоборот, в большинстве случаев они атомарны. Например, при добавлении нового комментария к статье, нам нужно: сохранить сам комментарий; обновить пользователя (например, количество комментариев у пользователя и дату его последнего комментария); обновить статью (аналогично обновлению пользователя); записать в лог результат запроса. Все эти операции не зависят друг от друга и СУБД способна выполнять их одновременно. При синхронном выполнении, например в PHP, эти операции будут выполняться друг за другом последовательно, каждый раз ожидая завершения предыдущей. В Node.JS мы имеем возможность отправить все 4 этих запроса к СУБД «параллельно». На самом деле запросы всё же отправляются последовательно (поэтому я взял в кавычки слово «параллельно»), т.к. Node.JS работает в одном процессе. Но Node.JS не дожидается результата работы предыдущего запроса, чтобы отправить следующий. Временем отправки запроса, по сравнению со временем его работы, при этом можно пренебречь. Когда запросы выполнятся, будут вызваны callback-функции для обработки их результата. Эти вызовы будут происходить так же последовательно, как и отправка запросов, а результат их будет обработан несравнимо быстрее времени их выполнения. Таким образом, общее время работы с данными будет приблизительно равно времени работы самого долгого запроса + небольшой оверхед на отправку запросов и обработку их результатов. Но в любом случае это будет быстрее, чем сумма времени выполнения всех запросов при их последовательной обработке (оверхед на отправку запросов и обработку их результатов в этом случае тоже никуда не уходит).
  • Второй очень приятной возможностью является то, что ответ клиенту можно (и нужно) отправить сразу же, как он будет готов, не дожидаясь завершения работы всей логики запроса. Вернёмся к предыдущему примеру. При добавлении комментария мы записываем в БД некий лог. Эта операция нужна нам, но не нужна пользователю для получения ответа. С Node.JS мы можем сформировать и отправить ответ, а потом доделать то, что нужно нам: записать логи, очистить кеш и т.п. Время ожидания пользователя, соответственно, уменьшается.
  • Третий положительный фактор — мы имеем одинаковый язык на сервере и на клиенте, это позволяет повторно использовать некоторый код (валидация форм, построение шаблонов на клиенте и т.п.). Да и в целом, это очень упрощает разработку, особенно, когда клиентская часть приложения сложная и требует серьёзной работы, а не обработки пары-тройки событий на кнопках.
  • Процесс Node.JS живёт долго и обрабатывает все http-запросы внутри себя. Это значит, что для каждого нового запроса не выполняется инициализация, как, например, на PHP. Настройки загружены, соединения с БД и с кешем открыты, код скомпилирован и готов к работе. Благодаря такой архитектуре и гибкости JavaScript открывается огромный простор для различных техник оптимизации. Например, один раз разобрав шаблон, можно хранить его в виде функции, принимающей на вход данные и возвращающей готовый HTML. Или можно легко организовать локальное (для процесса) кеширование, наиболее часто используемых данных, что даст прирост в скорости работы с ними даже по сравнению с memcached. Да, для PHP есть решения, которые позволяют частично ускорить процесс инициализации — APC для op-code, поддержка постоянных соединений в FastCGI и т.п. Но при сравнении ускоренного процесса инициализации с его отсутствием в принципе — выигрыш всегда будет за последним.
  • Вокруг Node.JS за его относительно короткую жизнь уже образовалась солидная экосистема, включающая сотни модулей и, соответственно, их разработчиков. Во многом благодаря удобству github сообщество имеет отличный инструмент для развития этой экосистемы, которое идёт семимильными шагами, и свой вклад в это развитие может внести любой желающий. С помощью таких инструментов, как The Node Toolbox и npm, процесс поиска, выбора и установки необходимых модулей становится простым и быстрым.
  • Сам язык JavaScript и API Node.JS очень гибкие и лаконичные. Программы получаются компактными и легко читаемыми. Вы вряд ли увидите в них классы, состоящие практически целиком из геттеров и сеттеров, или десятки файлов с описаниями интерфейсов. Такие вещи, как замыкания и лямбда-функции, позволяют писать очень красивый код, однако при особом таланте разработчика способны превратить его в филиал ада.

Использованный материал: [1]

Личные инструменты

Разработка веб-сайтов, автоматизация.
По всем вопросам обращайтесь по телефонам:

+7 495 640 29 90
http://artofweb.ru