TypeScriptを遞んだ理由Redditの開発者の歎史

画像 玄半幎前、Steve RedditのCEO は 、サむトを再蚭蚈するず発衚したした。 ここでの䞻な質問は、どのようにそれを行うかです。 珟圚、フロント゚ンド開発は、Redditが生たれた圓時の開発ずは倧きく異なりたす。 これで、Webアプリケヌションの各サブシステムにオプションの膚倧な遞択がありたす。 ペヌゞをレンダリングする方法は コンテンツのスタむル蚭定方法 写真ずビデオファむルを保存および管理する方法 コヌドの曞き方 珟代の状況では、これらの質問にはどれもすぐに答えられるものはありたせん。



答えを芋぀けるために必芁な最初のそのような質問の1぀は、「遞択する蚀語はどれですか」です。



豊富な遞択肢ず蚀語芁件に぀いお



奇劙なこずに、フロント゚ンドの蚀語はJavaScriptである必芁はありたせんでした。 最終的に、この目的のためにどの蚀語が遞択されおも、それに蚘述されたコヌドはJavaScriptでコンパむルされたす。 ただし、コヌドが正確にコンパむルされるものは、開発者が䜜成するものよりもおそらく重芁ではありたせん。 蚀語の遞択は容易ではありたせんでした。 考慮しなければならないこずは次のずおりです。



  1. BuckleScript

  2. ClojureScript

  3. CoffeeScript

  4. ニレ

  5. ElixirScript

  6. JavaScript 2016および将来の蚀語バヌゞョン

  7. JavaScript +アノテヌション

  8. ニム

  9. ピュアスクリプト

  10. 理由

  11. TypeScript



ずころで、これは完党なリストからはほど遠い。 各蚀語には長所ず短所がありたす。そのため、蚀語の1぀を遞択できるように、次の芁件を策定したした。



  1. それは匷く型付けされた蚀語でなければなりたせん 。 タむプは、ミクロレベルで、ドキュメントの圹割を果たしたす。 これらは、ある皋床、コヌドの正確性を確保するのに圹立ち、さらに重芁なこずには、リファクタリングを簡玠化したす。 匷く型付けされた蚀語を探しおいたもう1぀の考慮事項は、開発速床です。 䜜業を高速化するために、匷く型付けされた蚀語を芋぀けようずしたした。 このようなアむデアは、倚くのプログラマヌが開発した兞型的なビゞョンに反するものです。 ぀たり、これは開発者にずっお远加の負担であり、䜜業の速床を䜎䞋させるず䞀般に受け入れられおいたす。 ただし、開発速床を䞊げるこずは、゚ラヌの可胜性を高めるこずも意味したす。 コヌドは、たずえ迅速に蚘述されたずしおも、できるだけ少ない゚ラヌを含むように入力する必芁がありたした。 匷力なタむピングは、急成長䞭のプロゞェクトでも圹立ちたす。 匊瀟の゚ンゞニアチヌムは垞に芏暡を拡倧しおおり、コヌドに携わる人の数は着実に増加しおいたす。



  2. 優れたサポヌトツヌルが必芁です。 私たちがやろうずしおいるこずを考慮しおサむトの倧幅な再蚭蚈、かなりの数の補助ツヌルを独自に䜜成する時間はありたせんでした。 既補のオヌプン゜ヌス゜リュヌションを䜿甚しお迅速に開始できるこずが非垞に重芁でした。 より具䜓的には、これらは問題の特定のツヌルです。 これは、䞀般的なビルドシステムWebpackなどずの統合、リンタヌのサポヌト、テストフレヌムワヌクずの簡単な統合です。 䞀郚の蚀語の補助システムの統合が明らかでない堎合、この蚀語は考慮されなくなりたした。



  3. この蚀語は深刻なプロゞェクトで䜿甚されるこずになっおいたした 。 蚀語は良さそうに芋えたが、実際には個々の愛奜家の小さなプロゞェクトでのみ䜿甚されおいた堎合、それは私たちの仕事には䞍適切かもしれたせん。 さらに、蚀語が深刻なプロゞェクトで䜿甚されおいない堎合、そのような蚀語がどのくらい続くか、および蚀語開発者がその蚀語で芋぀かった゚ラヌに関するメッセヌゞにどれだけ迅速に応答するかに぀いお疑問が生じたす。



  4. 開発者は、蚀語を十分に早く習埗する必芁がありたす 。 䞊蚘のリストには玠晎らしい蚀語がありたすが、唯䞀のマむナスは、開発者がそれらを習埗するのに時間がかかりすぎるこずです。 その䞭でも、私はElmずPureScriptに぀いお蚀及したいず思いたす。 それらの䜿甚の問題に぀いお真剣に議論したした。 しかし、最終的には、それらの実装は、それらに粟通しおいない開発者がプロ​​ゞェクトで生産的に䜜業できるレベルに達するには、それらに慣れおいない開発者による新しいプログラミング抂念の開発に必芁な䜜業が倚すぎるこずを意味するこずが刀明したした。



  5. 蚀語は、クラむアントずサヌバヌの䞡方で動䜜するはずです。 Redditでは、SEOは非垞に重芁であるため、ブラりザで衚瀺できるペヌゞを配信するためのナニバヌサルシステムの欠劂は倧きな問題です。



  6. 優れたラむブラリサポヌト 。 すべおをれロから曞く぀もりはありたせんでした。 信頌できる、実瞟のあるラむブラリを必芁ずするタスクがいく぀かありたす。 私たちは、既存のラむブラリから必芁なものを遞択する機䌚を埗たいず考えたした。


これらの芁件を怜蚎した埌、2぀のオプションを決定したした。 1぀目はTypeScriptです。 2番目はJavaScript + Flowです。 しかし、最終的な遞択を行う前に、TypeScriptずFlowの機胜、およびそれらの違いをできるだけよく理解する必芁がありたした。



線集たたは泚釈



TypeScriptずFlowの重芁な違いの1぀は、TypeScriptはJavaScriptにコンパむルされる蚀語であり、FlowはJavaScriptコヌドに远加できる型泚釈のコレクションであるこずです。 泚釈付きコヌドの正確性は、静的アナラむザヌによっおチェックされたす。



䞊蚘の違いは、プログラムの䜜成方法に盎接圱響したす。 たずえば、TypeScriptおよびFlowの列挙での䜜業を芋おください。



TypeScript



enum VoteDirection {  upvoted = 1,  notvoted = 0,  downvoted = -1, }; const voteState: VoteDirection = VoteDirection.upvoted;
      
      





流れ



 const voteDirections = { upvoted: 1, notvoted: 0, downvoted: -1, }; type VoteDirection = $Keys<typeof voteDirections>; const voteState: VoteDirection = voteDirections.upvoted;
      
      





TypeScriptはコンパむルされた蚀語であるため、実行時に定矩される型を䜜成するために䜿甚できたす。 フロヌでは、型は単なる泚釈であるため、コヌド倉換に䟝存しお実行時に型衚珟を䜜成するこずはできたせん。



ただし、TypeScriptはコンパむルされた蚀語であるずいう事実により、いく぀かの欠点がありたす。 TypeScriptを既存のコヌドベヌスに統合する堎合、コンパむラがビルドプロセスを耇雑にする可胜性がありたす。 Babelずトランスパむレヌションレむダヌを䜿甚したビルドプロセスが確立されおいたす。 TypeScriptに切り替えおも維持したい最適化がいく぀かあるため、既存の䜜業スキヌムを砎壊しないTypeScriptを統合する方法が必芁でした。 TypeScriptは、はるかに耇雑なビルドプロセスをもたらしたす。



TypeScript凊理ずは察照的に、BabelはFlowタむプの泚釈を自動的に削陀したす。 Flowを遞択した堎合、アプリケヌションの構築プロセスは耇雑ではありたせん。



コヌド怜蚌



コヌド怜蚌の分野では、通垞、FlowはTypeScriptよりもパフォヌマンスが高くなりたす。 Flowでは、デフォルトで、 NULL



型を䜿甚するこずは犁止されおいたす。 TypeScript 2.xでは、 NULL



蚱可されおいない型のサポヌトが远加されたしたが、この機胜を自分で有効にする必芁がありたす。 さらに、Flowは型をより適切に衚瀺したすが、TypeScriptはしばしばany



参照しany



。



NULL



ず型掚論を蚱可する型に加えお、Flowは共分散ず反分散の問題に適しおいたすこのトピックに関する資料はこちらです 。 ここでの兞型的な問題状況の1぀は、型付き配列の操䜜です。 デフォルトでは、Flowの配列は䞍倉です。 これは、Flowの次の構成が゚ラヌをスロヌするこずを意味したす。



流れ



 class Animal {} class Bird extends Animal {} const foo: Array<Bird> = []; foo.push(new Animal()); /* foo.push(new A);       ^ A. This type is incompatible with const foo: Array<B> = [];               ^ B */
      
      





ただし、TypeScriptで同じこずをしようずするず、゚ラヌメッセヌゞなしで倱敗したす。



タむプスクリプト



 class Animal {} class Bird extends Animal {} const foo: Array<Bird> = []; foo.push(new Animal()); //  typescript  
      
      





さらに倚くの類䌌した䟋を芋぀けるこずができたすが、䞀般的な結論は、フロヌはTypeScriptよりも型チェックではるかに優れおいるこずです。



生態系



これたで述べおきたこずはすべお、Flowの利点に぀いお語っおいたす。 プロゞェクトに統合する方が簡単で、型チェックにうたく察応したす。 なぜTypeScriptで停止したのですか



TypeScriptの最も重芁な利点の1぀は、その゚コシステムです。 それは玠晎らしいラむブラリをサポヌトしおいたす。 䜿甚したほずんどすべおのラむブラリヌは、ラむブラリヌ自䜓にタむプの説明があるか、 DefinitelyTypedで提瀺されおいたす。 さらに、TypeScriptは、VSCodeおよび䜿甚しおいる他の䞀般的な゚ディタヌのプラグむンAtomやSublimeTextなどで優れたIntelliSenseをサポヌトしおいたす。 さらに、TypeScriptがJSDocアノテヌションを凊理できるこずを発芋したした。 JavaScriptを䜿甚しおTypeScriptに切り替えたため、これは特に有甚であるこずが刀明したした。



さらに、TypeScriptはより「瀟䌚的重芁性」が高く、圌の人生は十分に長くなるずいう感芚がありたす。 TypeScriptを䜿甚するいく぀かの倧芏暡なプロゞェクトVSCode、Rxjs、Angular、TypeScript自䜓があるため、その機胜セットがプロゞェクトの目暙を達成し、今埌数幎間でその蚀語を䜿甚できるず確信しおいたす。どこにも行かない。 Flowに぀いおは、Facebook䞊の特定のタスクを解決するために䜜成されたものであり、その開発は同じ範囲のタスクによっお決定されるこずを心配しおいたす。 䞀方、TypeScriptは幅広い問題に焊点を圓おおおり、Microsoftは珟圚取り組んでいたす。 これにより、゚ラヌが発生しおそれらを報告した堎合、圌らは私たちの声を聞いお行動を起こすず想定できたす。



さらに、TypeScriptはJavaScriptのスヌパヌセットであるため、TypeScriptの開発、特に新しい型ず蚀語構成䜓のサポヌトは、JSの開発に続くこずが期埅できたす。 蚀語ず型のシステムは䞊行しお開発されたす。それらの䜜業が進行䞭だからです。



たずめ



TypeScriptを遞んだのは、新しい開発者が必芁ずするすべおのものをすばやく教えるこずができるず確信しおいるからです昚幎、フロント゚ンド゚ンゞニアの数は3倍になりたした。 この蚀語は、サむトの再蚭蚈におけるニヌズを満たしおいるず確信しおいたす。 さらに、すべおがTypeScriptが長期間存圚するこずを瀺唆しおおり、私たちの調査では、TypeScriptがコヌドベヌスずうたく統合されるこずが瀺されおいたす。 しかし、私たちにずっお最も重芁なこずは、匷く型付けされた蚀語ぞの移行です。



型付き蚀語を䜿甚するず、すでにいく぀かの結果が埗られおいたす。 コヌドに含たれる型関連の゚ラヌは少なく、倧芏暡なリファクタリングをより自信を持っお実行したす。 埋め蟌みドキュメントは、オブゞェクトず関数パラメヌタヌの内郚構造を蚘述するのではなく、抂念に焊点を合わせおいたす。 その結果、TypeScriptはたさに私たちが必芁ずしおいたものであるず蚀えたす。



芪愛なる読者 TypeScriptたたはFlowを䜿甚しおいたすか



All Articles