Август 2015

Том 30, выпуск 8

Работающий программист - MEAN: как начать работу

Тэд Ньюард

Ted NewardПараллельные вселенные сейчас очень популярны, особенно в комиксах. Несомненно, я сам попал в одну из них. Когда я только начинал читать этот журнал, он назывался «Microsoft Systems Journal» (MSJ). Основными языками были C++ и Visual Basic. Нижележащей технологической управляемой платформой была COM, написанная как на неуправляемых языках вроде C++, так и на управляемых наподобие Visual Basic. Приоритетной операционной системой была безусловно, неизменно, бесспорно и несомненно Windows. Возможно, это была Windows 3.0, 3.1, Chicago или NT, но всегда Windows.

И посмотрите, где мы теперь. Очевидно, что мир больше не вертится вокруг Microsoft, даже внутри мира Microsoft. Забудьте на минуточку о «конкурентах», против которых Microsoft упорно боролась, таких как Java или Ruby. Компания имеет партнерские отношения с владельцами этих языков и даже изначально поддерживает их на платформе Microsoft Azure следующего поколения. Забудьте о языках, которыми «владеет» Microsoft, например C#, Visual Basic или F#. Все они сделаны из открытого исходного кода. Как и ее веб-инфраструктура, а также инфраструктура доступа к данным. А новая версия Visual Studio будет поставляться с эмулятором Android.

И стоит только подумать, что отличиться еще больше просто некуда, как Microsoft вновь делает что-то совершенно другое. На момент написания этой статьи Microsoft как раз объявила о партнерстве с Cyanogen — дистрибутором Android. Кто-нибудь может мне сказать, через какой портал я попал сюда?

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

Принять MEAN

Давайте поговорим о Node.js. Или, точнее, об одном из излюбленных программных стеков для платформы Node.js: MEAN (MongoDB, Express, AngularJS, Node.js). Он быстро становится одним из ключевых игроков в мире новых технологий. Поддержка Node.js и MongoDB со стороны Microsoft в Azure (не говоря уже о том, что вы можете легко выполнять их на стандартном локальном компьютере с Windows) означает, что это нечто, о чем должен знать каждый разработчик, использующий технологии Microsoft.

Вы можете работать с MEAN несколькими способами, включая использование Visual Studio. Начните с освоения того способа, который был задуман авторами Node. Используйте только предлагаемые инструменты в стиле Node: текстовый редактор, командную строку и Mac (если у вас где-нибудь завалялся таковой). Именно этот набор я буду использовать для начала, хотя большинство строк командной строки адаптируется под Windows безо всяких трудностей, это уже будет нечто другое.

Прежде чем я уйду далеко в эту параллельную вселенную, бросим взгляд на основных игроков. Стек MEAN является «полным квартетом», а значит, охватывает клиентскую и серверную части, а также хранилища. Если начать с клиентской части, то AngularJS обеспечивает полную клиентскую веб-инфраструктуру Single-Page Application с абстракциями Model-View-Controller и двухсторонним связыванием для UI. Однако AngularJS размещается полностью в клиентской части и требует наличия серверной части, с которой он должен взаимодействовать. Обычно используются вызовы Web API. В некоторых кругах они также известны как конечные точки RESTful, хотя это может привести к жарким спорам по поводу того, что такое REST, поэтому давайте пока оставим их как Web API.

Эти конечные точки Web API создаются с помощью инфраструктуры Express, размещаемой поверх платформы Node.js. Это во многом аналогично тому, как ASP.NET Web API располагается поверх конвейера ASP.NET и Microsoft .NET Framework. Эти серверные Web API, очевидно, потребуют базу данных для хранилища, где в игру вступает MongoDB. MongoDB не использует схемы и является ориентированным на документы хранилищем данных (в противоположность SQL Server, который использует схемы и является реляционным хранилищем данных) со встроенными средствами разбиения баз данных на фрагменты (sharding) и MapReduce.

Возможно, вам уже приходило в голову, что эти три части (клиентская, серверная и хранилище) на самом деле вполне взаимозаменяемы. Например, не трудно представить применение AngularJS для взаимодействия с ASP.NET Web API, которые в свою очередь взаимодействуют с MongoDB. Или задействовать приложение Windows Forms в качестве клиентской части, выдавать вызовы HttpClient к Node.js, которая в свою очередь будет обращаться к MongoDB. Или, чтобы просто дополнить трюк со шляпой, вообразить такую цепочку: AngularJS — Node.js — SQL Server.

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

Установка Node.js

Node.js на самом деле тривиальна в установке, когда понимаешь, как это делать правильно. Разработчики, установившие Azure SDK, уже располагают Node.js, и, по-видимому, она прописана в переменной окружения PATH для упрощения загрузки. Просто введите node в командной строке, чтобы удостовериться в том, что она установлена. Кстати, нажатие Ctrl+C выводит вас из интерактивной оболочки, которая запускается в ответ на команду takes node, если Node.js установлена..

Вы должны установить Node.js в только что установленную Windows или новую Mac OS. В Windows лучший способ сделать это — либо получить Azure SDK, либо отправиться на веб-сайт Node.js за MSI-установщиком для Node.js, который сам настроит PATH по умолчанию. Для Mac OS тоже есть установщик, но на Mac лучше установить другой диспетчер пакетов — Homebrew. Он доступен на brew.sh. После установки он станет вашим надежным инструментом для установки на Mac чего угодно, в том числе Node.js.

Homebrew предлагает простую команду brew install node, которая скачивает все биты Node.js, устанавливает их в правильные места (не требуя для этого доступа к корню) и неявно прописывает нужную информацию в PATH. И вновь node в командной строке должна подтвердить, что установка прошла успешно. После запуска вы увидите самую минималистскую командную оболочку (рис. 1).

Node.js работает (серьезно, она работает)
Рис. 1. Node.js работает (серьезно, она работает)

Нажмите Ctrl+C (дважды), чтобы выйти из Node.js. Она установлена, но вы еще не все закончили.

Установка NPM

Во вселенной .NET есть NuGet, во вселенной Ruby — gems, во вселенной Node.js — Node Package Manager. Он называется npm и устанавливается как часть Node.js (npm — на самом деле небольшое приложение Node.js, запускаемой из командной строки). После установки Node.js вы должны получить возможность запуска npm простым вводом npm в командной строке, как показано на рис. 2.

Node Package Manager
Рис. 2. Node Package Manager

Две основные для вас команды: npm install и npm update. Каждая из них может принимать один или более имен npm-пакетов в качестве параметра. Когда вы устанавливаете какой-то пакет, npm скачивает его с веб-сайта npm по аналогии с NuGet. Затем пакет устанавливается локально на жесткий диск в текущем каталоге. Сообщите npm, например, установить в пустом каталоге пакет debug (рис. 3).

Установка npm-пакета
Рис. 3. Установка npm-пакета

Утилита npm отвечает, что у вас установлена версия 2.1.3 пакета debug, который в свою очередь зависит от версии 0.7.0 пакета ms. Еще важнее, что оба установлены в локальный каталог node_modules. Это локальный репозитарий всех пакетов Node.js, которые вы будете использовать для этого приложения. Если по какой-то причине вы хотите установить npm-пакет глобально (в каталог node_modules на каком-то общем ресурсе), то должны использовать команду npm install –g debug.

После того как эти пакеты установлены в текущем каталоге, сошлитесь на них, используя вызов require в Node.js. Он принимает строку, описывающую имя пакета, которыйNode ожидает найти в каталоге node_modules непосредственно под текущим каталогом. Следующий код в файле helloDebug.js загружает пакет debug, назначает его переменной с тем же именем (в соответствии с соглашением Node.js) и использует для получения отладочного потока, выводящего отладочную информацию (по аналогии с System.Diagnostics.Trace):

var debug = require('debug')('hello');
debug("This should never appear unless DEBUG=hello");

Теперь после выполнения этого кода (командой node helloDebug.js), если переменная окружения DEBUG установлена в «hello», вызовы debug будут выводить информацию в консоль. А если нет, то ничего не появится. В Mac или Unix вы можете временно установить переменную окружения для одного запуска Node.js, указав префикс присваивания прямо перед командой node (рис. 4).Привет, мир отладки
Рис. 4. Привет, мир отладки

Здесь нет ничего особенного, но позволяет немного прочувствовать, как происходит разработка для Node.js. Самое главное — вы должны понять, что вызов require пытается загрузить пакет из локального каталога node_modules. Поэтому, если require потерпит неудачу, это означает, что пакет либо поврежден, либо вообще не установлен. В следующем выпуске своей рубрики мы поговорим о том, как отслеживать, какие npm-пакеты установлены, чтобы не приходилось запоминать их состав на вашем компьютере.

Кажется, я забыл упомянуть о том, что весь код Node.js — это JavaScript? Если вы не в ладах с JavaScript, сейчас самое время освежить свою память. Отличной отправной точкой вам послужит книга Дугласа Крокфорда (Douglas Crockford) «JavaScript: The Good Parts» (O’Reilly Media, 2008).

Установка MongoDB

Установить MongoDB в локальную систему для разработки — задача тривиальная. Скачайте файл .zip, соответствующий вашей системе с веб-сайта MongoDB (mongodb.org), распакуйте его и поместите двоичные файлы в нужный вам каталог, а потом пропишите его в своей переменной PATH. MongoDB также доступен в нескольких разновидностях как сервис, например как MongoLab (mongolab.com), которая предлагает бесплатный уровень для загрузки данных, объемом менее половины гигабайта (чего хватает с избытком для большинстве ознакомительных целей). Устанавливайте MongoDB либо локально, либо под учетной записью MongoLab (ее надо сначала создать).

В пакете для скачивания MongoDB также есть клиент командной строки mongo (похожий по стилю и возможностям на клиент SQL Server командной строки). Это полезно для доступа к базе данных MongoDB из скриптов оболочки и тому подобного. Если вы предпочитаете GUI, есть несколько бесплатных GUI-инструментов для MongoDB. Мои любимые для Mac — RoboMongo, а для Windows — MongoVue.

По умолчанию предполагается, что Mongo выполняется локально (а значит, сервером является localhost и порт по умолчанию — 27017). Если вы не знакомы с Mongo, вы можете либо прочитать мою статью по MongoDB (msdn.microsoft.com/magazine/ee310029), либо потратить несколько минут на чтение в сети любой из десятков тысяч статей по MongoDB. Здесь вам поможет Bing.

Запуск MongoDB на локальной машине также тривиален. Допустим, что каталог bin для MongoDB прописан в PATH; тогда достаточно ввести команду mongod. Она предположит, что для сохранения данных можно использовать каталог /var. Обычно это не то, что вам нужно, поэтому передайте аргумент --dbpath (обратите внимание на два дефиса подряд), чтобы указать подходящий каталог для хранения данных.

Кроме того, на веб-сайте MongoDB есть инструкции по выполнению MongoDB как Windows-службы или как демона на платформах *nix. Однако запуск вручную как активного процесса дает дополнительное преимущество: вы можете увидеть, как MongoDB выводит на экран все, что происходит.

Заключение

На сегодня я исчерпал все отведенное мне место, но главное, что необходимо для начала работы, вы теперь знаете. В следующий раз я создам некоторые конечные точки HTTP на сервере, задействую Express, расскажу немного подробнее о том, как структурируется приложение Node.js и как создать конечные точки для работы в Azure. Я также начну рассматривать некоторые утилиты Node.js, используемые в процессе разработки приложений. Ну а пока…

Удачи в кодировании!


Тэд Ньюард (Ted Neward) — директор iTrellis по технологиям (эта компания предоставляет консалтинговые услуги). Автор и соавтор многочисленных книг, в том числе «Professional F# 2.0» (Wrox, 2010), более сотни статей, часто выступает на многих конференциях по всему миру; кроме того, имеет звание Microsoft MVP в области F#. С ним можно связаться по адресу ted@tedneward.com или ted@itrellis.com.