ES2015で書かれたNode.jsをデーモン化する

最新版のNode.jsでは、ES2015の機能のほとんどがサポートされており、別段トランスパイルを行わなくても使うことが出来る。

しかし、サポートが行われていない機能もある。
例えばモジュール機能がそれだ。

そういった機能を利用するためには、トランスパイルが必須となる。
例えばbabel-nodeスクリプトを実行することで、Node.js上でもモジュール機能を使えるようになる。
babel-nodeについては、以下を参照。
ECMAScript(ES2015,Babel)におけるモジュールについて

しかしbabel-nodeでは、デーモン化できない。
もしかしたら出来るのかもしれないが、今の自分の知識では出来なかった。

だが開発の都合上、デーモン化したいケースもある。
調べていたら、babel-registerで出来ることが分かった。

https://github.com/babel/babel/tree/master/packages/babel-register

確認用のファイルを作成

デーモン化するファイルを先に用意しておく。

Node.jsでimportを使うケースとしては例えば、Reactのサーバーサイドレンダリングなどが考えられるが、ここでは理解しやすさを優先してとにかくシンプルにする。

// modules.js
const myStr = 'この文字列が表示されれば成功です。';
export { myStr };
// index.js
const http = require('http');

import { myStr } from './modules.js';

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write(myStr);
    res.end();
}).listen(8080);

modules.jsでエクスポートしたものをindex.jsでインポートしている。
index.jsを実行した状態でlocalhost:8080にアクセスして文字列が表示されていれば、成功である。

このまま実行してもシンタックスエラーになるので、まずトランスパイルできるようにする。

$ echo '{ "presets": ["es2015"] }' > .babelrc
$ npm install babel-preset-es2015

この状態で
$ babel-node index.js
とすれば、動く。
だがこれではデーモン化できないことは、既に述べた。

そこでbabel-registerの出番である。

babel-registerの利用

まずインストール。

$ npm install babel-register

次に、デーモン化したいファイル、今回はindex.jsだが、それをラップするファイルを作る。
そしてそのファイルで、babel-registerを読み込ませておく。

// wrap.js
require('babel-register');
require('./index.js');

これで完成である。後はwrap.jsを、foreverなりnodemonなりでデーモン化すればよい。