結論
事前にバベります。
理由:babelのインストールに時間が掛かる
事前説明
用語
- バベる: Babel.jsを使ってES2015のJavaScriptをES5のJavaScriptに変換すること
フォルダ構成
- bin: コマンドファイル
- node: バベった後のES5モジュール
- lib: バベる前のES2015モジュール
コマンド本体はlib/index.js
にありbabel-node lib
で実行可能なものとします。
候補にした二つの方法
Writing ES6 today, effectively.の1. Writing ES6 Modules
に二つの方法があります。
1. require hook
Babel.jsのrequire hookを使って、実行時にバベる方法が挙げられています。
require('babel/register');
を書くと、それ以降のrequire
関数を使ったモジュール読み込み時にバベります。
2. 事前にバベる
以下のMakefileを用意しておいて、事前にバベる方法が挙げられています。
BABEL = ./node_modules/.bin/babel
all: node
node: lib
@mkdir -p node/
@for path in lib/*.js; do \
file=`basename $$path`; \
$(BABEL) "lib/$$file" > "node/$$file"; \
done
ついでに.gitignore
にnode
を.npmignore
にlib
を追加することを推奨しています。
補足
node: lib
では依存ファイルの変更をうまく検出できないので、node: lib/*.js
にしたほうが良さそうです。
コマンドとして実行するために
require hookの場合
package.jsonにbinを追加
コマンドとして実行するためにpackage.jsonに
"bin" : "bin/cli.js"
を追加します。
#!/usr/bin/env node
require('babel/register')
require('../lib')
依存モジュールにbabelを追加
npm i -s babel
require hookのオプション設定
ローカルでは動きますが、インストールするとimport
にUnexpected reserved wordエラー
が出ます。
これはrequire hookがnode_modules
配下のファイルを変換しないためです。
Require Hook · Babelより
NOTE: By default all requires to node_modules will be ignored.
ignore
オプションを設定します。
require("babel/register")({
ignore: false
});
このままでは依存モジュールまで全てバベってしまいます。only
オプションも設定します。
require("babel/register")({
ignore: false,
only: /lib/
})
事前にバベる
package.jsonにbinを追加
事前にバベる場合もbin/cli.js
を追加するのは一緒です。
読み込むモジュールにバベり後のnode
を指定します。
#!/usr/bin/env node
require('../node')
依存モジュールにcore-jsを追加
Babel.jsでは、String.prototype.endsWithやObject.assignはcore-jsというpolyfillライブラリを読み込むことで実現されています。
これらの関数を使う際はcore-jsをrequireします。
#!/usr/bin/env node
require('core-js')
require('../node')
依存モジュールにもcore-js
を追加します。
npm i -s core-js
まとめ
require hookを使っても事前にバベっても、ES2015で書いたコマンドラインツールを配布することはできます。
ただしrequire hookを使う場合は依存モジュールにbabelが入ります。
babelはnative extensionを使っています。
babelのインストール時にはコンパイルが走り、時間がかかります。
テストのためにインストールしてもイライラします。
事前にバベりましょう。