BabelはES6のコードをES5にコンパイルしてくれるツールです。以前は6to5と呼ばれていました。ECMAScript 6(ES6)が正式にECMAScript 2015(ES2015)という名前になったのでツール名も変更になったようです。ただ略称の方はES6で定着しているのでこのまま使いそうです。io.jsではKoaのジェネレーター関数などES6の機能を--harmmony
フラグを付けなくても使えます。せっかくなのですべてES6で書きたいところです。io.jsではV8に追加されるES6の機能を積極的にサポートしていますが、全部ではないので現状はBabelでES5に変換する必要があります。
プロジェクト
適当なディレクトリにプロジェクトを作成します。リポジトリはこちらです。
$ cd ~/node_apps/docker-koa-babel-hook
$ tree
.
├── Dockerfile
├── app.es6
├── docker-compose.yml
├── index.js
└── package.json
Dockerfileのベースイメージはオフィシャルのio.jsイメージからONBUILDを使います。
FROM iojs:2.3-onbuild
EXPOSE 3000
docker-compose.ymlは特に設定は行わず、Dockerホストで他のサービスが3000ポートを使っている関係から、3030にマップします。
koa:
build: .
volumes:
- /etc/localtime:/etc/localtime:ro
ports:
- "3030:3000"
package.jsonはdependenciesからKoaとBabelをインストールします。
{
"name": "docker-koa-babel-hook",
"description": "docker-koa-babel-hook",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node index.js"
},
"dependencies": {
"koa" : "^0.21.0",
"babel": "^5.6.14"
}
}
index.js
エントリポイントのindex.jsにbabel/register
を記述します。babel/registerを最初に記述してrequire()をフックします。この後のrequire()したファイルはBabelがその場自動的にES6をES5にコンパイルしてくれます。
'use strict';
require('babel/register');
require('./app');
require('babel/register') doesn't workに書き込みがあるように、babel/register
を記述したファイル自体はコンパイル対象になりません。そのためapp.es6
ではなく、app.es6をrequireするindex.jsの先頭に記述します。
app.es6
app.es6が実際のアプリのコードです。拡張子をes6
にするとEmacs 24のメジャーモードに対応していないので、es6
の拡張子をinit.elなどに追加します。今回はinit-loaderを使っています。
(add-to-list 'auto-mode-alist '("\\.es6$" . js-mode))
app.es6はHelloWorldをするだけの単純なKoaのコードです。import
やconst
、GeneratorがあるES6のコードです。
'use strict'
import koa from 'koa'
const app = koa()
app.use(function *() {
this.body = 'Hello World';
});
app.listen(3000);
Dockerイメージのビルドと実行
Dockerイメージをビルドして実行します。
$ cd ~/node_apps/docker-koa-babel-hook/
$ docker-compose build
$ docker-compose up
Dockerホストからcurlを使ってテストします。docker-compose.ymlでDockerホストの3030ポートにマップしています。Hello Worldが表示されました。
$ curl localhost:3030
Hello World