Engineer主催イベントにて、エンジニア3名に登壇していただき、運用して感じたことを発表していただきました。有田氏の発表を書き起こしたものになります。シェアツイートはてブ目次React製社内ツールの高速化事例https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64041.jpgTechHub|DoorkeeperReact製社内ツールの高速化事例React製社内ツールの高速化事例こんにちは、Indeedの有田です。「React製社内ツールの高速化事例」というテーマでお話させていただきます。「Indeed」では、ネット上でクロールした求人情報を提供するサービスを行っています。Data」というところに属しておりまして、会社に関する情報を公開しています。普段書いている言語はJavaとJavaScriptです。PagesのほうではReactを使っていません。一般に公開されるサイトなので検索エンジン対策(SEO)が必須なんですが、「Reactはサーバーサイドレンダリングが遅い」ということを、社内の実験で明らかにしまして、Reactは使われずJavaSoyで普段書かれています。社内向けのツールは一般に公開しないため、検索エンジン対策を考える必要がありませんのでReactを使っています。社内向けツールは、「会社の情報を一覧表示して、その情報を操作する」というツールです。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64050.jpgReact製社内ツールのイメージをざっくりと表で用意しました(スライド4)。一行一行が会社になります。ドロップダウンを押すことで、その会社情報に対する操作を設定することができます。SubmitActionsを押すと、選択されたアクションが送信されます。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64074.jpg次にコードの話に移ります。簡単に分類すると、二つのクラスに分かれていて、1つは通信などを行う「Tool」のクラスと、もう1つはToolの中にある「Table」のクラスです。Toolのクラスの中に、表として表示するlistが入ります。Toolの中でTableを呼んで、Tableにlistを渡します。Tableの中で渡されたlistをrenderしています。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64077.jpg元々50行だけの情報を表示していたのですが、1000行を表示する変更の要望があり、その際に2つの速度問題が起こりました。1つ目の問題は、1000行を表示したときに、セルのrenderを呼ぶ回数が多くなり、ドロップダウンの選択に1秒もかかってしまうことです。1つの問題は、「Toolの下にTableがあり、ToolからTableにlistが渡される」という形になっているため、親のstateが変わって親がrenderされると、子も自動的にrenderされてしまうことです。明らかにlistのデータが不変でも、renderを行うため、動作が遅くなっていました。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64079.jpg1つ目の問題に対しては、画面に表示されていないセルはrenderを呼ばない、Facebook製の「FixedDataTable」というライブラリで対応しました。「FixedDataTable」は使われていましたが、高さが無限に設定されていたため、何の意味もありませんでした。高さを設定することで、表示している範囲だけを描画するようになり、セルのrenderが呼ばれる回数を減らせました。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64082.jpg続いて二つ目の問題の解決方法について説明します。renderの振り返りをします。DOMを返すと、前回のVirtualDOMとの差分をフレームワーク側が計算してくれます。DOMの再描画が一番ボトルネックなので、計算を減らして、重くなりにくくしてくれます。今回、「renderの呼び出し自体が重い」という問題が起こっていました。この問題を解決するために、shouldComponentUpdateという関数を使いました。shouldComponentUpdateは、次の状態のpropsとstateが渡されて、現在のpropsとstateに変化があったかを記述します。変化していなければfalseを返します。render自体が呼び出されなくなるので、速度が高速化されます。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64086.jpgしかし、どうやって書くかという問題があり、これに対して3つの案がありました。PureRenderMixin案1です。PureRenderMixinという、あるComponentがpureであるときに使えるMixinがあります。「pureである」ということは、「入力が同じなら出力も同じ」ということを意味しています。stateとpropsのみに依存して出力が決まるというのが、pureなComponentです。PureRenderMixinはstateとpropsとそれぞれのフィールドを参照比較するものです。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64094.jpg実際には正しくありませんが、概念的にはこのようになります(スライド10)。nextPropsのkeyそれぞれを現在のpropsと比較して、異なっていればupdateをしなければいけません。stateもpropsと同様で異なっていればupdateします。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64105.jpgPureRenderMixinを使えば万々歳と思いきや、つらいコードがたくさんあります。いった更新のされ方がありました(スライド11)。listがstateの一つのフィールドで、深いところを破壊的に更新すると、listにthis.state.listをセットすることが行われます。このことによってイコールで比較する際に、現在のlistと次のlistが、参照的に同じものになってしまい、いくらstateを更新しても変更されない事態が発生します。PureRenderMixinは使えません。参照比較に対して、渡されたオブジェクトを再帰的に比較すればいいのではないかと思いました。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64113.jpgそこで、こんなライブラリが欲しいわけです。Immutable.js最後の案3は「Immutable.js」です。Immutable.jsを使うことで、さきほどの3つを実現できました。「Immutable.js」は、「変更可能な値」と「その値の一部を変更した新たな値」を効率的に生成するメソッド郡のライブラリです。一度作られたmap1はいつまでも変わらず、メソッド(スライド13-コード2行目のmap1.set(‘b’,50)など)は新たなImmutableな値を作るというものです。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64120.jpg例えば、fromJSメソッドを使うと、再帰的にJSのオブジェクトや配列をImmutableに変換してくれます。pushメソッドは、listの最後にエレメントを追加した新たなlistを返します。これをsetStateメソッドで新しいlistに設定します。このように、Immutable.jsでは便利なメソッドが用意されています。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64124.jpg破壊的な変更をした場合には、list自体の参照が変わるので、shouldComponentUpdateは単にlistが同じかどうかで、更新するかどうかの判定をすることができます。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64128.jpg結果としては、変更されていない場合は、極力renderを省略でき、高速に動作するようになりました。「極力renderを省略できる」と表現していて、なぜ「必ず省略できる」ではないのかと言いますと、破壊的な変更を何度もした結果、元に戻ったとき、同じとは限らないからです。listが変更された場合、必ずrenderがされるようになっています。「stateを変えたのにおかしい」、「表示が変わらない」ということが発生しません。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64131.jpgおまけおまけとして、ReduxとImmutable.jsについてお話します。私たちのチームではReduxを使っていなくて、Reactのまま使っています。Reduxを使うと、メリットもあると思いますが、優先度が少し低いので使っていません。何らかの新しいアクションが来た時に新しいstateをつける「Reducer」に、「stateに対して破壊的な変更をしてはならない」というルールがあるので、そのルールをうっかり破ってしまわない保証としてReduxが使えそうです。これで変なバグが起きなくなりそうですね。https://dvrs04bx77b2x.cloudfront.net/item/image/normal/64137.jpgまとめ最後にまとめです。React製社内ツールの速度問題と解決までのアプローチを説明してきました。高速化の結果をまとめると、次の3つになります。1つ目は、基盤のテーブルにFixedDataTableを使い、セルのrender呼び出し数を減らせました。2つ目は、shouldComponentUpdateで速度のチューニングを行い、renderを呼ぶ回数を抑えられました。最後に、複雑な深いstateにはImmutable.jsを使うことで、高速化ができました。以上がReactの高速化事例になります。ご清聴ありがとうございました。Propositionを作るコツ10個|必要な背景3つValuePropositionはビジネス用語の一つであり、自社のサービスを顧客に伝える大事な手段にもなります。起業家にとっては忘れてはいけない言葉であるため、ValuePropositionの意味や実際の作り方についてもいくつか紹介します。「エンジニア」とはどんな職業のことを指すのかご存知でしょうか。ここではエンジニアという言葉の意味や、世界史からひも解くエンジニアという言葉の意外な語源、さらエンジニアにおすすめの転職エージェントなどをご紹介していきます。本記事は、エンジニアを目指す転職者に向けて、エンジニアという職業の各種概要と転職エージェントを利用するメリットやその種類について簡単に解説しています。エンジニアを漠然と目指したいと思っている方は、エンジニアの種類を知ることで、転職方針が明確になれば幸いです。プログラミングに関する法則・原則7選|エンジニア向けの転職エージェントプログラミングはエンジニアとして訓練された方々の、原則に沿った優れた技術によるものです。これららエンジニアを目指す方にプログラミングの原則と、今現在エンジニアとして就活をしている方におすすめの転職エージェントをご紹介します。エンジニアに必要なビジネススキル8選|ビジネススキルの重要性とはエンジニアにとって、ビジネススキルは面倒で、あまり近寄りたくないものかもしれません。ビジネススキルは自分の技術をさまざまな仕事に適用するための助けになるスキルです。できる仕事の幅と深さを広げられますので、できるところから取り組んでみましょう。webデザイナーとエンジニアの違い5つ|将来性やおすすめのエージェントwebデザイナーという言葉はよく耳にすると思います。webエンジニアという職業があるのを知っていますか。webデザイナーと深く関わりのある仕事です。今回は二つの仕事の違いを紹介していきますので、ぜひ参考にしてください。エンジニアの英語力を効果的に伸ばす方法6選|エンジニアに英語力は必要かエンジニアがスムーズに業務するためには英語力が必要です。研究・開発の活発である国で働きたいのならばより必要です。グローバル化する現代社会で英語力をたかめる事は非常に武器になります。じぶんをより高めたい人は英語の勉強を積極的に行いましょう。独立しやすい仕事12選|独立のメリットとデメリットをご紹介!独立する前に考えておくポイントを押さえておくことが、後悔しない独立開業のポイントです。独立開業しやすい仕事を12選取り上げて、詳しくご紹介しましょう。独立開業するメリット2つと独立開業のデメリットを3つそれぞれ詳しくご紹介します。所得税の控除って?知って得する所得控除の種類7つと税額控除の種類5つ一口に「節税」と言っても、「税金は複雑そう」と考えている人は多いのではないでしょうか。負担額の大きい所得税が節税できれば、家計も大助かりです。今回は、所得税を減額することのできる「所得控除」と「税額控除」から、身近なものについていくつかご紹介します。フリーランスSEのメリット4つとデメリット3つ|仕事を探す方法フリーランスSEが最近増えてきているのを知っていますか。フリーランスSEとは何か、またフリーランスSEのメリットやデメリットをご紹介します。フリーランスSEが仕事を探すにはどうすれば良いのかについてもみていきますので、ご参照ください。総務課の仕事とは?仕事内容5つと必要なスキル5つ|向いている人の特徴3つ本記事では、総務課の仕事とは?仕事内容5つと必要なスキル5つ、向いている人の特徴3つについて紹介していきます。総務課とは会社など組織全体に関する事務を行っている課です。総務課の仕事に就きたいと思っている方はぜひ参考にしてみてください。Web系に転職するなら知っておきたい9つのこと|年収は?未経験可?Web系への転職をお考えの際には、必要とされる要素や年収などを確認しておくと、転職活動がスムーズに運びます。こちらの記事では、Web系の仕事に関する情報をご紹介します。SeとWeb系の違いやSlerについてなど、ぜひ参考にしてください。システムエンジニアのレベルに応じた担当業務4つ|SEに向いている人3選システムエンジニアとは、システムの設計・開発・テストを手がける職種のことです。プログラマを統括する仕事をしています。そこで今回は、システムエンジニアのレベルに応じた担当業務4つと、SEに向いている人3選について詳しくご紹介していきます。エンジニアが疲れを感じる原因5つ|エンジニアの疲れへの対処法4つエンジニアは目や腰が疲れるたいへんな仕事です。そこで今回は、エンジニアが疲れを感じる原因5つとエンジニアの疲れへの対処法4つをご紹介していきます。エンジニアとして続けていくための工夫や身の振り方について、考察していきましょう。SNS採用とは?SNS採用のメリット9個|SNS採用を活用する手法SNSで採用活動をすることができます。SNSで採用活動をすることで採用コストや広報コストが抑えられるだけでなく、求職者をスクリーニングできるのでミスマッチを避けることもできます。SNSで採用活動をすることで、多くのメリットを感じることができるでしょう。エンジニアにチームビルディングが必要な理由6つ|おすすめの手法とは?チームビルディングは組織を活性化してパフォーマンスを向上させるため、エンジニアにも必要とされています。そこで今回は、エンジニアにチームビルディングが必要な理由6つと、おすすめの手法についてご紹介していきます。チームビルディングの大切さについて学びましょう。企業の海外進出における課題5つ|課題を克服するために必要なこと6つ企業で海外進出をしていこうと考えている方は全国に増えています。海外進出をする企業の課題とはいったい何なのでしょうか。今回は大きな課題5つの紹介や、課題を企業全体で克服するためにできることについて詳しくご紹介していきます。情報技術(IT)が欠かせない今の世の中、「Web系エンジニア」という職業をご存じでしょうか。どのような仕事をしていて、どれくらいの給料なのかは知らない方が多い職業です。やったらなることができるのかも含めて、Web系エンジニアについて理解しましょう。エンジニアの志望動機で大切なポイント6つ|エンジニアで求められる人材エンジニア職への就職や転職をする際、どのような志望動機が望ましいのでしょうか。この記事では、エンジニア職への志望動機の作成のポイントとエンジニアや、IT業界に求められる人材の特徴をご紹介いたします。エンジニア職への就職や転職の際に活かしていきましょう。面談で好印象なITエンジニアの特徴11個|面談前にチェックする項目3つITエンジニアを目指す人にはぜひ知っていただきたい、面談で好印象なITエンジニアの特徴についてご紹介していきます。どれだけ優れた腕を持っていたとしても、面談で悪印象だと採用はされません。面談で好印象を勝ち取りましょう。Carearte運営事務局.。