2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
Context APIを使ったライブラリを作った(全1記事)
リンクをコピー
記事をブックマーク
加藤大志氏:「Context APIを使ったライブラリを作った」というタイトルでお話しします。加藤大志といいます。
フリーランスプログラマーで、日ごろどういうサイクルで生活しているかと言うと、GitHubにコードを書いて、それをネタにブログへアップして、それをネタにTwitterをして、というのをぐるぐるやっています。
あと下にあるイベントは、毎週水曜日にReact/GraphQLアプリ開発塾というのをやっていまして、ほぼ年中無休でやっています。
好みについて話すと、コーディングは好きなんですが、いっぱい書くのはあんまり好きじゃなくて、できるだけ少ない行数で書きたいという感じです。
ECMAScript2015になってアロー関数もでてきたし、今はそれだけに統一して、functionという字もclassという字も書かないようなスタイルでやっています。あんまりメジャーな言葉じゃないですけど、this-less JavaScriptっていう言葉があって。どっちかというと関数型のほうの人が言う言葉なんですけど。
classを使わないというか、そもそもfunctionも関数スコープも使わない、thisも使わないっていう、書き方のシンプルなやつをやろうってなってます。
副作用がないような関数が好みなので、reducerとかReduxは好きなんですけど、小さい関数をテストできるような関数と組み合わせて、ロジックを組み立てるっていうコンセプトも好きなんですけど、最近やっぱり「Redux疲れ」みたいな。「こういうアップデートが多くて大変」みたいな話があって、それは悩みどころかなと思っています。
自分が使うぶんにはいいんですけど、人に説明するときに、簡単そうに見えて実は難しい。プロダクトを作るときはいいけど、それを勉強するという点においては、あんまり優しくないなと思っていて。デファクトっぽいけど小規模開発にはちょっと向いてないのかなというところがありました。
Reactの話です。16.3からContext APIというのが入りました。
context自体は昔からあって、Reduxもcontextを使って作られてるわけなんですけど、よくコメントに「ライブラリが使うのはいいけど、それを自分で使うな」みたいなことが書いてある。一応非公式と言われ続けていました。16.3に入って、「ちょっと遅いよ」という感じがしますが、ちゃんと使えるようになりました。
1つおもしろいのが、render propsというのが、テクニックとしては使えることはわかってて、React Nativeなどで使われていたわけですが、公式ドキュメントに載ったのはたぶんこれが初めてなんじゃないかなと思います。「一応render propsを推奨するんだ」とか思っていました。
Context APIが登場したことでReduxの代替になるんじゃないか、みたいな話がしばらく3月以降盛り上がっていました。
私はReact/Reduxのconnectに価値があると思うケース以外は、Reduxを代替できるんじゃないかなと思うんですが、それはそもそもReduxを使う必要がなかったケースだということはよく言われています。
余談ですが、React/ReduxっていうライブラリとReduxというライブラリは、一緒にじゃなくてRedux単体でも使うことができるわけで、connectを使わずにReduxを使うことも一応できるわけです。パフォーマンスはちょっと落ちますが。
Context APIの簡単な使い方です。
これは公式のドキュメントからもってきたような感じですけど、初めにcreateContextをしたものを、Providerで提供して、コンポーネントツリーの下のほうでConsumerというのを使うと、valueが取れるというものです。
細かい説明は省略して、Context APIの簡単な特徴をまとめると、コンポーネントツリーの階層をジャンプして値を渡すことができるというものです。
それで、定義したProvider・Consumerのペア、上でProviderが渡したものを、Consumerでツリーの下のほうで受け取るというものです。
これは一種のグローバル変数みたいなものなので、注意して使わないといけないということになっています。基本的には依存するものが増えてしまって、コンポーネントとしての再利用性が下がるので、気を付けて使うほうがよいということになります。
Context APIができればconnectの代替になるのかというと、そんな簡単ではありません。そもそもContext APIはvalueを渡してくれるだけなので、state管理というようなことはできません。
「それをやるには、こんなふうにやったらいいんじゃないか」みたいな話がまたちらほら出ていて、1番これが素直かな、というのを今サンプルコードで挙げてます。
初めにDEFAULT_STATEを別のテキストで作って、それをProviderでvalueで渡す、valueで渡すとき、……ここでは12行目のところですね、作った値そのものと、それをsetする関数を合わせて渡してあげる、みたいなやり方がいくつか紹介されていたりします。
Contextで作ったものと実際に渡しているもので差分がある。受け取るほうについていえば、表示するほうはシンプルで受け取れますし、Editorと書いてあるところはアップデート関数があるほうもそれを受け取って使えるということです。
そもそもContext APIはProviderがvalueを変更したら対となるConsumerを再レンダリングするということができるようになって、valueが変更さえされなければ何も起こらないので、期待通りのことはできるんですが。これをやるためには、Component.setStateを使わなければいけないことになっています。
今のテンプレートをそのままライブラリにしようと思って作ったのが、このreact-context-global-stateというもので、単にラップして使えるようになっているだけ。プラスアルファでいくつかあるんですけど。
これを使うと、classの文字を書かないで今やったことができます。
createGlobalStateで、StateProviderとStateConsumerという2つの組を受け取る。これはコンポーネントツリーが浅いのであまり価値がないように見えるかもしれませんが、好きなところでconsumeできるようなかたちになります。
このライブラリを使うと、実際内部でsetStateを使っているので、stateの値を変えると再レンダリングしてくれます。あと1個のcontextですべてのGlobalStateを扱おうとすると、ぜんぜん関係ないコンポーネントもレンダリングされてしまうので、contextを複数作って、1つのstateにするように、任意の数のcontextをばーっと用意して、それを1つの全体でまとめるような仕組みになっています。
TypeScriptの型も今用意していまして、anyもimplicit anyも使わずに全部型付きで使えるようになっています。
すごく短いですがサンプルコードを用意してるので、それで使い方がわかるかなと思います。
最後におまけですが、きっとみんなHooksの話をするだろうと思って(笑)。
(会場笑)
先ほど自己紹介であったようにclassも書きたくない、functionも書きたくないっていうので、Hooksのことは大歓迎です。
きっと喋りだしたら止まらないのでやめておこうと思います(笑)。世界が変わります。SFCという言葉は言わなくなり、classじゃなきゃいけないってことがめったにないだろうし、今後もどんどんなくなっていくと。
それで、さっき見たrender propsもなくなっちゃうので(笑)、やっと公式で入ったのにやっぱり見にくいって話になりますね。そして、これからcustom Hooksがガンガン登場していくでしょう。
先ほどの話にもあったGraphQLのApolloクライアントを使っているので、今それはrender propsで深くなっているので、あれが早くcustom Hooksできたらいいなと思ってますが、議論がまだ進んでない感じです。
当然出たら作るよねということで、先ほどのGlobalStateのライブラリを同じように使えるreact-hooks-global-stateっていうライブラリも作りました。
すっきり作れましたし、使うほうもすっきり使えるので、今言ったことについて言えばcontextはやっぱりいらないかなって思いました(笑)。
これについては今日お話ししませんが、ブログは書いてあるのでご興味がある方は見てみてください。以上です、ありがとうございました。
(会場拍手)
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05