責任あるJavaScript開発パヌト1

この数倀は、JavaScriptコヌドの増加がWebプロゞェクトのパフォヌマンスに悪圱響を䞎えるこずを瀺しおいたす。 これがさらに続く堎合、すぐに䞭間ペヌゞをロヌドするずきに、少なくずも400 KbのJSコヌドが転送されたす。 そしお、これは転送されたデヌタの量です。 他のテキストリ゜ヌスず同様に、JavaScriptコヌドはほずんどの堎合、圧瞮圢匏で送信されたす。 サヌバヌからクラむアントにコヌドを転送するずきに通垞行われるのは、おそらく圧瞮だけです。



画像



残念ながら、特定のリ゜ヌスの転送時間を短瞮するこずは「パフォヌマンス」ず呌ばれるものに倧きく貢献したすが、圧瞮は、スクリプトが完党にロヌドされた埌のスクリプトの解析ず凊理にかかる時間には圱響したせん。



サヌバヌが400 KBの圧瞮JSコヌドをクラむアントに送信する堎合、受信したデヌタを解凍した埌にブラりザヌが凊理する必芁がある実際のコヌド量はメガバむト領域になりたす。 さたざたなデバむスがこの皮の䜜業をどの皋床うたく凊理できるかは、デバむス自䜓に䟝存したす。 これに぀いおは倚くのこずが曞かれおいたすが、その時間のために非垞に普通であるコヌドの量を解析するために必芁な時間は、デバむスによっお倧きく異なるず自信を持っお蚀うこずができたす。



たずえば、 この単玔なプロゞェクトをご芧ください。 ペヌゞの読み蟌み䞭に、玄23 Kbの非圧瞮JSコヌドがクラむアントに転送されたす。 2017幎半ばにリリヌスされたMacBook Proで動䜜するChromeは、このかなり少量のコヌドを玄25ミリ秒で凊理したす。 ただし、 Nokia 2 Androidスマヌトフォンでは、同様の数倀が190ミリ秒に拡倧したす。 これは非垞に小さいず蚀っおいるわけではありたせんが、いずれにしおも、ペヌゞは十分にすばやくむンタラクティブになりたす。



さお、重芁な質問です。 シンプルなNokia 2スマヌトフォンは、平均的な珟代のペヌゞをどのように管理しおいたすか 実際、ひどいです。 JavaScriptコヌドがロヌドされたペヌゞでの䜜業は、かなりの期間が経過した埌にのみ可胜になるため、高速むンタヌネット接続であっおもWebペヌゞを閲芧するず、ナヌザヌは忍耐を必芁ずしたす。









凊理がメむンスレッドをブロックする倧量のJSコヌドを含むペヌゞを衚瀺したずきのNokia 2のパフォヌマンスの抂芁



Webペヌゞの閲芧に䜿甚するデバむスずデヌタが送信されるネットワヌクは近幎倧幅に改善されたしたが、これらの改善はすべお、ペヌゞに含たれる倧量のJSコヌドによっお「食い尜くされる」こずが瀺されおいたす。 JavaScriptを責任を持っお䜿甚する必芁がありたす。 責任は、私たちが䜜成しおいるものずその方法を理解するこずから始たりたす。



「サむト」ず「アプリケヌション」のむデオロギヌの比范



奇劙なこずは、私たちが䜕かを呌ぶために䜿甚する䞍正確な甚語で起こりたすが、その意味は盎感的なレベルでは誰でも理解できたす。 ミツバチずスズメバチの違いは非垞に重芁ですが、「ハチ」ずいう蚀葉の意味を「ハチ」やハチず呌んでいたす。 このような違いを考慮するず、「ハチ」ず「ハチ」の行動が異なるずいう事実に぀ながる可胜性がありたす。 たずえば、私たちはスズメバチの巣を砎壊したすが、ハチに぀いお話しおいる堎合、昆虫ははるかに有甚で脆匱です。間違った堎所にある巣はおそらく砎壊せず、どこかに移すこずに決めたす。



「りェブサむト」および「りェブアプリケヌション」ずいう甚語の䜿甚方法にも同様の自由が芋られたす。 これらの抂念の違いは、実際のハチずミツバチの違いほど明癜ではありたせんが、これらの抂念を組み合わせるず、非垞に䞍快な結果に぀ながる可胜性がありたす。 特定のプロゞェクトが「単なるWebサむト」であるか「本栌的なWebアプリケヌション」であるかに応じお、䜕かを蚱可するずトラブルが始たりたす。 䌚瀟の情報サむトを䜜成する堎合、DOMの倉曎を管理したり、クラむアントにルヌティングを実装したりするための匷力なフレヌムワヌクに䟝存するこずはほずんどないでしょう。 少なくずも、そう願っおいたす。 特定の問題を解決するのにあたり適しおいないツヌルを䜿甚するず、サむトを䜿甚する人々に害を䞎えるだけでなく、おそらく開発プロセスに悪圱響を䞎える可胜性がありたす。



Webアプリケヌションを開発するずき、すべおが異なっお芋えたす。 パッケヌゞをむンストヌルしたす。これには、プロゞェクトに数千ではないにしおも数癟もの䟝存関係が远加されたす。 さらに、私たちはそれらのいく぀かの安党性に぀いおさえ確信がありたせん。 バンドラヌの耇雑な構成を蚘述したす。 このようなナビキタスなクレむゞヌな開発環境で䜜業する堎合、収集されたものが高速であり、プロゞェクトが機胜するはずの堎所で機胜するようにするために、知識ず泚意が必芁です。 疑わしい堎合は、プロゞェクトのルヌトディレクトリでnpm ls --prodコマンドを実行し、このコマンドが衚瀺するすべおを䜿甚する目的に名前を付けられるかどうかを確認したす。 たずえそれができたずしおも、これはサヌドパヌティのスクリプトには適甚されたせん。 このようなスクリプトもいく぀かプロゞェクトで䜿甚されおいるず確信しおいたす。



WebサむトずWebアプリケヌションの䞡方が同じ「生態孊的ニッチ」を占めるこずを忘れおいたす。 䞡方ずも、さたざたなネットワヌクずデバむスで構成される環境の同じ圱響䞋にありたす。 「アプリケヌション」を開発しおいるものず呌ぶこずにした堎合、このような制限はなくなりたせん。たた、「サむト」を「アプリケヌション」ず呌ぶ堎合、ナヌザヌのデバむスが魔法のように速くなるこずはありたせん。



私たちが䜜成したものを誰が䜿甚するかを芋぀けるのは私たちの責任であり、異なるナヌザヌがむンタヌネットに接続する条件は私たちが䟝存しおいる条件ずは異なる可胜性があるずいう事実を考慮する必芁がありたす。 䜕かを䜜成するずき、私たちはそれを䜜成するための目暙を知る必芁があり、その埌でのみ、この目暙を達成するのに圹立぀ものを開発する必芁がありたす-開発がそれほど゚キサむティングな仕事ではないず刀明した堎合でも。



これは、JavaScriptぞの䟝存を再評䟡する必芁があるこずを意味し、特にHTMLずCSSを損なうJavaScriptの䜿甚が、Webプロゞェクトのパフォヌマンスずアクセシビリティを損なう䞍合理なパタヌンの䜿甚に぀ながる可胜性があるこずを意味したす。



フレヌムワヌクに䞍合理なパタヌンを課させないでください



フレヌムワヌク固有のチヌムず協力しお生産性を向䞊させたずきに、コヌドベヌスで奇劙なこずが発芋されたした。 これらの発芋の倚くには共通点が1぀ありたす。それは、それらの蚘述方法がサむトの可甚性ずパフォヌマンスの問題に぀ながるこずが倚いずいうこずです。 たずえば、次のReactコンポヌネントを考えたす。



import React, { Component } from "react"; import { validateEmail } from "helpers/validation"; class SignupForm extends Component {  constructor (props) {    this.handleSubmit = this.handleSubmit.bind(this);    this.updateEmail = this.updateEmail.bind(this);    this.state.email = "";  }  updateEmail (event) {    this.setState({      email: event.target.value    });  }  handleSubmit () {    //      -      if (validateEmail(this.state.email)) {      // ...    }  }  render () {    return (      <div>        <span class="email-label">Enter your email:</span>        <input type="text" id="email" onChange={this.updateEmail} />        <button onClick={this.handleSubmit}>Sign Up</button>      </div>    );  } }
      
      





ここでは、プロゞェクトのアクセシビリティに関するいく぀かの泚目すべき問題を芋぀けるこずができたす。



  1. <form>



    芁玠を䜿甚しない<form>



    は、もはやフォヌムではありたせん。 実際、芪<div>



    芁玠のrole = "form"を指定するだけでこれを修正できたすが、フォヌムを䜜成し、衚瀺されるものがフォヌムのように芋える堎合は、 <form>



    芁玠を䜿甚しお、それに応じお蚭定したす属性action



    およびmethod



    。 action



    属性はここで重芁な圹割を果たしたす。これは、JavaScriptが䜿甚できない堎合でも圓然、コンポヌネントがサヌバヌでレンダリングされた堎合でもフォヌムが少なくずも䜕かを実行できるようにするためです。
  2. <span>



    、 <label>



    代わりで<span>



    たせん。これは、 <span>



    はないプロゞェクトの可甚性に関する機胜を提䟛したす。
  3. type="submit"



    属性のない<button>



    芁玠は単なるボタンであり、これをクリックするず、それにバむンドされたむベントハンドラが呌び出されたす。 フォヌムを送信する前にデヌタを凊理する堎合は、ボタンにtype="submit"



    属性を割り圓お、 onClick



    むベントハンドラヌからonSubmit



    フォヌムむベントハンドラヌにコヌドを移動する必芁がありたす。
  4. ずころで、JavaScriptを䜿甚しお電子メヌルアドレスを怜蚌するのに察し、HTML5では、ほずんどすべおのブラりザヌIE10たでで入力デヌタのチェックをサポヌトするコントロヌルを自由に䜿甚できたす。 ここでは、ブラりザにすでにある機胜を利甚しお、適切な芁玠タむプず必須属性を適甚する機䌚を逃しおいたす。 ただし、このような構造を䜿甚する堎合は、スクリヌンリヌダヌずの通垞の察話を蚭定するには倚少の劎力が必芁になるこずに泚意しおください。


䞊蚘を考慮しお、コンポヌネントコヌドをリファクタリングしたす。



 import React, { Component } from "react"; class SignupForm extends Component { constructor (props) {   this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit (event) {   //    ,         XHR   // (      ,     ,     JS).   event.preventDefault();   //  
 } render () {   return (     <form method="POST" action="/signup" onSubmit={this.handleSubmit}>       <label for="email" class="email-label">Enter your email:</label>       <input type="email" id="email" required />       <button type="submit">Sign Up</button>     </form>   ); } }
      
      





珟圚、このコンポヌネントがレンダリングされるずいう事実は、よりアクセスしやすいだけでなく、以前ず同じ機胜を実装するために䜿甚されるJSコヌドが少なくなっおいるこずがわかりたした。 JavaScriptで文字通りdrれおいる䞖界では、数行のコヌドを削陀するこずは前向きなものず芋なされるべきです。 ブラりザは倚くの機䌚を䞎えおくれるので、できるだけ頻繁にこれらの機䌚を利甚するよう努力する必芁がありたす。



ここでは、特定のフレヌムワヌクを䜿甚する堎合にのみペヌゞのアクセシビリティに関する問題が発生するずは蚀いたくありたせん。 ぀たり、開発者はJavaScriptに頌りすぎお、倚くの重芁なHTMLおよびCSS機胜を単玔に芋逃しおしたいたす。 知識のこれらのギャップはしばしば゚ラヌに぀ながり、さらに、これらの゚ラヌを疑うこずさえありたせん。 フレヌムワヌクは、開発者の生産性を向䞊させる䟿利なツヌルになりたすが、開発で䜿甚される補助ツヌルに関係なく、基本的なWebテクノロゞヌの機胜を垞に研究するこずは、䟿利で䜿いやすい補品を䜜成する䞊で非垞に重芁です。



Webプラットフォヌムの力に頌っお、プロゞェクトに明るい未来を䞎えたしょう



フレヌムワヌクに぀いお話しおいるので、Webプラットフォヌム自䜓も巚倧なフレヌムワヌクであるこずに泚意しおください。 前のセクションで瀺したように、マヌクアップを䜿甚する確立されたパタヌンずブラりザヌの機胜に䟝存できる堎合、より良い立堎にありたす。 これらの暙準機胜の代替手段は、それらを再床発明するこずです。 蚀うたでもなく、このような「発明」にはかなりの困難が䌎いたす。 しかし、そのような問題がそれぞれ独自の方法で、むンストヌルするすべおのJavaScriptパッケヌゞの䜜成者によっお解決されるずしたらどうでしょうか。



▍シングルペヌゞアプリケヌション



簡単に賌入できる開発者の匱点の1぀は、このモデルが適さないプロゞェクトでも、シングルペヌゞアプリケヌションSPAモデルを䜿甚するこずです。 もちろん、このようなプロゞェクトは、クラむアントによっお実行されるルヌティングのために、ナヌザヌにより生産的であるず認識されるずいう事実の恩恵を受けたす。 しかし、SPAモデルを䜿甚するこずの欠点は䜕ですか ブラりザの組み蟌みペヌゞナビゲヌション機胜は、同期モデルに基づいおいたすが、プロゞェクトに倚くの利点をもたらしたす。 それらの1぀は、蚪問の歎史の管理が耇雑な仕様の実装を通しお実行されるずいうこずです。 JavaScriptを持たないナヌザヌは、JavaScript を無効にしたかどうかに関係なく 、プロゞェクトを操䜜する機胜を倱うこずはありたせん。 JavaScriptをオフにしたブラりザヌで1ペヌゞのアプリケヌションを䜿甚可胜にするには、サヌバヌのレンダリングにかなりの泚意を払う必芁があるこずが突然刀明したした。









䜎速通信チャネルで実隓アプリケヌションをロヌドするためのさたざたなオプションの比范。 巊偎のアプリケヌションのレンダリングは、JavaScriptに完党に䟝存しおいたす。 右偎のアプリケヌションはサヌバヌ䞊でレンダリングされたすが、クラむアント䞊でhydrateメ゜ッドを䜿甚しお、サヌバヌ䞊で既に䜜成されたマヌクアップにコンポヌネントを接続したす



ここでは、クラむアントでレンダリングされるアプリケヌションが数秒間ナヌザヌに空癜の画面を衚瀺し、完成したむンタヌフェむスを衚瀺するこずがわかりたす。



サヌバヌでレンダリングされ、クラむアントで動䜜可胜にレンダリングされたアプリケヌションは、メむンのむンタヌフェヌス芁玠をすばやく衚瀺したすが、クラむアントで完党にレンダリングされるアプリケヌションずほが同じ時間埌に䜿甚できたす。



クラむアントにあるルヌタヌが、ナヌザヌが衚瀺しおいるペヌゞの倉曎をナヌザヌに通知できない堎合も、アプリケヌションの可甚性が䜎䞋したす。 これにより、ナヌザヌは支揎技術に頌っおペヌゞ䞊の正確な倉曎を芋぀けるこずができ、その結果、サむトでのナヌザヌの䜜業ははるかに耇雑になりたす。



さらに、システムの過剰な負荷である叀い敵にすぐに出䌚うこずができたす。 䞀郚のクラむアントルヌタヌは非垞に小さいです。 ただし、 Reactでプロゞェクトを䜜成し、互換性のあるルヌタヌを䜿甚し、堎合によっおはアプリケヌションの状態を管理するラむブラリを䜿甚する堎合、䞀定量のサヌビスコヌドが含たれるこずに同意する必芁がありたす。 ぀たり、この堎合、玄135 Kbのコヌドです。 䜜成するプロゞェクトを慎重に分析し、クラむアントルヌティングがシステムの远加負荷に芋合うかどうかを分析したす。 通垞、クラむアントルヌティングシステムを拒吊する方が良いこずがありたす。



ナヌザヌの気持ちを心配しおいる堎合、サむトを高速に芋せたい堎合は、 rel = prefetch link属性を䜿甚できたす。これにより、同じ゜ヌスからのドキュメントのプリロヌドを敎理できたす。 この属性を䜿甚するず、ナヌザヌが認識するプロゞェクトのパフォヌマンスの向䞊に倧きな圱響を䞎えたす。これらのリンクをクリックするず、この属性の䜿甚にリンクされたペヌゞがキャッシュから即座にロヌドされるためです。 さらに、デヌタのプリロヌドの優先床が䜎いため、垯域幅をめぐっお重芁なリ゜ヌスず競合するこずはほずんどありたせん。









/を蚘述するこずによっお参照されるHTMLコヌドは、サむトのメむンペヌゞにアクセスしたずきにプリロヌドされたす。 ナヌザヌが察応するリンクをクリックするず、HTMLコヌドがブラりザヌキャッシュから即座にロヌドされたす。



ペヌゞのプリロヌドで発生する可胜性があり、泚意する必芁がある䞻な問題は、そのようなロヌドが時間ずリ゜ヌスの無駄になる可胜性があるこずです。 それを解決するには、たずえば、Googleの小さなQuicklinkスクリプトを䜿甚しお、この問題を軜枛できたす。 珟圚のクラむアントが䜎速接続を䜿甚しおいるかどうか、 デヌタ保存モヌドが有効になっおいるかどうかをチェックし、デフォルトでは、ペヌゞ゜ヌス以倖の゜ヌスからの玠材のプリロヌドを回避できたす。



䜕床もアクセスするナヌザヌの目にはサむトの芋た目を速くするために、 Service Workerを䜿甚できたす。 サヌビスワヌカヌの機胜の䞀郚に粟通しおいる堎合は、プロゞェクトでクラむアントルヌティングシステムを䜿甚するかどうかに関係なく䜿甚できたす。 サヌビスワヌカヌを䜿甚しおルヌトキャッシングを実行するず、䞀郚のリンクの玠材をプリロヌドする堎合に通垞芋られるのず同じ利点が倚数埗られたすが、リク゚ストず回答を凊理する機䌚ははるかに倚くありたす。 サむトを「アプリケヌション」ずしお認識するかどうかにかかわらず、サヌビスワヌカヌを装備するこずは、おそらく最も重芁なJavaScriptの䜿甚䟋の1぀です。



▍JavaScriptはレむアりト甚に蚭蚈されおいたせん



ペヌゞレむアりトに関連する問題を解決するために蚭蚈されたJSパッケヌゞをむンストヌルする堎合は、このパッケヌゞで䜕を達成しようずしおいるのかを慎重に確認する必芁がありたす。 CSSは、ペヌゞレむアりトを構築するために特別に䜜成されたもので、効果的に䜿甚するために抜象化は必芁ありたせん。 JavaScriptを䜿甚しお解決しようずする芁玠の配眮、芁玠の配眮 、サむズの調敎 テキストの管理など、 JavaScriptを䜿甚したレむアりトの完党な䜜成など、レむアりトを構築するタスクのほずんどは、CSSを䜿甚しお解決できるようになりたした。 FlexboxやGridなどのレむアりトを䜜成するための最新のツヌルはブラりザで十分にサポヌトされおいるため、レむアりトを操䜜するためのフレヌムワヌクに基づいおプロゞェクトを開発する必芁はありたせん。 ずころで、CSSはフレヌムワヌクでもありたす。 私たちが自由にプロパティリク゚ストなどの機䌚がある堎合、レむアりトの新しい改善手段をサポヌトするためのレむアりトの進歩的な改善は、結局のずころそれほど難しくありたせん 。



 /*   , ,   ,        CSS Grid. */ /*  @supports  ,     CSS Grid,     . */ @supports (display: grid) { /*      */ @media (min-width: 40em) {   /*       CSS Grid */ } }
      
      





JavaScriptを䜿甚しおペヌゞレむアりトを䜜成し、その倖芳をカスタマむズする問題を解決するこずは、ニュヌスではありたせん。 これは、すべおのサむトが圓時のより高床なブラりザヌず同じようにIE6のように芋えるべきだず蚀っお、2009幎に私たちが自己欺liveの雰囲気に䜏んでいたこずです。 今日、2019幎に、すべおのブラりザヌで同じように芋えるようにサむトを開発し続ける堎合、これは目暙を再考する必芁があるこずを意味したす。 サポヌトが必芁なブラりザは垞に存圚し、最新のブラりザず同じ機胜を備えおいたせん。 すべおのプラットフォヌムでのプロゞェクトの完党な倖郚類䌌性は、゚ネルギヌの浪費であるだけでなく、 進歩的な改善のアむデアの䞻芁な敵でもありたす。



結論JavaScriptキラヌになる぀もりはありたせん



誀解しないでください、私はJavaScriptの敵に属しおいたせん。 この蚀語のおかげで、私はキャリアを築き䞊げたした。そしお、率盎に蚀っお、JavaScriptは10幎以䞊にわたっお私に倚くの喜びをもたらしおいたす。 長期的な関係の堎合ず同様に、JavaScriptを䜿甚する時間が長くなればなるほど、JavaScriptをよりよく知るこずができたす。 これは、倚くの機胜を備えた成熟した蚀語であり、毎幎改善されおいたす。



ただし、JavaScriptの関係に䜕か問題があるように思える堎合がありたす。 私は圌を批刀したす。 たたは、より正確には、JavaScriptを䞻に他のこずを芋るこずなく䜿甚されるメむンのサむト構築ツヌルず芋なす珟圚の傟向を批刀したす。 玛らわしいクリスマスガヌランドのように芋える別のバンドルを分析するず、りェブがJavaScriptに倢䞭になっおいるこずが明らかになりたした。 状況がこれを必芁ずしない堎合であっおも、ほずんどすべおの理由でこの蚀語に頌りたす。 時々、私はJSに察するこの態床の結果がどれほど深刻であるかに぀いお考えたす。



私はJavaScriptずWeb開発に぀いお曞き続け、Webテクノロゞヌを合理的に䜿甚する方法を探し続ける぀もりです。 うたくいけば、私たちは珟代のりェブをより良くするこずを願っおいたす。



芪愛なる読者 最新のりェブは本圓にJavaScriptコヌドでオヌバヌロヌドされおいるず思いたすか






All Articles