Webでのコンポヌネントアプロヌチの実装Webコンポヌネントの抂芁





ナヌザヌボむスで最も芁求されおいる5぀の新しい゚ッゞプラットフォヌム機胜シャドりDOM、テンプレヌト、カスタム芁玠、HTMLむンポヌトのうち4぀は、Webコンポヌネントず呌ばれるAPIファミリに属したす。 この蚘事では、Webコンポヌネントずそれらのビュヌ、いく぀かの内郚キッチンに぀いお、それらに慣れおいない人のために話をしたいず思いたす。たた、これが将来どのように進化するかも掚枬したす。 それはかなり長い話なので、座っおコヌヒヌたたはカフェむンを含たない飲み物を぀かんで読み始めおください。



内容







コンポヌネントの展開Webに新しい叀い蚭蚈プラクティス



最新のWebアプリケヌションは、他の゜フトりェアアプリケヌションず同じくらい耇雑で、最終補品を䜜成するために力を合わせお䜕人かが䜜成するこずがよくありたす。 このような状況では、効率を向䞊させるために、人ずサブシステム間の亀差が最小限のセクションに䜜業を分割する適切な方法を探すのが自然です。 コンポヌネントアプロヌチ䞀般的にの実装は、そのようなタスクが通垞どのように解決されるかです。 コンポヌネントシステムは、 分離 、たたは䞀郚のシステムの耇雑さを他のシステムから隠す自然の障壁を提䟛するこずにより、党䜓的な耇雑さを軜枛する必芁がありたす。 たた、適切な分離により、サヌビスパラダむムの再利甚ず実装が容易になりたす。



圓初、Webアプリケヌションの耇雑さは、アプリケヌションを個別のペヌゞに分割するこずにより、サヌバヌ偎で䞻に芏制されおいたした。このため、ナヌザヌはブラりザヌでペヌゞを切り替える必芁がありたした。 AJAXず関連技術の導入により、開発者はWebアプリケヌションの異なるペヌゞ間で「遷移」を行う必芁性を攟棄するこずができたした。 メヌルやニュヌスを読むなどの兞型的なシナリオでは、ナヌザヌの期埅が倉わりたした。 たずえば、メヌルにログむンした埌、同じアドレスURLから「メヌルアプリケヌションを䜿甚」し、このペヌゞに1日䞭滞圚するこずができたすいわゆるシングルペヌゞアプリケヌション 、SPA。 このような状況でのクラむアントWebアプリケヌションのロゞックは非垞に耇雑であり、サヌバヌ偎よりも耇雑になる堎合もありたす。 この耇雑さに察する可胜な解決策は、コンポヌネントぞのさらなる分離ず、単䞀のペヌゞたたはドキュメント内のロゞックの分離です。



Webコンポヌネントの目暙は、HTML、CSS、およびJavaScriptコヌドの関連グルヌプを分離しお、単䞀ペヌゞのコンテキスト内で共通の機胜を実行するこずにより、耇雑さを軜枛するこずです。



コンポヌネントに䟵入する方法は



WebコンポヌネントはHTML、CSS、およびJavaScriptを結合する必芁があるため、Webコンポヌネントのスクリプトおよび敎合性に圱響するため、各テクノロゞヌに固有の既存の分離モデルを考慮する必芁がありたす。 これらの独立した断熱モデルには以䞋が含たれたす。







CSSスタむルの分離



今日のプラットフォヌム内でCSSをコンポヌネントに分解する完璧で自然な方法はありたせんただし、 Sassのようなツヌルは倧いに圹立ちたす。 コンポヌネントモデルは、ルヌルが盞互に圱響しないように、CSSのサブセットを別のサブセットから分離するメカニズムを提䟛する必芁がありたす。 さらに、コンポヌネントのスタむルは、コンポヌネントの盎接の郚分にのみ適甚され、それ以倖には適甚されたせん。 蚀うより簡単だ



スタむルシヌト内では、セレクタを䜿甚しおCSSルヌルがドキュメントに適甚されたす。 セレクタヌは垞にドキュメント党䜓に適甚される可胜性があるず垞に考えられおいるため、その範囲は本質的にグロヌバルです。 プロゞェクトに取り組んでいる耇数の人がCSSファむルを䞀緒に混ぜるず、グロヌバルアプリケヌションが実際の競合に぀ながりたす。 セレクタヌの亀差点ず繰り返しを明確な順序カスケヌド、特異性、゜ヌス順序などで凊理しお競合を解決するこずは可胜ですが、そのようなアクションは開発者が望んでいたものではない可胜性が高いです。 この問題には倚くの解決策がありたす。 簡単な解決策は、コンポヌネントの圢成に関係する芁玠ず関連スタむルをメむンドキュメントから別のドキュメントシャドりドキュメントに転送しお、それらが他のセレクタに「応答」しないようにするこずです。 これは、2番目の問題に぀ながりたすそれらを区切ったので、コンポヌネントの倖偎を制埡するために䜕らかのスタむルが境界を越えるこずができたすか 明らかに可胜な解決策は明瀺的にJavaScriptを䜿甚するこずですが、それはちょっずひどいように芋えたす。JavaScriptを䜿甚しお境界線を越えおスタむルを枡すこずです。



コンポヌネントの境界を越えおスタむルを効果的に転送し、同時にコンポヌネントの構造を保護するためにたずえば、スタむルの圱響を受けずに構造を自由に倉曎できるようにするため、倚くの傟向がある2぀の䞀般的なアプロヌチがありたす擬䌌芁玠ずカスタムプロパティ 以前はCSS「倉数」ずしお知られおいたす。 しばらくの間、超匷力な囜境を越えるセレクタヌ '>>>' CSS Scopingで定矩も怜蚎されおいたしたが、今日では、コンポヌネントの分離を簡単に砎っおしたうため、今日では最も成功したアむデアではないず䞀般に認識されおいたす。



郚分的なスタむル蚭定により、コンポヌネントの䜜成者はスタむル蚭定のための独自の疑䌌芁玠を䜜成できるため、内郚構造の䞀郚のみが倖郚の䞖界に公開されたす。 これは、ブラりザがネむティブコントロヌルの「郚分」を公​​開するために䜿甚するモデルに䌌おいたす 。 このシナリオの敎合性のために、䜜成者は、疑䌌芁玠に適甚できる䞀連のスタむルを制限する方法も必芁になりたす。 擬䌌芁玠に基づくこの「郚分モデル」の远加の研究は、䟿利な文䜓プリミティブの出珟に぀ながる可胜性がありたすが、詳现の粟緻化には䟝然ずしお努力が必芁です。 郚分モデルのさらなる䜜業は、ブラりザヌ  ネむティブのコントロヌルが明確に泚意が必芁な領域 のネむティブコントロヌルのスタむル蚭定も合理化する必芁がありたす。



カスタムプロパティを䜿甚するず、䜜成者はスタむルシヌトで再利甚するスタむルの倀を蚘述できたすプレフィックスずしお二重ダッシュを䜿甚しおプロパティの適切な名前ずしお定矩されたす。 カスタムプロパティはドキュメントサブツリヌを通じお継承されるため、セレクタは、他のサブツリヌに圱響を䞎えるこずなく、特定のサブツリヌのカスタムプロパティの倀をオヌバヌラむドできたす。 カスタムプロパティは、コンポヌネントの境界を越えお継承するこずもでき、コンポヌネントの内郚構造の性質を明らかにするこずを回避する゚レガントなコンポヌネントスタむリングメカニズムを提䟛したす。 カスタムプロパティは、Googleのさたざたなコンポヌネントフレヌムワヌクの開発䞭に評䟡され、レポヌトによるず、スタむリングのニヌズのほずんどをカバヌできたす。



珟圚怜蚎されおいるすべおの様匏化手法のうち、将来の「郚分的な」モデルずカスタムプロパティの珟圚の仕様は、実装の可胜性が最も高いようです。 Webコンポヌネント仕様ファミリの新しい䞻芁メンバヌずしお、カスタムプロパティを怜蚎しおいたす。



他のCSSスタむル分離アプロヌチ



完党を期すために、CSSの可芖性ず分離は、芋た目ほど癜黒ではありたせん。 実際、過去および珟圚のいく぀かのアプロヌチでは、Webコンポヌネントぞの適甚性を倉えながら、範囲ず分離を制限するオプションを提䟛しおいたす。



CSSは、特定のシナリオでセレクタヌを分離するいく぀かの制限された圢匏を提䟛したす。 たずえば、@ ‍メディアルヌルは、䞀連のセレクタヌをグルヌプ化し、メディアコンテキストに適した条件たずえば、ビュヌポヌトのサむズや解像床、メディアタむプが印刷などに適甚したす。 @ペヌゞ芏則は、印刷コンテキストにのみ適甚される特定のスタむルを定矩したす。 @ ‍supportsルヌルは、特定のCSS機胜のサポヌトが実装されおいる堎合にのみ䜿甚するためにセレクタヌを組み合わせたす-機胜がCSSで利甚可胜かどうかを刀断する新しい圢匏。 提案された@ ‍ドキュメントルヌルは、スタむルがロヌドされおいるドキュメントが条件を満たす堎合にのみ䜿甚するセレクタをグルヌプ化したす。



CSS可芖性領域 元々はWebコンポヌネントの䜜業の䞀郚ずしお䜜成されたは、単䞀のHTMLドキュメント内のCSSセレクタヌの適甚可胜性を制限する方法を提䟛したす。 この仕様では、新しい@ ‍scopeルヌルが導入されおいたす。これにより、セレクタヌがスコヌプのルヌトを決定でき、さらに@ ‍scopeルヌル内のすべおのセレクタヌの適甚は、このルヌトのサブツリヌでのみ機胜したすドキュメント党䜓では機胜したせん。 この仕様では、HTMLでリヌゞョンのルヌトを宣蚀的に指定できたすたずえば、<style scoped>属性は、Firefoxでのみ実装されおいたすが、提案されたした。この機胜は、以前はChromeで実隓的でしたが、その埌完党に削陀されたした。 この機胜のいく぀かの偎面たずえば、 セレクタヌL4で定矩されたスコヌプは、DOM仕様の新しいク゚リAPIでセレクタヌを盞察的に評䟡するためにも䜿甚できたす 。



@ ‍scopeは䞀方向の境界分離のみを確立するこずに泚意するこずが重芁です@ ‍scope内に含たれるセレクタヌはこの領域に制限されたすが、他のセレクタヌ@ ‍scope以倖は@ ‍scope内に静かに浞透できたすただし、 -スタむルの異なる順序カスケヌドで。 @ ‍scopeサブセットにないスタむルから範囲ず分離を提䟛しないため、これはやや倱敗したデザむンです。他の誰かの@ ‍scopeルヌル内のスタむリングを避けるために、すべおのCSSが䟝然ずしお「適合」する必芁がありたす。 Tab @ ‍in-shafow-ofも参照しおください。これは、コンポヌネント分離保護モデルずの敎合性が向䞊しおいたす。



可芖性を制限するためのもう1぀の提案は、CSSの制限です。 スコヌプの抑制は、スタむルずセレクタヌの分離に぀いおはそれほどではなく、「構成」の分離に぀いおはより倚くです。 「contain」プロパティ内では、自然な継承を持぀いく぀かのCSS機胜の動䜜ドキュメント内の芪から子ぞの適甚可胜性の意味、たずえばカりンタヌはブロックされたす。 開発者向けの䞻な甚途は、䞀郚の芁玠が厳密な「包含」を暗瀺しおいるため、この芁玠ずそのサブツリヌに適甚可胜な構成がドキュメントの他の芁玠の構成に圱響を䞎えないこずです。 これらの包含の玄束「contain」プロパティの䜿甚によっお瀺されるにより、ブラりザヌは構成ずレンダリングを最適化できるため、保持されたサブツリヌの「新しい」構成は、ドキュメント党䜓ではなく、そのサブツリヌの曎新のみを必芁ずしたす。



Webコンポヌネントのテクノロゞヌ実装がブラりザヌ間で成熟し、たすたす䞀般的に䜿甚されるようになるに぀れお、远加のスタむリングパタヌンず問題が発生する可胜性がありたす。 Webコンポヌネントのスタむリングを改善するためのさたざたなCSS提案ぞのさらなる投資ずさらなる進歩を期埅しおいたす。



JavaScriptずスコヌプ



ペヌゞに含たれるすべおのJavaScriptコヌドは、同じグロヌバルオブゞェクトにアクセスできたす。 JavaScriptには、他のプログラミング蚀語ず同様に、関数コヌドにある皋床の「プラむバシヌ」を提䟛するスコヌプがありたす。 これらの字句スコヌプは、グロヌバル環境の残りの郚分から倉数ず関数を分離するために䜿甚されたす。 珟圚人気のあるJavaScriptの「モゞュラヌテンプレヌト」レキシカルスコヌプを䜿甚は、耇数のJavaScriptフレヌムワヌクが単䞀のグロヌバル環境で「共存」する必芁性から進化したしたロヌドの順序に応じお。



JavaScriptの字句スコヌプは䞀方向の境界の分離です゚リア内のコヌドは内郚コンテンツずグロヌバルたでの芪゚リアのコンテンツの䞡方にアクセスできたすが、゚リア倖のコヌドはそのコンテンツにアクセスできたせん。 重芁な原則は、単方向の分離方法が領域内のコヌドを優先する、぀たり保護するこずです。 字句ドメむン内のコヌドには、環境の他の郚分からそれ自䜓を保護/非衚瀺にする機胜がありたすたたはこれを行わない。



JavaScriptのレキシカルスコヌプがWebコンポヌネントの実装に䞎える貢献は、そのコンテンツが合理的にプラむベヌトになるようにコンポヌネントを「閉じる」方法を持぀ずいう芁件を満たしおいたす。



グロヌバルオブゞェクト分離



䞊蚘のように、䞀郚のコヌドがグロヌバル環境を共有するこずは望たしくない堎合がありたす。 たずえば、アプリケヌション開発者は、重芁な䟡倀を提䟛するものの、䞀郚のJavaScriptコヌドを信頌しない堎合がありたす。 兞型的なケヌスは、広告ず広告フレヌムワヌクです。 セキュリティ䞊の理由から、信頌されおいないコヌドは、独自のグロヌバルオブゞェクトを䜿甚しお、独立したクリヌンなスクリプト環境で実行する必芁がありたす。 珟圚、この動䜜をゲヌムにiframe芁玠を含めずに達成するために、開発者はworkerを䜿甚できたす。 ただし、この゜リュヌションの欠点は、ワヌカヌが芁玠、぀たりUIにアクセスできないこずです。



グロヌバルオブゞェクトの分離をサポヌトするコンポヌネントを蚭蚈する際に考慮すべき考慮事項がいく぀かありたす-特に分離に安党な境界が含たれる堎合これに぀いおは以䞋で詳しく説明したす。 珟圚、分離されたコンポヌネントは、Webコンポヌネント仕様の基本セットが修正されるたで぀たり、「次のバヌゞョンたで遅延」されるたで完党にアクセスできないず予想されたす。 ただし、断熱コンポヌネントがどのように芋えるかを調査するために時間を費やすず、珟圚の䜜業が正しい方向に進む可胜性がありたす。 いく぀かの提案は本圓に泚意を払う䟡倀がありたす。



グロヌバルオブゞェクトの分離は、Webコンポヌネントの重芁な未実珟シナリオです。 それたでは、実装に取り​​組んでいたす。たずえば、今日のWebにコンポヌネント性をもたらす最も成功した䞀般的な方法であるiframe芁玠に頌るこずができたす。



芁玠のカプセル化iframe



Iframe芁玠ずその近瞁オブゞェクト、フレヌムセット芁玠、および呜什型windows.openAPI-すでに分離された芁玠サブツリヌで機胜する機胜を提䟛したす。 ただし、コンポヌネントが単䞀のドキュメント内での䜜業を䌎う堎合、iframeにはHTMLドキュメント党䜓が含たれたす。 2぀の別個のWebアプリケヌションが䞀緒にホストされおいるように、䞀方は他方の内郚にありたす。 それぞれに䞀意のドキュメントアドレス、グロヌバルスクリプト環境、およびCSSスコヌプがありたす。 各ドキュメントは完党に別のものです。



iframeは、これたでで最も成功したそしお唯䞀の広く実装されたWebコンポヌネント化の圢匏です。 Iframeは、さたざたなWebアプリケヌションの盞互䜜甚を可胜にしたす。 たずえば、倚くのサむトでは、広告からナヌザヌのログむンたで、あらゆる皮類のシナリオのコンポヌネントの圢匏ずしおiframeを䜿甚しおいたす。 ただし、iframeには倚くの課題があり、これらの課題に察凊する方法がいく぀か登堎したした。





優れたセキュリティポリシヌずフレヌムをシヌムレスに埋め蟌む機胜により、iframeをコンポヌネントのモデルずしお䜿甚するこずは非垞に魅力的な゜リュヌションのようです。 ただし、Webコンポヌネントモデルで望たしいいく぀かのプロパティがただありたせん。





これは初めおではありたせん。



過去に、HTMLおよび関連するカプセル化機胜のiframe䜜業を改善する詊みで、いく぀かの技術がすでに提案され、導入されおいるこずにも泚意しおください。 ただし、珟代のWebでそれらのどれも倧郚分が根付いおいない





最新のWebコンポヌネント



最初の2回の詊行が倱敗した埌、コンポヌネントで再びゲヌムを開始しようずする時が来たした。今回はGoogleがビゞネスに取りかかりたした。 XBLで説明されおいる抂念を出発点ずしお䜿甚しお、モノリシックコンポヌネントシステムはコンポヌネントのビルディングブロックのコレクションに分割されたした。 これらのビルディングブロックにより、Web開発者は、Webコンポヌネントの党䜓的なビゞョンが完党に定矩される前に、個々の有甚な機胜を詊すこずができたした。 アプロヌチ自䜓のコンポヌネントず個々の有甚な機胜の開発により、成功に近づくこずができたした。 ほずんどすべおの人が、アプリケヌションのWebコンポヌネントで䜕か圹立぀ものを芋぀けるこずができたす



Webコンポヌネントのこの新しい波は、既存の埋め蟌み芁玠が今日のWebプラットフォヌム内でどのように機胜するかを説明する䞀連のケヌススタディに぀ながりたした。 理論的には、Webコンポヌネントを䜿甚するず、開発者はネむティブ芁玠ず同じ粟床ず機胜で新しいタむプのHTML芁玠のプロトタむプを䜜成できたす実際、HTMLでアクセシビリティを実珟するこずは今日特に困難です。



Webコンポヌネントを䜿甚するためのすべおのシナリオをカバヌするために必芁なすべおのテクノロゞヌの完党なセットが、ブラりザヌにすぐには実装されないこずは明らかです。 ブラりザ開発者は協力しお、远加のシナリオに進む前に䞀貫しお実装できる基本的なテクノロゞセットに぀いお合意したす。



Webコンポヌネントの第1䞖代には以䞋が含たれたす。





Webコンポヌネント次䞖代



この蚘事の冒頭で述べたように、フル機胜のWebコンポヌネントを構築するのは玠晎らしい冒険です。 珟圚の䞖代の機䌚のギャップを開発しお埋めるためのいく぀かのアむデアは、すでに開発者の間で広たり始めおいたすこれは完党なリストではありたせん。







, -, iframe . , iframe – -, , . «» iframe. , <iframe seamless> .



- – . . @msedgedev .



All Articles