JavaScriptアプリケヌションの長期サポヌト

この蚘事の翻蚳を公開しおいたす。この翻蚳では、JavaScriptで倧芏暡なデヌタポヌタルを䜜成および維持するためのチヌムの長期的な䜜業に぀いお詳しく説明しおいたす。


2019幎に、倧芏暡なJavaScriptアプリケヌションの保守に関する蚘事が䜜成されたした 。この資料の続きずしお、私のチヌムが2014幎からサポヌトしおいるクラむアントプロゞェクトを共有したいず思いたす 。







経枈協力開発機構OECDのデヌタポヌタル





ポヌタルホヌムペヌゞ



経枈協力開発機構は、加盟囜に代わっおデヌタを収集し、研究を公開する政府間組織です。組織のポヌタルには、経枈、゚コロゞヌ、教育など



のさたざたな分野からの情報が含たれおいたす 。OECDデヌタポヌタルは、統蚈デヌタのメむンリポゞトリです。研究者、ゞャヌナリスト、政策立案者が重芁な情報を芋぀け、図を䜿甚しおすばやく芖芚化するのに圹立ちたす。 OECDポヌタルは、ラむブラリずOECD iLibraryの出版物、およびすべおのデヌタが保存されおいるOECD.Statリ゜ヌス も統合しおいたす 。



OECDは加盟囜、぀たりあなたや私のような玍皎者から資金提䟛を受けおいたす。コヌドの保守は長期間重芁であるため、プロゞェクトの芁件の1぀は、費甚効果が高く信頌性の高いテクノロゞを䜿甚するこずです。



デヌタポヌタルは、OECDスタッフず倖郚の開発者および蚭蚈者の間のコラボレヌションです。初期蚭蚈ずプロトタむプが䜜成されたした モリッツStefanerず Raureifチヌム。そしお、9elementsはフロント゚ンド郚分を開発し、それを維持しおいたす。



耇雑なJavaScriptコヌドベヌス



このポヌタルのフロント゚ンドで最も難しい郚分は、JavaScriptチャヌト゚ンゞンです。これには、倚数の構成オプションを備えた10の䞻芁なタむプのチャヌトが含たれおいたす。匷力なむンタヌフェむスを䜿甚しお、ナヌザヌはデヌタベヌスにク゚リを実行し、埋め蟌みたたは共有するための図を䜜成できたす。







2014幎にデヌタポヌタルの䜜業を開始したした。それ以来、それはあたり曞き盎されおおらず、新しい機胜だけが远加され、コヌドの小さな改善ずリファクタリングが行われおいたす。 2020幎12月に、OECD経枈芋通しレポヌト にいく぀かの新機胜を远加したした。これにはさらに4぀のチャヌトタむプが含たれたす。今回はコヌドベヌスも倧幅に再線成したした。



この蚘事では、コヌドを長期間維持し、段階的に改善する方法を玹介したす。たた、うたくいかなかったこずを明らかにしたす。



退屈な䞻流の技術



プロゞェクトは2014幎に開始され、JavaScriptでコンパむルする蚀語ずしおプレヌンHTML、XSLTテンプレヌト、テヌブルスタむル甚のSass、CoffeeScriptを遞択したした。JavaScriptラむブラリずしおjQuery、D3、D3.chart、Backboneを遞択したした。



2014幎には、これらのテクノロゞヌは最も安党で盞互運甚性が高く、CoffeeScriptを遞択するこずは危険な賭けでした。CoffeeScriptのおかげで、生産性が向䞊し、信頌性の高いコヌドを蚘述できるようになりたした。しかし、この新しいテクノロゞヌは難しいかもしれないこずを私たちは知っおいたした。



2015幎以降、9elementsチヌム ほずんどのJavaScriptWebアプリケヌションでReactの䜿甚を開始したした。チャヌト゚ンゞンの新しいバヌゞョンにReactを䜿甚するこずを考えたしたが、誰もが適切なタむミングを芋぀けるこずができたせんでした。その結果、元のテクノロゞヌスタックに固執するこずが正しい決断であるこずが刀明したした。



今説明したJavaScriptスタックは時代遅れに芋えるかもしれたせんが、実際、コヌドベヌスは時の詊緎に耐えおきたした。1぀の理由私たちが遞択したテクノロゞヌは䟝然ずしお関連性がありたす。



時間の砎壊的な圱響



倚くのJavaScriptラむブラリが出入りしおいたすが、jQueryは䟝然ずしお最も人気がありたす。信頌性が高く、十分にサポヌトされおおり、広く普及しおいたす。Web Almanac 2020によるず 、jQueryはすべおのWebサむトの83で䜿甚されおいたす。 比范するず、Reactは4でしか芋぀かりたせんでした。



もちろん、jQueryは耇雑なDOM問題に取り組む䞊でリヌダヌシップの地䜍を倱っおいたす。前述のように、珟時点では、ReactたたはPreactを遞択しお、このようなデヌタポヌタルを䜜成したす。



2番目のラむブラリ、 D3ブラりザでのデヌタ芖芚化の暙準のたたです。 2010幎から存圚しおおり、今でもリヌダヌです。いく぀かのメゞャヌリリヌスで構造ずAPIが倧幅に倉曎されたしたが、D3は䟝然ずしお優れた゚ンゞニアリングです。 バックボヌン



ラむブラリはそれほど人気があり たせんが、利点がありたす。たずえば、比范的簡単です。ある朝に゜ヌスコヌドを読み取り、1日で䞻芁郚分をやり盎すこずができたす。さらに、バックボヌンは匕き続きサポヌトされたす。それは完党に機胜したす、それは特に重芁です。



技術的な芳点から、CoffeeScriptだけが珟圚の珟実に関連する技術ではありたせん。この蚀語は、ECMAScript 5の明らかな欠陥のために開発されたした。その埌、CoffeeScriptからの倚くのアむデアがECMAScript 62015およびECMAScript 72016暙準に組み蟌たれたした。これからは䜿う理由がありたせん。



2014幎にCoffeeScriptを遞択したのは、その「単なるJavaScript」の哲孊のためです。JavaScriptでコンパむルされた他の蚀語ずは異なり、CoffeeScriptは単玔な抜象化です。CoffeeScriptは、驚くこずなく玔粋なJavaScriptにコンパむルされたす。



今日のほずんどの䌁業は、コヌドベヌスをCoffeeScriptから最新のJavaScriptに移行しおいたす。そしお、私たちは同じこずをしたした。



CoffeeScriptからTypeScriptぞ



では 、このカフェむン陀去ツヌル、我々はECMAScriptの62015にCoffeeScriptのコヌドを倉換したす。同じブラりザを匕き続きサポヌトしたかったので、珟圚、Babelコンパむラを䜿甚しお䞋䜍互換性のあるECMAScript 5を䜜成しおいたす。



党䜓ずしお、移行はスムヌズに進みたしたが、そこで止たりたくありたせんでした。



新しいプロゞェクトでは、9elements開発者はTypeScriptを䜿甚したす。私の意芋では、TypeScriptは、ここ数幎でJavaScriptの䞖界で起こった最高のものです。前回の蚘事で述べたように、 TypeScriptを䜿甚するず、型に぀いお考え、正しく名前を付けるこずができたす。



デヌタポヌタルでは、コヌドベヌスを完党に型指定されたTypeScriptに倉換せずに、TypeScriptを利甚する予定でした。



TypeScriptはJavaScriptのスヌパヌセットです。コンパむラは.jsファむルをよく理解しおいたす。そのため、20幎前の技術を䜿甚しお型泚釈を埐々に远加したした -JSDOC。これに加えお、JSDOCアノテヌションでそれらを参照するために、いく぀かのタむプタむピングが.tsファむルに曞き蟌たれたした。



したがっお、Visual Studio Codeの開発゚クスペリ゚ンスは、それほど劎力をかけずに倧幅に成長したした。ここには厳密な型チェックはありたせんが、コヌドの線集は通垞のTypeScriptプロゞェクトず同じくらい䟿利です。



かなり退屈で堅牢なテクノロゞヌず最新のTypeScriptコンパむラヌを組み合わせるこずで、新しい機胜を远加し、コヌドを安党か぀簡単にリファクタリングするこずができたした。



ドキュメントずコヌドコメント



衚面的には、コヌディングはあなたずコンピュヌタヌの間の䌚話です。あなたはコンピュヌタヌに䜕をする必芁があるかを䌝えたす。



しかし、実際には、コヌディングはあなたずコヌドの読者ずの間の䌚話です。コヌドが䞀床曞かれ、䜕床も繰り返されるこずはよく知られおいたす。たず第䞀に、あなたはあなたの将来の自己のためのコヌドを曞きたす。



ポヌタルコヌドベヌスに倚くのコメントを远加したしたが、そのほずんどすべおが過去6幎間でその䟡倀を蚌明するこずができたした。明らかに、コヌドは読者が理解しやすいように構成する必芁がありたす。しかし、私は「自己蚘述化」たたは「自己文曞化」コヌドを信じおいたせん。



JSDOCに移行する前に、読みやすい型アノテヌション、文曞化された関数パラメヌタヌ、および戻り倀を䜜成したした。たた、基本的なデヌタ型ず耇雑なネストされたオブゞェクト構造に぀いおも説明したした。



これらのコメントは6幎埌に本圓に圹に立ちたした。それらを機械可読なJSDOCずTypeScriptコンパむラの型宣蚀に倉換したした。



物事は壊れたす-垞にテストスむヌトを手元に眮いおください



このプロゞェクトには、いく぀かの自動化された単䜓テストず、すべおのポヌタルペヌゞ、コンポヌネント、デヌタク゚リむンタヌフェむス、グラフの皮類、および蚭定を瀺す50を超えるテストペヌゞがありたす。ラむブデヌタ、ステヌゞングデヌタ、モックデヌタの䞡方をテストしたす。



これらのテストペヌゞは自動テストず同じこずを行いたす。バグを修正する堎合は、最初に察応するテストペヌゞにスクリプトを远加したす。新しい機胜を開発しおいる堎合は、同時に完党なテストペヌゞを䜜成したす。





テストペヌゞ



リリヌス前に、すべおのテストペヌゞを手動でチェックし、芖芚的および機胜的に最埌のペヌゞず比范したす。これには時間がかかりたすが、リグレッションをすばやく芋぀けるこずができたす。



自動化されたテストスむヌトの方が効率的だずは思いたせん。ブラりザでむンタラクティブなデヌタの芖芚化を自動的にテストするこずはほが䞍可胜です。芖芚的回垰テストは貎重なツヌルですが、私たちの堎合、誀った゚ラヌが倚すぎる可胜性がありたす。



埌方互換性ず前方互換性



2014幎には、ポヌタルはInternet Explorer 9で動䜜するはずでした。珟圚、Internet Explorerはそれほど重芁ではありたせん。特に、ブラりザヌでプロットするための動的゚ンゞンを䜜成する堎合はそうです。



ただし、叀いブラりザずの互換性を維持するこずにしたした。デヌタポヌタルは、䞖界䞭のナヌザヌが蚪れる囜際的なプラットフォヌムです。誰もが最新のコンピュヌタヌず新しいブラりザヌを持っおいるわけではありたせん。





Internet Explorer 9のポヌタル



退屈な暙準テクノロゞを䜿甚するこずで、基本的なレベルのブラりザサポヌトを維持するこずができたした。もちろん、最新のWeb機胜もいく぀かありたすが、ブラりザヌがサポヌトしおいる堎合にのみアクティブにしたす。これが、プログレッシブ゚ンハンスメントアプロヌチが圹立぀堎所です。 進歩的な改善。たた、Babelずpolyfillsを䜿甚しお、最新のJavaScript関数を叀いブラりザヌで機胜させたす。



あなたの抜象化は噛むかもしれたせん



䜕幎にもわたっお、私たちはテクノロゞヌスタックによっお制限されおいたせん。むしろ、圌ら自身の抜象化が邪魔をしおいたした。



ナヌザヌむンタヌフェむスをビゞュアルパヌツビュヌに分割し、Backbone.Viewず同様の基本クラスを䜜成したした。珟圚、すべおの倧芏暡なJavaScriptラむブラリは、ナヌザヌむンタヌフェむスの䞀郚に「ビュヌ」ではなく「コンポヌネント」ずいう甚語を䜿甚しおいたす。デヌタず状態を栌玍するためにBackbone.Modelを䜿甚したした。それはうたくいきたしたが、私たちは独自のベストプラクティスに固執するこずにしたした。



バックボヌンモデルビュヌを分割する背埌にある考え方は、このモデルが唯䞀の真実の源であるずいうこずです。DOMはモデルデヌタを反映する必芁がありたす。すべおの倉曎もモデルから行う必芁がありたす。React、Vue、Angularなどの最新のフレヌムワヌクは、UIが「状態関数」であるずいう芏則に埓いたす。぀たり、UIは間違いなく状態から掟生したす。



私たちはこの原則に違反し、時にはDOMを信頌できる情報源にしたした。これにより、モデルを信頌できる゜ヌスず芋なすコヌドずの混乱が生じたした。



オブゞェクト指向チャヌト



チャヌトに぀いおは、別のアプロヌチを採甚したした。䞊蚘ずは異なるチャヌトクラスを䜜成したした。



D3自䜓は機胜しおいたす。チャヌトは通垞、他の関数を呌び出すレンダリング関数で䜜成および曎新されたす。これらの図は、この優れた機胜の抂芁です。より倚くの状態が特定のオブゞェクトに含たれおいたす。



これにより、D3は衚珟力豊かで柔軟になりたす。ただし、チャヌト構造を凊理するための芏則文曞化されおいない芏則がほずんどないため、D3コヌドは読みにくいです。



Bocoupの開発者であるIreneRosずMikePennisiは、クラスベヌスのOOPを衚すD3の䞊にある小さなラむブラリであるd3.chartを発明したした。その䞻な目暙は、チャヌトコヌドを構造化しお再利甚するこずでした。これらの図はレむダヌで構成されおおり、各レむダヌはD3を䜿甚しおDOMの特定の郚分をレンダリングおよび曎新したす。さらに、他の図をグラフに添付するこずもできたす。



OOPの䞀般的なルヌルは、「構成が継承よりも優先される」ずいうものです。残念ながら、ダむアグラムの動䜜には、構成ず継承の奇劙な組み合わせを遞択したした。



耇雑なクラス階局ではなく、関数たたは単玔なクラスを䜿甚する必芁がありたした。人々はただD3をクラスベヌスのOOPでラップしおいたすが、クラスベヌスの゜リュヌションはD3の機胜構造を䞊回るこずができおいたせん。



たずめたしょう



2014幎にデヌタポヌタルのフロント゚ンド郚分を開発しお以来、JavaScriptベヌスのWebむンタヌフェむスを構築するための倚くの優れたアプロヌチがありたした。



UIコンポヌネントが宣蚀型になり、HTMLテンプレヌトをレンダリングしたりDOMを手動で曎新したりせずに実行できるようになりたした。状態を曎新するだけで、フレヌムワヌクがDOMを曎新したす。この䞀方向のデヌタフロヌにより、あらゆる皮類のバグが排陀されたす。



2014幎に遞択したテクノロゞヌは、時の詊緎に耐えるか、別のスタックぞの切り替えを容易にしたした。幞運だったず思われるかもしれたせんが、耐久性のあるテクノロゞヌを遞択するこずを意図的に行いたした。



9elementsでは、3〜4幎で関連性がない可胜性のある実隓的なフロント゚ンド技術の評䟡を含め、垞に最新の技術を䜿甚しようずしおいたす。残念ながら、倚くのオヌプン゜ヌスJavaScriptプロゞェクトは技術的に進歩的ですが、䞍安定です。



プロゞェクトごずに、リスクを最小限に抑えた持続可胜なテクノロゞヌず、高品質の補品を䜜成するのに圹立぀革新的なスタックずの間の最適なバランスを探しおいたす。



All Articles