2017-07-21

flowで依存ライブラリがRequired module not foundになる際の最小の対策

背景

先日から flow でシコシコ type 付けをしていたが、新たに lodash を使おうと思ったら以下のようなエラーが出てしばらく悩んだ。

3: import _ from 'lodash/lodash.min'
                   ^^^^^^^^^^^^^^^^^^^ lodash/lodash.min. Required module not found

まとめ

  • 上のエラーは最小限の declaration を用意することでしのげる
  • declaration はデフォルトでは flow-typed/ 以下に置く(これなら .flowconfig で設定不要)
  • declaration は module_vx.x.x.js の名前で作れる
    • lodash/lodash.min なら lodash.min_v4.x.x.js
  • 内容は以下の通り
declare module 'lodash/lodash.min' {
  declare module.exports: any;
}

実はlodashには定義済みのtype情報がある

んだけど、lodash/lodash.min には対応していないのであった。

最小限の方法で行くという選択

flowtype/flow-typed: A central repository for Flow library definitions

今回試しに flow-typed を入れて scaffold までやってみたのだが、

flow-typed は独自に flow-typed コマンドを使うので完全自動化まで考えると使い勝手が悪い

ということが分かった。例えば babel の plugin を babel コマンドで管理するようなものと思えばよいだろうか。npm や yarn のコマンド体系の外にいるので、それを適切に呼び出せる環境をちゃんと準備しないとこの恩恵をみんなで共有することはできない。(postinstall とかでやることが増える)

真面目に flow-typed で type 情報を共有できるようにするのは一つの正しい方法ではあると思うけど、今のところ手元での再現や CI での実行には工夫が必要になってしまう。大掛かりな仕組みで依存ライブラリがたくさんある場合は正しい手法を選択した方がよいとは思うが、今回は最小限の dirty hack でしのぐ方法を紹介することとした。

どうせ全部の定義が欲しいわけではないしね。

About

例によって個人のなんちゃらです