Node.jsでAPIを作るときのフレームワークに何が良いかいろいろと試しています。Hapi.js、LoopBack、Salis.js、actionhero.jsと試してみました。Koaは以前から気になっていましたが、ちょっと難しい印象があって避けていました。しかしES6ことECMAScript 2015がいよいよ承認されました。もたもたしているとES7やES8が来てしますので、もうクライアント側もサーバー側もES6に移行していかないといけないです。
ES6
ES6について全くの初心者なのですが、幸せになれそうな予感がするのでベットしようと思います。
ES6とio.js
サーバーサイドでES6やKoaを使う場合、io.jsの方が対応が進んでいます。そもそもio.jsが設立した原因の一つにNode.jsのV8とES6対応の開発方針への不満があったようです。ただ日本のNode.jsの広まりを考えるとサーバーサイドの開発言語としての採用に混乱を招いているようであまり良いことではありません。もっともio.jsがNode Foundationへの参加を決定して今後統合されていくみたいですが。
ES6と関数型プログラミング
言語仕様としてlet
やconst
などで変数のスコープが安全に書けたり、パターンマッチングによる分配束縛(Destructuring)も使えます。
ようやくasyncとif (error) return callback(error)
のようなError-First Callbackに慣れてきた程度なのですが、ES6だともっとエレガントににコールバック地獄から抜けられるそうです。GeneratorやPromiseなどまだ理解が必要なことが多いです。
またlodashを覚えてからNode.jsでも関数型プログラミング風に書けて読みやすくなりました。ES6ではArrow Functionsが標準で使えるので無名関数がもっと短く書けるようになります。
Destructuring、Arrow Function、Generator、Promiseを日本語に訳したりカタカナで表記するのも適切か悩むようになりました。明治時代の新漢語みたいにセンスある日本語ができれば良いのですが、そういう時代でもないですし。
Dockerでio.js環境をつくる
Dockerにはio.jsのiojsのオフィシャルイメージがあります。GitHubのリポジトリはdocker-iojsです。バージョンは6月にリリースされたばかりの2.3.0も用意されています。
Node.jsのオフィシャルイメージからONBUILD版を使うときは以下のように書いていました。
FROM node:0.12-onbuild |
io.jsでも同じようにONBUILD版があります。
FROM iojs:2.3-onbuild |
ExpressでHello World
io.jsでKoaのプログラムを書く前に、お約束のExpressでHello Worldを動かしてみます。
プロジェクト
プロジェクトのディレクトリは以下のようになります。
$ cd ~/node_apps/docker_iojs |
app.jsはExpressのHello Worldを使います。
var express = require('express'); |
{ |
Dockerfileのベースイメージはiojs:2.3-onbuildを使います。
FROM iojs:2.3-onbuild |
docker-compose.ymlを記述します。ONBUILDを使っているのでカレントディレクトリはコンテナにマップしません。マウントするとカレントディレクトリにはDockerfileでnpm install
したnode_modules
が隠れてしまいます。
express: |
実行
Dockerイメージをビルドしてコンテナを起動します。io.jsでもコマンドはnodeコマンドです。バージョンは2.3.0
です。Node.jsの方は同じnodeコマンドでも0.12.4
なので混乱しそうです。
$ docker-compose build |
psで見るとDockerホストの3030ポートにマップされています。
docker-compose ps |
Docckerホストからcurlコマンドを使ってExpressの起動が確認できました。
$ curl localhost:3030 |