アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

lk-test-helpersの導入方法20180417版/truffleでimportを使う

github.com
をtruffle testで使うための導入方法20180417版です。

y-nakajo.hatenablog.com
こちらの以前の記事で紹介していた手順が最新のbabelでは使えなくなっていたので、最新版のbabelに対応した導入手順をまとめ直しました。


truffleでimport/exportなどのes2015構文を使えるようにする

理由

lk-test-helpersはes2015構文で記述されています。
lk-test-helpersのproject設定ではこれらes2015の構文をtranspileし、現在のnode.jsでも実行可能なソースを生成するbuild scriptが準備されています。
しかし、npm installで落ちてくるmoduleにはbuildした結果のファイルが含まれていません。
そのため、lk-test-helpersを使うにはtruffleでimport/export等のes2015構文を使える様にする必要があります。

ということで、es2015構文を使うための環境を構築します。
これ以降の手順は、truffleはすでにインストール済みであり、何らかのtruffle projectのディレクトリ内で作業する前提です。

必要なbabel関連モジュールのインストール

lk-test-helpersもついでにインストールします。

npm i babel-preset-env babel-register babel-polyfill lk-test-helpers

.babelrcを作成する

以下の内容でtruffle projectのルートディレクトリ直下に.babelrcを生成します。

{
  "presets": ["env"]
}

truffle.jsでbabel-register, babel-polyfillをrequire

truffle.js (truffle-config.jsを使っているならtruffle-config.js)の先頭行に次のコードを挿入します。

require('babel-register')({
  // This will override `node_modules` ignoring - you can alternatively pass
  // an array of strings to be explicitly matched or a regex / glob
  ignore: /node_modules\/(?!lk-test-helpers)/
});
require('babel-polyfill')

lk-test-helpersを使いたいtestファイルの中でimport

importは次の様に書けばOKです。この例では全部のメソッドをロードしてます。

import lkTestHelpers  from 'lk-test-helpers/src/main.js'

const {
  advanceBlock,
  advanceToBlock,
  assertJump,
  ether,
  latestTime,
  increaseTime,
  increaseTimeTo,
  EVMThrow,
  expectThrow,
  hashMessage,
  timer,
  toPromise,
  transactionMined
} = lkTestHelpers(web3)

これで、lk-test-helpersの各種便利メソッドが無事使える様になりました。

babel モジュールの説明

今回利用したbabelモジュールの役割を説明します。

babel-polyfill

構文だけじゃなくて機能(Promiseとかなんかそういうクラスとか)も必要があればtranspileするためのモジュールです。

babel-register

requireにhookしてtranspileしてくれるモジュールです。最新のバージョンでは./node_modules以下がデフォルトで対象外に設定されていたため、これを入れてもlk-test-helpersのimportがずっと構文エラーになってしまい、はまりました。
babel-registerの公式ドキュメントをみたらignoreの設定方法が載ってました。

babel-preset-env

昔のbabelではesのどの構文に対応するのかはbabel-preset-{*}でかくフェーズごとに細かく分かれていました。で、このbabel-preset-envはその名の通り、実行環境に応じてtranspileが必要な構文のpresetモジュールを自動で宜しくpreset時にロードしてくれるモジュールです。
現在ではとりあえずこれさえ入れとけばOKみたいな感じです。

感想

ECMA Script、 Node.jsはこのbabel周りのあれこれがいつもハマりどころですね。。。async/await使えるけどimport使えなかったりとか、なんかもうほんとよくわからない。