babel-nodeでbabel pulginsを使うには.babelrcを設定する


目的

ES2015で書いて、かつpower-assertを使ったソースコードをbabel-nodeで動かす。
そのために、babel-nodeにbabel-plugin-espowerをプラグインとして指定したい。

結論

.babelrcにpluginsを設定します。

.babelrc
{
  "plugins": [
    "babel-plugin-espower"
  ]
}

背景

テストコードはmochaのcompilersオプションでespower-babelを指定すれば動かせます。

mocha --compilers js:espower-babel/guess test"

プロダクトコードはbabelのplugisオプションを使うと動くソースコードを作成できます。

babel --plugins babel-plugin-espower test.js

しかし、babel-nodeにはpluginsオプションがありません。

babel-node --plugins babel-plugin-espower

は動きません。

error: unknown option `--plugins'

が出力されます。

babel-nodeが使えれば、babelで毎回トランスパイルしなくてもよくなります。試しに動かすのが楽になります。
nodemonと組み合わせた、ソースコードの変更監視もできます。

babel-nodeの挙動の確認

試しにbabel-nodeの引数を増やして

babel-node --plugins babel-plugin-espower hoge.js

を実行すると

module.js:338
    throw err;
          ^
Error: Cannot find module '/Users/shigerunakajima/syamo/babel-plugin-espower'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)

node_modules配下を探してくれません。これは

babel-node babel-plugin-espower

と同じ挙動です。エラーメッセージ通りに、pluginsオプションは無視されます。

.babelrcの検証

次のソースコードで検証します。

sample.js
import assert from 'power-assert'

let a = false

assert(a, 'a is not true.')

.babelrcなし

npm install power-assert
babel-node sapmle.js

出力結果

assert.js:86
  throw new assert.AssertionError({
        ^
AssertionError: a is not true.
    at decoratedAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorate.js:44:25)
    at powerAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/index.js:58:32)
    at Object.<anonymous> (/Users/shigerunakajima/syamo/test.js:5:1)
    at Module._compile (module.js:460:26)
    at normalLoader (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5)
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)

assertとしては動きますが、power-assertの詳細表示はされません。

.babelrcあり

.babelrcでbabel-plugin-espowerを指定します。

npm install power-assert babel-plugin-espower
babel-node sapmle.js

出力結果

/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorator.js:66
        throw this.errorToRethrow(e, message, context);
                   ^
AssertionError: a is not true.   # test.js:5

  assert(a, 'a is not true.')
         |
         false

    at decoratedAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorate.js:42:30)
    at powerAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/index.js:58:32)
    at Object.<anonymous> (/Users/shigerunakajima/syamo/test.js:5:1)
    at Module._compile (module.js:460:26)
    at normalLoader (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5)
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)

パチパチ