TypeScriptでReactのライブラリを作りました
TypeScriptの勉強が嵩じて、一個、Reactのフォーム画面を作るときのめんどくさいところをまとめた小さなライブラリを作りました。
何がめんどくさいと思っていたかというと、
- フォームの一時的状態をどこに持つか悩む。Reduxストアに持つのは大げさじゃないかなあ
- Reactでフォームを便利にする系ライブラリは、UIコンポーネントをがっつり提供することが多い。でもこれやられちゃうとそのライブラリに対応したUIコンポーネントしか使えない。愛するmaterial-uiがつかえないじゃないか、というのも。必要なのはUIコンポーネントのvalueプロパティを設定して、onChangeをフックするだけなのに
- テスト書く時に、書きやすい作りは、Reactのプロパティの仕組みだけでやってるものかな。古いライブラリだとMixin、ちょっと前だとContextを使うのだけど、たぶんHOCでユーティリティをぶっ込んだ方がシンプルになると思った
- Reduxは当然つかう。だからReduxのストアから値をもってきて初期化、UIローカルに値を作ってから、最後にSubmitでDispatchできるようにする
- Submitはもちろん、値のバリデーションも同期だけでなく、非同期対応も必要
この辺、Reactの標準のState & Propertyの仕組みに閉じたアーキテクチャで、非同期はPromiseにだけ対応と決め打ちで作ったらライブラリ本体は結構すぐできました。HOCでやってるのでEnzymeではshallowでレンダリングできず、mountしないとならないのがちょっと美しく無い。
ところで問題は、手元のアプリケーションの中に埋め込みでライブラリとなるクラスおよび関数を作るところではなく、その後ライブラリに切り出すところにありました。以下のトライ&エラーで週末どっぷりでしたよ。
- そもそもNodeモジュールを作ったことがなかった
- TypeScriptの型定義ファイルの作り方がわからなかった -> angularのソースから気がつき解決!
- Githubに公開するのがはじめてなのでドキドキした
- やってみると、gitコマンド操作が怪しい
まだ作りも緩いのでnpmには登録してません。TypeScriptも初めて間も無くなので、まだまだ怪しくうさんくさい。もし試してみてくださる奇特な方がいらっしゃれば、以下のコマンドで。やってませんがes5にコンパイルしてあるのでES5以上で使えるはず。この辺もまだまだ怪しい。
$ yarn add https://github.com/masataka-kurihara/react-form-enhancer.git
今、devブランチでちょいちょい仕上げ作業をしているので、終わってmasterにマージできたらnpm登録もトライしてみたい。
$ yarn add react-form-enhancer
10/20(PT) npmに公開しました。Try it!