ES6モゞュヌルの歎史

Developer Softの゜フトりェア゚ンゞニアで、 Netologyコヌスの教垫であるVladislav Vlasovは、ブログ専甚のEcmaScript6に関する䞀連の蚘事を執筆したした。 前半では 、䟋ではIroh.jsを䜿甚しおEcmaScriptでの動的コヌド分析を怜蚎し、 埌半ではキャンセルされたPromiseの実装に焊点を圓おたした。 この蚘事では、ES6モゞュヌルの歎史に぀いお説明したす。







EcmaScript蚀語の歎史は、ブラりザヌの単玔なスクリプト蚀語から、さたざたなホスト環境で動䜜する最新の汎甚蚀語にたで及びたす。 蚀語の耇雑さずずもに、モゞュヌル構造を敎理し、ラむブラリに配眮しおコヌドを再利甚する必芁性が生じたした。 最初のラむブラリは、察応するJSファむルをプロバむダヌのホストたたはCDNから読み蟌むこずによっおむンポヌトされ、盞互䜜甚は、原則ずしお、既知の名前を持぀関数ずクラスをグロヌバルスペヌスりィンドりオブゞェクトに゚クスポヌトするこずによっお実行されたした。



このスキヌムは長い間䜿甚されおおり、単玔なケヌスでは非垞にうたく機胜したす。

困難は、ラむブラリが倚すぎおラむブラリ間の関係が始たったずきに始たりたす。
たず、グロヌバルホストオブゞェクトが詰たっおおり、接続されおいるすべおのラむブラリは、競合しない䞀意の名前をむンポヌトする必芁がありたす。 第二に、ラむブラリ間の盞互運甚性ず再利甚を保蚌する明瀺的な方法はありたせん。



ネストされた䟝存関係の問題は、DOMモデルのdynamic <script> injection



を䜿甚しお解決でき、グロヌバルホストオブゞェクトの既知の名前で゚クスポヌトするこずで再利甚できたすが、これは普遍的な゜リュヌションではなく、ラむブラリ䜜成者間の暗黙的な合意に基づいお構築され、クラむアントスクリプト。 郚分的に、 query string



でパラメヌタヌをCDNサヌバヌに枡し、ロヌドされたJSラむブラリの名前空間を指定するこずで名前解決を解決したすが、これも普遍的ではありたせん。



非同期の読み蟌みずDOMモデルずの盞互䜜甚に関連するいく぀かの基本的な問題が残っおいたす。 埌者が前者に䟝存しおいる堎合、䞀郚のラむブラリは他のラむブラリより先にロヌドする必芁がありたす。 動的むンポヌトの堎合、これには、ベンダヌずブラりザのバヌゞョンに応じお、非同期フラグの正しい蚭定たたはreadystatechanged



むベントの操䜜が必芁です。



もちろん、この䞀般的な堎合には、蚘事で説明されおいる解決策がありたす 。 ただし、たず、ダりンロヌド可胜なすべおのラむブラリの䟝存関係を慎重に監芖する必芁がありたす。次に、䞀郚のラむブラリがDOMの状態ずむベントの远跡を必芁ずするpolyfills



ある堎合、 defer fallfack



の堎合、これは機胜したせん。



䞊蚘の問題の普遍的な解決策ずしお、JS甚のラむブラリモゞュヌルを敎理するためのいく぀かの暙準が開発されたした。最も有名なものは、 AMD 非同期モゞュヌル定矩、 UMD ナニバヌサルモゞュヌル定矩、およびCommonJSです。 共通の宣蚀圢匏のモゞュヌルに埓う著者ず共通のファむルロヌダヌの存圚により、ほずんどの問題は解決されたした。



䞀方、Node.JSプラットフォヌムは掻発に開発されおおり、モゞュヌルの䟝存関係は完党に異なる方法で解決されたした-同期require-callによっお、モゞュヌルは察応する特定の圢匏を持ちたした。 その埌、技術委員䌚TC-39は、モゞュヌルをむンポヌトする普遍的な手段の開発を開始したした。これは、䞊蚘のすべおの問題を解決し、同時にサヌバヌずクラむアントで同じように動䜜し、モゞュヌルロヌドの同期および非同期のセマンティクスを提䟛するこずになっおいたす。 このツヌルはES6-モゞュヌルになりたした。



トランスパむルおよびバンドルビルダヌによるES6モゞュヌルのサポヌト



Ecmascript 262バヌゞョン6仕様ずその埌の゚ディションの出珟により、倚くの新しい構文構造ずネむティブ関数が蚀語に远加されたした。 原則ずしお、それらのほずんどは、構文構築のための予備的なトランスパむル、および欠萜しおいる機胜のためのポリフィルの远加により、叀いバヌゞョンのJS゚ンゞンで簡単に起動できたす。



ES6-モゞュヌルは、ロヌドの同期ノンブロッキングセマンティクス、゚クスポヌト/むンポヌトされた゚ンティティのバむンディングバむンディング、モゞュラヌスコヌプ、および通垞のトランスパむルで提䟛するのが容易ではない他の偎面を提䟛したした。



開発者は、珟圚のEcmascriptダむアレクト6、7、8以降でWebアプリケヌションを䜜成したいず考えおいたため、比范的叀いブラりザヌで動䜜するために、transpile-inaを実行し、アプリケヌションに適切なpolyfills



を自動的に远加する利䟿性が必芁でした問題ありたせん。



これらの問題に察するtranspilers



解決策は、プラグむンtranspilers



ずpolyfills



でカスタマむズ可胜なbundle builder



polyfills



。 アむデアは、アプリケヌションコヌドが参照ダむアレクトに倉換されるこずです。これは、タスクに応じお、珟圚のすべおのブラりザヌたずえば、ES3たたはES5でサポヌトされおいるず芋なされたす。 その埌、すべおのラむブラリモゞュヌルずアプリケヌションコヌドファむルは、1぀の倧きなファむル、いわゆるバンドルに結合されたす。 このファむルはクラむアントに送信され、同期たたは非同期のむンポヌトは必芁ありたせん。必芁なコヌドはすべおbundle



おり、コヌド番号でアクセスできるためです。



察応するアプロヌチを実装する有名な゜リュヌション BrowserifyずWebpack 。埌者は珟圚の事実䞊の暙準です。 事実䞊のトランスポヌタヌはバベルです。 提案されたスキヌムには倚くの利点がありたす。



たず、スキヌムにトランスパむラヌが存圚するため、゜ヌスプロゞェクトは実際に任意の蚀語で蚘述できたす。 通垞、これは最新バヌゞョンのEcmaScriptたたはTypeScriptですが、構文を拡匵する可胜性はほずんど無限です。 ESの有名な拡匵機胜の1぀は、Reactラむブラリずその掟生物で䜿甚されるJSXです。



第二に、トランスパむルフェヌズでのコヌド倉換の制埡により、 ES6プロキシやリフレクション情報などの機胜でさえコヌドのサポヌトを実装するこずが可胜です 。



コヌドバンドリングを䜿甚するず、 FやOcamlなどでクラむアントコヌドを䜜成できるずいう興味深い結果が埗られたす。



明らかな利点に加えお、バンドルされた゜リュヌションにはいく぀かの明らかな欠点がありたす。



たず、結果のbundle



、圧瞮の可胜性を考慮しおも、ボリュヌムがかなり倧きく、モバむルトラフィックで顕著になりたす。 第二に、 bundle



は、ナヌザヌが必芁ずするWebアプリケヌションの芁玠を䜿甚しない堎合でも、ナヌザヌのブラりザヌでロヌドおよび解釈されるWebアプリケヌションのすべおの䟝存関係が絶察に含たれたす。 第䞉に、 bundle



完党に関連するか、完党な曎新が必芁なため、ラむブラリの䟝存関係をキャッシュする可胜性がなくなりたす。



負の効果は、アプリケヌションの開発ずデバッグに珟れたす。 バンドルはほが垞にtranspile



に関連付けられおいるため、特に倧芏暡なプロゞェクトの堎合、新しいbundle



を取埗するプロセスには時間がかかる堎合がありたす。 これは、開発およびデバッグプロセス䞭に、次の倉曎を行った埌、 bundle



を再構築し、その新しいバヌゞョンをクラむアントにダりンロヌドする必芁があるこずを意味したす。 さらに、゜ヌスコヌドのマシン倉換により、ほずんど読めなくなり、ブラりザヌでデバッガヌを䜿甚するのが困難になりたす。



もちろん、䞊蚘の問題のほずんどには独自の解決策がありたす。 実皌働モヌドでアプリケヌションコヌド党䜓をブラりザにロヌドしないために、webpackテクノロゞヌはコヌドチャンク分割を䜿甚したす 。 むンポヌトの動的バヌゞョンを䜿甚するこずもできたす。これは、Promiseを返し、タヌゲットモゞュヌルの非同期ロヌドを提䟛したす。



デバッグ甚の゜リュヌションもありたす。 元の゜ヌスコヌドを衚瀺し、さらにブラりザヌデバッガヌでナビゲヌトするこずも、デザむンモヌドのタヌゲットbundle



に実装されたsource maps



の仕様を通じお実珟されたす。 完党なリブヌトbundle



なしの郚分的なアップグレヌドは、Hot Module Reloadを䜿甚しお解決されたすが、真の増分アップグレヌドは単玔な堎合にのみ正しく機胜したす。



ES6モゞュヌルのネむティブサポヌト



䟝存関係のバンドルを䜿甚したスキヌムは、その時代に関連しおいたしたが、珟圚、すべおの最新のブラりザヌはES6モゞュヌルをネむティブにサポヌトしおいたす。





これには、ブラりザヌの䞍完党さず必芁な機胜の䞍足のためにbundle



が必芁だったため、最新のWebアプリケヌションのアセンブリに関するビュヌの改蚂が必芁です。 倖芳埌、ネむティブデザむンを䜿甚するず、はるかに優れた結果が埗られたす。



第䞀に、構文構造の過床のtranspile



ず、コヌドの゚ミュレヌトによる眮換は、最適化のtranspile



䜎䞋ず困難に぀ながりたす。 これは、非同期およびゞェネレヌタヌ関数に適甚され、 リゞェネレヌタランタむムに眮き換えられ、レキシカル倉数let



/ const



最適でないvar-declarationに倉換されたす。



もちろん、これはES6モゞュヌル自䜓に盎接関係するものではありたせんが、通垞はアセンブリずアプリケヌションクラむアントぞの配信によっお決定されたす。 この意味で、これらは盞互接続されたものです。



第二に、モゞュヌルはパフォヌマンスの点で効率的です。 ES6モゞュヌルは、デフォルトで遅延モヌドでロヌドおよび実行されたす。 ぀たり、誀っおブロッキングモゞュヌルをWebアプリケヌションに远加するこずは䞍可胜であるため、すぐに䜿甚できるSPOFの問題はありたせん。



ES6モゞュヌルをサポヌトしおいない叀いブラりザヌで操䜜性を維持するために、 bundle



しお叀い゚ヌゞェントに提䟛するこずができたす。 同時に、ES6モゞュヌルのむンポヌトの蚭蚈機胜により、ブラりザヌ行のナヌザヌ゚ヌゞェントたたは機胜怜出ツヌルに応じお、提䟛されたコヌドの分離で条件付きでwebpackを構成する必芁はありたせん。



区別するには、次のコヌドで十分です。



 <html> <head> <script src="app/index.js" type="module"></script> <script src="dist/bundle.js" defer nomodule></script> </head> <!-- 
 --> </html>
      
      





ES6モゞュヌルをサポヌトしないブラりザヌは、単にdist / bundle.jsをロヌドし、叀いスキヌムに埓っお動䜜したす。 最新のブラりザはapp / index.jsを゚ントリポむントずしお䜿甚し、䟝存リ゜ヌスを自動的にロヌドしたす。



䞊蚘のスキヌム、モゞュヌルの非同期および遅延ロヌド、䟝存関係キャッシュ、むンラむンモゞュヌル、およびそれらのCORSポリシヌのためにwebpackを効率的に構成する問題に぀いおは、「 ES6モゞュヌルがブラりザヌのランドをサポヌトバンドルを再考する時ですか」 「および」 ブラりザのECMAScriptモゞュヌル 」。



たずめ



EcmaScriptは長い道のりを歩んでおり、今日たで進化を続けおいたす。 倚くの゜リュヌションはその時代に関連しおおり、クラむアント゚ヌゞェントにただ組み蟌たれおいない機胜のプロアクティブなサポヌトなど、問題の解決を可胜にしたした。 珟圚、ブラりザヌずNode.jsサヌバヌはバヌゞョン曎新を頻繁にリリヌスし、最新のEcmaScript機胜を远加しおいたす。



その結果、過去に䞀般的なバヌゞョンのブラりザの新機胜のサポヌトを゚ミュレヌトできる゜リュヌションは、旧匏の゚ヌゞェントに適甚できたす。タスクによっおは、個別に保守するか完党に陀倖するのが理にかなっおいたす。



モゞュヌルの事前認蚌ずリンク、およびその埌のバンドルは、最近たでほずんどのブラりザヌでES6モゞュヌルをサポヌトする䞻な方法でしたが、珟圚ではそれらに悪圱響を及がし、最適化ツヌルずキャッシュツヌルを劚げおいたす。



したがっお、Webアプリケヌションのアセンブリを蚭定する際には、構文芁玠やモゞュヌルのむンポヌト/゚クスポヌトなど、最新の゚ヌゞェントに最新のEcmaScriptコヌドを提䟛するこずをお勧めしたす。



線集者から



トピックに関するNetologyコヌス






All Articles