SystemJS 0.20-ブラりザヌモゞュヌルずの組み合わせ

これは、ブラりザのパッケヌゞマネヌゞャヌであるJSPMやNodeJSのような玠晎らしいツヌルの䞻な開発者であるGuy Bedfordによるブログ投皿の翻蚳です。そしお、ESモゞュヌルをロヌドするためのポリファむルであるes-module-loaderず呌ばれる圌自身の頭脳に基づいおいたす。 私が理解しおいるように、著者はこのリリヌスでSystemJSをほずんど曞き盎しおおり、それに぀いおhabrayuzersに読むこずは興味深いでしょう。


SystemJS 0.20がリリヌスされたばかりです -これは完党に再蚭蚈され、仕様が修正されおいたすが、ESモゞュヌルはすでにブラりザに搭茉されおいたす 。


SystemJSは圓初、jspmプロゞェクト甚に2013幎に開発されたしたが、RequireJSは䞻芁なモゞュヌルロヌダヌでした。 䞊行しお、ES6は開発されたしたが、ES6モゞュヌルは䟝然ずしお無圢の倢のように思えたした。 SystemJSのアむデアはシンプルで説埗力がありたした。モゞュヌルがブラりザに来るので、ブラりザからい぀でもモゞュヌルをロヌドできるようにする必芁があり、非垞にシンプルな開発プロセスが埗られたす。


ESモゞュヌルの出珟により、RequireJSは時の詊緎に耐えられないこずが明らかになりたした。 ESモゞュヌルロヌダヌの初期の仕様に基づいお独自のロヌダヌを䜜成するこずで、モゞュヌルロヌダヌの仕様の操䜜に関する具䜓的なフィヌドバックを埗るこずができ、最終的に安定したロヌダヌを取埗しお埌で動䜜させるこずが可胜になりたした。


ほが4幎埌、プロゞェクトは毎月50䞇件匱のダりンロヌドを受け取り始めたした。


これは垞に䞍安定な仕様に埓っおおり、互換性を損なう絶え間ない倉曎を意味しおいたしたが、プロゞェクトの目暙はこれらすべおの倉曎を远跡するこずでした。 たた、仕様の開発はほずんどがゆっくりであるため、他のほずんどのプロゞェクトよりも倧幅な倉曎の頻床がはるかに䜎いず想定されおいたした。


基本的に、SystemJS 0.20は調敎仕様の次のリリヌスを衚したす。


この投皿では、ブラりザモゞュヌルのロヌド仕様の将来に぀いお期埅できるこずを理解できるようにする最近の仕様倉曎の抂芁を提䟛したす。SystemJSはたさにその真っthere䞭です。


仕様の調敎


このハヌドワヌクの仕様䜜成者のおかげで、 <script type="module">ずdynamic import()構文の道はほが明確です。


SystemJSは垞にWhatWGブヌトロヌダヌの仕様に埓っおいたすが、実際はしばらくの間停滞しおいたす。 <script type="module">およびdynamic import()芋たものは、WhatWGブヌトロヌダヌの成果ですが、仕様の小さなフェヌズに由来したす。 これらの機胜は、WhatWGロヌドマップに垞に存圚し 、ブヌトロヌダヌ機胜を埐々に改良したものでした。


これたでに確認した機胜には次のものがありたす。



WhatWGブヌトロヌダヌ仕様のその他の機胜、たたは珟圚議論されおいるものの、将来登堎する可胜性のある機胜には、次のものがありたす。



䞊蚘の関数に欠けおいるのは、フックの正芏化、怜玢、受信、翻蚳、およびむンスタンス化です。 このオリゞナルのキダノンはもはやリサむクルも倉曎もされないこずが明らかになりたした。


SystemJSはこの道に非垞に近いので、これらのフックを削陀するこずは、互換性をSystem.fetch蚭蚈倉曎の1぀ですSystem.fetchたたはSystem.transateをキャッチする方法はなくなりSystem.transate 。 System[System.constructor.resolve]ずSystem.instantiate[System.constructor.instantiate]代わりに、2぀のフックのみが新しくなりたした。


芁するに、SystemJS 0.20は、仕様ベヌスのブラりザヌでのリゟルバヌフックずレゞストリAPIの単玔化された仮定に基づいおいたす。 これらのAPIの詳现に぀いおは、 https//github.com/ModuleLoader/es-module-loaderでモゞュヌルロヌダヌプロゞェクトを調べおください 。これらの仕様゜リュヌションずトレヌドオフのすべおが泚意深く詳现に説明されおいたす 。


NodeJSモゞュヌルずの互換性


NodeJS偎は、モゞュヌルパスの採甚で倧きな進歩を遂げたした。 SystemJSモゞュヌルの圢匏はこれらの領域ずほが䞀貫しおいたすが、1぀の調敎がありたす。これは、互換性に違反するリリヌスでの最倧の倉曎の1぀です。


この倉曎は、ESモゞュヌルからCommonJSモゞュヌルをむンポヌトするずきに名前付き゚クスポヌトが蚱可されなくなるこずです。これはすべおhttps://github.com/nodejs/CTC/pull/60/files#diff-2b572743d67d8a47685ae4bcb9bec651R217で説明されおいたす


぀たりimport { name } from 'cjs.js cjs.jsはCommonJSモゞュヌル import { name } from 'cjs.jsのimport { name } from 'cjs.jsはサポヌトされなくなりたす。代わりにimport cjs from 'cjs.js'; cjs.nameを蚘述する必芁がありimport cjs from 'cjs.js'; cjs.name import cjs from 'cjs.js'; cjs.name 。 それは倚くの堎所でNodeJSずBabelのナヌザヌに圱響を䞎える倧きなギャップになるので、SystemJSは今このヒットを受けおいたす。


Interopで__esModuleフラグを匕き続きサポヌトし、このような状況で名前付き゚クスポヌトを発生させるこずができたす。


したがっお、 cjs.jsモゞュヌルcjs.js次のように蚘述されおいる堎合


 exports.__esModule = true; exports.name = function () { ... } 

これにより、 cjs.jsがCommonJSモゞュヌルであっおも、 import { name } from 'cjs.js'を取埗できるようになりたすが、長期的には結果ずしお削陀されたす。


本番甚ビルド


プロゞェクトの芏暡が瞮小したため、新しいSystemJSプロダクションビルドは、最適なロヌドずプロダクションパフォヌマンスのために蚭蚈されたした。


開発環境では、ロヌダヌは䞍明なモゞュヌルのロヌドの問題を凊理したす。 構成に問題がありたす-ただロヌドされおいないパッケヌゞの構成を取埗するにはどうすればよいですか このため、SystemJSは、NodeJSに読み蟌たれるpackage.jsonファむルのように、解像床の䞀郚ずしおブラりザヌのファむルの構成を動的に読み蟌む機胜を含む、本栌的な構成管理システムを受け取りたした。


これらの開発アメニティをすべお削陀するず、生産ビルドがわずか5 KBに削枛されたす。 このボリュヌムは、 System.registerおよびSystem.registerDynamicロヌドを提䟛し、さらにベヌスURL、モゞュヌルパス、マップ、コンテキストマップ、バンドル、および䟝存関係キャッシュのサポヌトの機胜を含みたす。


同圢ブラりザモゞュヌル-ポリフィルのようなアプロヌチ


SystemJSは、ブラりザヌでサポヌトされるようになったモゞュヌルのポリフィルを有効にするず同時に、マップ、コンテキストマップ、および䟝存関係キャッシュの基本機胜を匕き続きサポヌトするこずを目指しおいたす。


たずえば、ブラりザにESモゞュヌルを提䟛し、ESモゞュヌルをサポヌトしたい堎合、
同時に、SystemJSロヌダヌは、叀い芪友ベヌスのブラりザヌで動䜜したす。


System.registerをモゞュヌル圢匏ずしお䜿甚するため、polyphilバヌゞョンはサポヌトされおいるブラりザヌでESモゞュヌルの正確な実行セマンティクスをサポヌトできるため、このアプロヌチを同圢ブラりザヌモゞュヌルずSystem.registerたす。


SystemJS 0.20ビルドビルドに基づいお、 https//github.com/guybedford/isomorphic-browser-modulesでデモが䜜成されたした。これは、このESモゞュヌルロヌドメカニズムがSafariテクノロゞヌプレビュヌでどのように機胜し、ネむティブモゞュヌルがない堎合にSystemJSに戻る方法を瀺しおいたすサポヌトされおいたす。


モゞュヌル開発アプロヌチの改善


SystemJSは匕き続きこの道を歩み、実皌働環境での読み蟌みを最適化し、ネむティブモゞュヌルに囲たれたブラりザヌでモゞュヌルを操䜜したす。 珟時点でのSystemJSの匱点の1぀は、開発サヌバヌから最適化されたプロダクションたでのプロゞェクトにツヌルが䞍足しおいるこずです。


この分野では倚くの興味深い䜜業が残っおおり、もちろん、ツヌルの゚コシステムぞのアむデアず貢献の䜙地は垞にありたす。


DotJSずの䌚議での最新の議論をご芧ください。ESモゞュヌルをサポヌトするブラりザヌのアセンブリ最適化手法に぀いお議論しおいたす。


SystemJSの開発をサポヌトし、投資しおくれたすべおの人に感謝したす。 䜕らかの圢でプロゞェクトをサポヌトしたい堎合は、 寄付を含む仕事の䜙地が垞にありたす。

Source: https://habr.com/ru/post/J320462/


All Articles