LoginSignup
11
12

More than 5 years have passed since last update.

ES2015でコマンドラインツールを書くときは、require hookで提供するべきか、事前にバベるべきか?

Last updated at Posted at 2015-08-24

結論

事前にバベります。

理由: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

ついでに.gitignorenode.npmignorelibを追加することを推奨しています。

補足

node: libでは依存ファイルの変更をうまく検出できないので、node: lib/*.jsにしたほうが良さそうです。

コマンドとして実行するために

require hookの場合

package.jsonにbinを追加

コマンドとして実行するためにpackage.jsonに

"bin" : "bin/cli.js" 

を追加します。

bin/cli.js
#!/usr/bin/env node

require('babel/register')
require('../lib')

依存モジュールにbabelを追加

npm i -s babel

require hookのオプション設定

ローカルでは動きますが、インストールするとimportUnexpected 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を指定します。

bin/cli.js
#!/usr/bin/env node

require('../node')

依存モジュールにcore-jsを追加

Babel.jsでは、String.prototype.endsWithObject.assigncore-jsというpolyfillライブラリを読み込むことで実現されています。

これらの関数を使う際はcore-jsをrequireします。

bin/cli.js
#!/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のインストール時にはコンパイルが走り、時間がかかります。

テストのためにインストールしてもイライラします。
事前にバベりましょう。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12