型砎りなAngularJSレビュヌ

こんにちは、Habr



倚くの人が以前のReactの非䌝統的なレビュヌの翻蚳を気に入っおおり、もちろん、人々はReactず人気のあるAngularJSを比范し始めたした。 本日、同じ著者James Shore、Let's CodeTest-Driven JavaScriptのホストからの蚘事「An Anconventional Review of AngularJS」の翻蚳を公開しおいたす。 角床のあるファンは萜ち着いおください。







AngularJSは、フレヌムワヌクに期埅するすべおです。 そしお、これは良くありたせん。



11月、12月、1月に、Let's Code JavaScriptプロゞェクトの䞀環ずしお、䞀連の「フロント゚ンドフレヌムワヌク」に぀いおAngularJSをレビュヌしたした。 合蚈で、問題の調査、プログラミング、および解決に40時間費やしたした。 い぀ものように、私の目暙はアプリケヌションを構築しおAngularJSを孊ぶこずでした。



珟圚、 Angularはおそらく最も人気のあるフロント゚ンドフレヌムワヌクです。 Googleのチヌムによっお開発されおおり、すぐに自信を呌び起こしたす。 頭字語に含たれおいるほど人気が​​ありたす。 Angularは、いわゆるMEANスタックの䞀郚です。MongoDB、Express、AngularJS、Node.JS。 最も先進的なテクノロゞヌ。



Angularは、それ自䜓をHTMLを改善するツヌルずしお説明しおいたす。 これにより、静的なHTMLドキュメントを動的なテンプレヌトに倉換する新しい定矩ディレクティブでHTMLを拡匵できたす。 ディレクティブは属性たたはタグたたはコメントやクラスでさえありたすが、これはもはや普通の話ではありたせんであり、静的なHTMLドキュメントをJavaScriptを远加せずに䞀芋生き生きずしたものに倉えたす。



最良の䟋は、有名な双方向バむンディングです。 HTMLテンプレヌトには、ほずんどのテンプレヌト蚀語ず同様に倉数を含めるこずができたすが、Angularの堎合、倉数が曎新されるたびにペヌゞが自動的に曎新されたす。



たずえば、レビュヌ甚に䜜成したアプリケヌションには、構成フィヌルドが倉曎されるず倉曎されるテヌブルがありたす。 以䞋は、テヌブルの行をレンダリングするコヌドのスニペットです。 むベントやステヌタスの監芖に関する䜜業がないこずに泚意しおください。行のセルを蚘述するテンプレヌトにすぎたせん。 Angularはすべおを自動的に行いたす。



// Copyright (c) 2014-2015 Titanium IT LLC. All rights reserved. For license, see "README" or "LICENSE" file. (function() { "use strict"; var StockMarketCell = require("./stock_market_cell.js"); var stockMarketRow = module.exports = angular.module("stockMarketRow", [StockMarketCell.name]); stockMarketRow.directive("stockMarketRow", function() { return { restrict: "A", transclude: false, scope: { value: "=" }, template: '<tr>' + '<td stock-market-cell value="value.year()"></td>' + '<td stock-market-cell value="value.startingBalance()"></td>' + '<td stock-market-cell value="value.startingCostBasis()"></td>' + '<td stock-market-cell value="value.totalSellOrders().flipSign()"></td>' + '<td stock-market-cell value="value.capitalGainsTaxIncurred().flipSign()"></td>' + '<td stock-market-cell value="value.growth()"></td>' + '<td stock-market-cell value="value.endingBalance()"></td>' + '</tr>', replace: true }; }); })();
      
      





魔法。



このような䟋では、Angularがこれほど人気を博した理由が簡単にわかりたす。 圌にずっお、難しい問題はささいなように思えたす。 しかし、それは時の詊緎に耐えたすか



型砎りなレビュヌ



あたりにも倚くのフレヌムワヌクが閉じ蟌められおいたす。開始するのは簡単です。これは非垞にクヌルですが、埌でコヌドを維持および拡匵するこずは非垞に困難です。 これはあたりクヌルではありたせん。



そのため、フレヌムワヌクを確認するずき、パフォヌマンス、人気、たたはサむズの通垞の基準を芋おいたせん。 いいえ、1぀の重芁な質問に察する答えを知りたいです。



今埌5〜10幎以䞊、補品をサポヌトするずきに、このコヌドはより倚くの利益や苊しみをもたらしたすか



ほずんどのフレヌムワヌクは、補品の最初の䜜成にかかる時間を節玄できるように蚭蚈されおいたす。 しかし、これらのコストは、アプリケヌションを数幎間維持するためのコストず比べるず些现です。 フレヌムワヌクを掚奚する前に、時間の詊緎に耐えるこずを知っおおく必芁がありたす。 それは私ずずもに成長し、倉化したすか それずも、3幎埌にはほずんど適合しない遺産の束瞛に身を眮くでしょうか



私は5぀の䞀般的な危険を芋おいたす。



1.閉鎖ロックむン。 新しいたたはより良いフレヌムワヌクたたはラむブラリにアップグレヌドするこずにした堎合、切り替えるのはどれくらい難しいでしょうか



2.リゞッドアヌキテクチャオピニオンアヌキテクチャ。 アプリケヌションが必芁ずする方法で問題を解決できたすか、たたはフレヌムワヌクの䜜成者が開発したいく぀かのアむデアに埓う必芁がありたすか



3.サむドの耇雑さ偶発的な耇雑さ。 私は自分の問題を解決するのに時間を無駄にしおいるのですか、それずもフレヌムワヌクに苊劎しおいたすか



4.テスト。 暙準ツヌルを䜿甚しお、モックオブゞェクトで䞍必芁な問題を発生させるこずなく、コヌドをテストするこずはできたすか



5.サヌバヌでのレンダリングサヌバヌ偎のレンダリング。 人々はJavaScriptが圹に立぀ものを芋るのを埅぀でしょうか 怜玢゚ンゞンにサむトのむンデックスを䜜成させるために、タンバリンず螊る必芁がありたすか



uiii、Bueee、たたは⚇ここでもそこでもないを䜿甚しお、各カテゎリでAngularを評䟡したした。



1.閉鎖-bueee



質問なしAngularはあなたを閉じ蟌めたす。 特定のAngular定矩ずコヌドを䜿甚しお、特定のAngularテンプレヌトで特定のAngularディレクティブを䜿甚しおむンタヌフェむスを定矩したす。 それから抜象化する方法はありたせん。 切り替える堎合は、すべおをれロから曞き盎したす。



これは䞀般的な方法です。 あたりにも普通なので、通垞は「ここでもここでもない」ずいう顔をする機䌚を䞎えたす。 しかし、Angularは正確に「bueee」を獲埗しようずしたした。



たず、Angularはすべおのクラむアントコヌドのマスタヌになりたいず考えおいたす。 Angularでアプリケヌションを䜜成する堎合、これは、Angular固有の怜蚌を䜿甚し、Angular固有のサヌビスの圢でビゞネスロゞックを蚘述し、Angular固有のサヌビスを介しおバック゚ンドに接続する必芁があるこずを意味したす。



次に、Angularチヌムは、サポヌトコストが優先事項ではないこずを明確にしたす。 IE 8のサポヌトはAngular 1.3で廃止され、Angular 2は倧幅に曞き盎され、珟圚のバヌゞョンのいく぀かの重芁な抂念を忘れおいたす。 これが、アプリケヌション党䜓を曞き換える理由である可胜性がありたす。



繰り返したすが、フロント゚ンド党䜓がロックされおおり、䜕も倉曎しおいなくおも、おそらく䜕かを曞き換える必芁がありたす。 曞き換えはひどい考えです。 あなたはすでに持っおいるものを繰り返すために倚くのお金ず時間を費やすでしょう。 ロヌドマップに「アプリケヌションの曞き換え」ずいうアむデアが含たれおいるフレヌムワヌクは受け入れられたせん。



2.リゞッドアヌキテクチャ-⚇ここでもここでもない



Angularは、アプリケヌションを特定の圢匏で構築するこずを望んでいたすが、これをあたり明瀺的に行いたせん。 むしろ「受動的で攻撃的なアヌキテクチャ」です。



リゞッドアヌキテクチャは短期的には良いアむデアであり、長期的には悪いアむデアです。 短期的には、タむトなフレヌムワヌクにより、アプリケヌションの構造を考慮するこずなく迅速に開始できたす。 しかし、長期的には、あたりにも厳栌なアヌキテクチャが可胜性を制限したす。 芁件が倧きくなるに぀れお、フレヌムワヌク暙準がたすたす煩わしくなり始めたす。



Angularのパッシブ/アグレッシブアヌキテクチャには、䞡方の䞖界で最悪のものが含たれおいたす。 アプリケヌションの蚭蚈に関する仮定を行いたすが、これらの仮定の理解には圹立ちたせん。 私は今でもこれを理解しおいるず確信しおいたせんが、ここで私は䜕ずか釣り出したした



「基本的なレベルでは、Angularは、ステヌトレスの「サヌビス」オブゞェクトをロゞックに䜿甚し、デヌタ構造の単玔なオブゞェクトメ゜ッドのないオブゞェクトを䜿甚しお状態を保存するず考えおいたす。 サヌビスは基本的にグロヌバル倉数です。 ほずんどの機胜はどのサヌビスでも䜿甚でき、特別な名前でアクセスできたす。 デヌタ構造は$スコヌプに保存され、テンプレヌトずディレクティブに関連付けられおいたす。 デヌタ構造のオブゞェクトは、「コントロヌラヌ」テンプレヌトずディレクティブに関連付けられた「接着剀」およびサヌビスによっお制埡されたす。



私はこのアヌキテクチャのファンではありたせん。 状態をロゞックから分離するこずで、Angularはカプセル化を砎り、密接に関連する抂念を分離したす。 動䜜するデヌタの隣にロゞックを配眮するのではなく、Angularはロゞックをアプリケヌション党䜓に広げたいず考えおいたす。 「 ショットガンの犠牲者を操䜜する 」リスクがありたす。倉曎するず、倚数の小さな修正が行われたす。



チュヌトリアルのアプリケヌションは、この問題を瀺しおいたす。 アプリケヌションはスマヌトフォンのリストを衚瀺し、「電話」オブゞェクトは重芁な抂念です。 理想的には、電話オブゞェクトの内郚構造の倉曎は䜕にも圱響しないはずです。 ただし、これらは単なるデヌタオブゞェクトであるため、倉曎するず、アプリケヌションの他の郚分電話リスト出力テンプレヌト、電話情報出力テンプレヌト 、およびこれらのテンプレヌトの䞡方のコントロヌラヌの倉曎が必芁になりたす。



状態ずビゞネスロゞックを含むリッチドメむンオブゞェクトを奜みたす。 だから私は䜕も壊さずに倉曎を加えるこずができたす。 サンプルアプリケヌションでは、倀を持぀䞍倉オブゞェクトに䟝存するリッチドメむンレむダヌを䜿甚したした。 Angularのパッシブ/アグレッシブアヌキテクチャはこのアプロヌチをサポヌトしおいたせん。Angularの仮定を満たすためにコヌドを倉曎しなければならないこずもありたしたが、これは䞍可胜な䜜業ではありたせんでした。 さらに悪いこずかもしれたせん。



3.担保の耇雑さ-賌入者



Angularは、急な孊習曲線ず貧匱なドキュメントで有名です。 これらはより倧きな問題の症状だず思いたす。 これはドキュメントの問題ではなく、角床の問題です。 デザむンが悪いだけです。 ここに私が気づいた欠点のほんの䞀郚がありたす



挏れやすい抜象化。 自明でないプロゞェクトでAngularを䜿甚するには、奥深くに行き、内郚でどのように機胜するかを理解する必芁がありたす。 プロトタむプ継承のフレヌムワヌクでスコヌプずその仕組みを理解する必芁がありたす。ダむゞェストルヌプ。 $ watch、$ watchCollection、および$ apply。 他にもたくさんありたす。



マゞックラむンは、デザむンの貧匱な統䞀性を回避しようずする詊みです。 倚くの堎合、盞互接続されおいるが、異なるファむルにあるコヌドの断片が衚瀺されたす。



どこでも䞍可解な文字。 Angularには、アプリケヌションの文字列に埋め蟌む必芁があるいく぀かの小さな蚀語がありたす。 「=」、「」、「= *」、「@」の違いを理解する準備をしたす。 「E」、「A」、および「EA」。 挔算子「|」; およびその他の象圢文字。



ずらえどころのない互換性オッズ。 問題はいく぀かの方法で解決できたす。それぞれの方法には、小さいながらも重芁な非互換性がありたす。 たずえば、コントロヌラヌの䜜成方法は、テンプレヌト内の構文ず倉数が$スコヌプに栌玍される方法に圱響したす。



静かな倱敗の傟向。 間違いを犯したり、䜕か間違ったこずをしたり、原因を瀺すこずはできたせん。 「A」ず曞く䟡倀のある「E」を曞きたしたか アプリケヌションが動䜜を停止したした。



Reactで初めお同じアプリケヌションを曞いたずき、28Ÿ時間かかりたした。 Reactでの最初の詊行からコヌドの䞀郚を䜿甚できるずいう事実にもかかわらず、私は同じアプリケヌションをAngular39œ時間で䜜成したした。 トップで10時間。 その理由は、Angularの過床の耇雑さです。



4.テスト-⚇ここでもここでもない



Angularはテストを非垞に重芁だず考えおいたす。 その䞻な機胜の1぀-䟝存関係の実装䟝存性泚入は、テストを簡玠化するために特別に䜜成されおいたす。



この焊点を考えるず、Angularでのテストがいかに悪いかずいうこずに驚きたした。 コントロヌラヌずサヌビスのテストロゞックに焊点を圓おおいたすが、ナヌザヌむンタヌフェむスの動䜜をテストするこずはほずんどありたせん。 ブラりザヌむベントのシミュレヌションはサポヌトされおいたせん。たた、HTMLテンプレヌトを単䜓テストする方法もありたせん。 カスタムディレクティブはテストできたすが、内郚に別のディレクティブがあるディレクティブをテストするのは怖いです。



Angularは、ビゞネスロゞックの単䜓テスト機胜に重点を眮いおいたす。 ただし、唯䞀の理由は、アヌキテクチャ自䜓がUI特にコントロヌラヌずサヌビスにビゞネスロゞックを配眮するこずを匕き起こすからです。 優れたアヌキテクチャは、UIに䟝存しないオブゞェクトにビゞネスロゞックを配眮したす。



Angularの倚くの偎面は、自己カットの䞊のパッチのように感じたす。



アプリケヌションの堎合のようにビゞネスロゞックを削陀しおも、AngularがHTMLをレンダリングしおむベントに応答する方法をテストするだけであり、Angularはこれを行うこずをサポヌトしおいたせんでした。 Angularチヌムは、特別に蚭蚈された゚ンドツヌ゚ンドのフレヌムワヌクを䜿甚しおProtractorをテストするこずをお勧めしたす。



゚ンドツヌ゚ンドのテストは時間がかかり、脆匱です。 それらの数は最小化する必芁があり、テスト戊略の䞭心抂念ずしおそれらに䟝存しないでください。 幞いなこずに、アプリケヌションのUIをカスタムディレクティブに配眮するこずで、Angularを単䜓テストする機䌚がありたした。 ここで圌は「ここでもそこでもない」䞭立的な顔を獲埗したしたが、よく芋るず、小さな涙が芋えたす。



5.サヌバヌでレンダリング-bueee



AngularJSは、サヌバヌ䞊で動䜜するようには蚭蚈されおいたせん。 驚きはありたせんが、怜蚎する䟡倀がありたす。



結論避けおください。



Angularでの䜜業-苊痛。 各ステップは新しい機胜たたはテストであり、レビュヌの終わりたでに圌は本圓に私を芋぀けたした。 おそらく、Angularが望んでいたこずをすべお行い、デザむンを実装しようずしない堎合、それは私にずっお簡単ですが、私の目暙は、プロゞェクトを長期的にサポヌトする可胜性を探るこずであり、できるだけ早くすべおを行うこずではありたせんでした。



この点で、すべおが悪いです。 Angularは耇雑なフレヌムワヌクであり、奇劙なものに成長したした。 これは人気がありたすが、良くありたせん。より良い遞択肢が珟れるずすぐに忘れられるず思いたす。 Angular 2はすでに準備段階にあるため、今日Angularを受け入れるこずで、数幎以内にアプリケヌションを曞き盎すこずをほずんどの堎合自分自身を非難しおいたす。 将来のバヌゞョンではこれらの欠陥が修正される可胜性がありたすが、今日のAngularは適切な遞択ではありたせん。 避けおください。



All Articles