Fork me on GitHub

1. Библиотеки для Node.js приложений

Добро пожаловать в руководство по созданию веб-приложений на Node.js. В рамках серии уроков мы будем делать веб приложение - записную книжку. Приложение так и назовем - Nodepad. Название не особенно оригинальное, зато легкое для понимания и четко формулирует цель.

1.1. Выбор фреймворков и инструментов

Современные веб приложения базируются на нескольких компонентах:

  • хранилище: реляционная БД, NoSQL
  • библиотека для хранилища: простые инструкции, ORM
  • веб сервер
  • менеджер пакетов
  • фреймворк для бэкенда
  • фреймворк для фронтенда
  • библиотеки для тестирования кода
  • система контроля версий

Но окончательный выбор, в конце концов, зависит от ситуации. Мне приходилось использовать те или иные технологии в зависимости от того, каким будет процесс развертывания приложения. Когда я разрабатываю ПО с открытыми исходными кодами, я предпочитаю использовать тот софт, который сможет легко установить предполагаемый пользователь.

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

1.2. Бэкенд

Создание веб приложений с помощью Node.js обычно предполагает использование того или иного фреймворка. Если Вы почитаете наши еженедельные сводки по Node.js, то узнаете, что их уже достаточно много. Некоторые из них представляют из себя попытки создания комплексных решений (набодобие Rails или Django), другие же больше концентрируются на маршрутизации и HTTP-абстракциях.

В качестве примера популярного Rails-подобного фреймфорка можно привести Geddy, которому уже 7 месяцев (на момент написания поста: 01-11-2010) и он активно развивается. Более простым примером является Sinatra-подобный фреймворк - Express, который разрабатывается с июня 2009 года и все еще регулярно обновляется.

Крупные фреймворки обычно предоставляют средства отображения ресурсов в файлы в соотношении один-ко-многим через абстракцию модель-вид-контролер (MVC). Таким образом, проект проект может быть организован, например, так:

  • Модели: user.js, note.js
  • Контролеры: users.js, notes.js
  • Представления: index.html (список элементов), edit.html, new.html

Однако, далеко не все фреймворки используют шаблон MVC. Так в мире Node.js много так называемых микро-фреймворков. Первоначально, я думал, что Express так же относится к микро-фреймворкаам, но количетсво абстракций, которые он предоставляется, говорит о том, что Express гораздо больше.

Я чувствую, что Express подходит как нельзя лучше для нашего проекта. Мы могли бы использовать практически любой фреймворк, но Express сочетает в себе много полезных вещей, которые сделают работу над проектов приятной, при этом сам Express остается достаточно легковесным фреймворком.

1.3. Фронтэнд

Некоторые UI-фреймворки заметно сокращяют количество рутинной работы при разработке пользовательского интерфейса. За последнее время появилось огромное количество JavaScript библиотек для разработки UI, среди которых можно выделить следующие типы:

  • Десктопо-подобные: Cappuccino, Sprout, Ext.js
  • Низкоуровневые: jQuery, Prototype, MooTools
  • Объединяющие низкоуровневые функции и богатый UI инструментарий: YUI
  • Интерфейс-ориентированные, базирующиеся на низкоуровневых библиотеках: Scriptaculous, jQuery UI

Мне кажется, что Cappuccino и SproutCore будут слишком тяжелыми для нашего проекта. А вот с помощью jQuery UI и темы Aristo можно получить отличные результаты, при этом приложение не будет казаться слишком тяжелым.

1.4. Тестирование

В серии Делаем фреймворк я уже упоминал о том, что существует CommonJS спецификация по модульному тестированию. Nodeunit основан на модуле assert из CommonJS, так что тесты будут не сильного отличаться от тех, что Вы писали раньше.

С другой стороны, Expresso предлагает assert.response, что делает тестирование сервера чуть более простым. Expresso создан тем же автором, что и Express (TJ Holowaychuk), так что не удивительно, что у этой библиотеки тестирования есть такая полезная возможость.

Пока я еще не определился, какую библиотеку использовать. Так что я попробую обе, когда начну писать приложение, и выберу наиболее подходящую из них.

1.5. Хранилище

В последние два года в области хранилищ данных все посходили с ума. Когда я начинал, были либо реляционные, либо объектные базы данных. Последние у меня так и не получилось использовать. То есть, я в основном пользовался Oracle, PostgreSQL или MySQL. Сейчас же мейнстримом становится NoSQL, который предалагет такие инструменты как CouchDB, MongoDB, Riak, Redis, Tokyo Cabine и многие другие.

Если Вы уже пользовались каким-либо из этих NoSQL фреймворков, то знаете, что некоторые из них предоставляют JavaScript оболочки, которые сильно облегчают жизнь. Кроме того, все NoSQL хранилища делят на:

  • ключ-значение хранилища
  • документо-ориентированное хранилища

Документ-ориентированное хранилище - звучит очень похоже на то, что нам надо, учитывая что мы пишем блокнот.

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

Для этого проекта я бы хотел использовать MongoDB. Мне кажется что CouchDB будет также хорошим выбором, но я написал много кода, использующего Mongoose, поэтому я хотел бы опироваться на это знание.

API Mongoose делает код асинхронного обращения к БД менее громоздким. Популярная “дефолтная” MongoDB библиотека для Node.js везде использует функции обратного вызова (callback), а не чистые абстракции и цепочки вызовов, что приводит к очень трудно читаемому коду.

До сих пор я использую Heroku и MongoHQ, так как эти сервисы очень сильно упростили мои сисадминские обязанности. В силу того, что технологии, лежащие в основе, распространяются в исходных кодах, я могу скачать MongoDB и запустить их локально для разработки, после чего уже разместить там, где я плачу за поддержку.

1.6. Ресурсы

Я попытался написать эту часть руководства таким образом, чтобы показать, как выбирать подходящие технологии для реальных открытых или комерческих проектов. Если Вы находитесь в аналогичной ситуации, вот несколько полезных ссылочек:

1.7. Далее

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

В целом, руководство будет покрывать следующие области:

  • установка всего, что необходимо
  • создание простого Express приложения
  • создание тестов для Node.js приложений
  • создание насыщенного интерфейса пользователя с jQuery UI
  • использование Mongoose с Node.js
  • развертывание исходного кода

Как и в серии Делаем фреймворк, некоторые области могут занять несколько недель (частей), чтобы полностью покрыть соответствующую тему.