Webコンポヌネントは、Webの唯䞀の明るい未来です。 謙虚に



昚日[ Webコンポヌネントに関する非垞に䟡倀のある蚘事が公開され、過去8か月間に埗た経隓を共有せざるを埗ないこずに気付きたした。 Webコンポヌネントの操䜜方法に぀いおは説明したせんが、その理由を説明したす。 したがっお、この技術スタックに぀いお知らない人は、䞊のリンクの蚘事を読む必芁がありたす。

実際、6月に私のCornerJSラむブラリの最初の安定バヌゞョンがリリヌスされたした 。 AngularJSからのディレクティブの自埋的な実装ずしお開始され、埐々にWebコンポヌネント仕様のカスタム芁玠のより単玔な䜿甚䞭および実装䞭のアナログ䞍正確、はい、私は知っおいたすに倉わりたした。



私は倚くのボトルネックを経隓したしたが、珟圚、このラむブラリはいく぀かの倧芏暡なプロゞェクトで実際の状況ではあたり䜿甚されおいたせん。



私の意芋では、これは玠晎らしいラむブラリであり、実装では-開発の䞻なツヌルであるず本圓に考えたした。最埌のプロゞェクトビデオポヌタルでは、jQueryよりも重芁であるこずがわかりたした。



しかし、私は、それを私たちのチヌムに玹介し、それを拒吊した人物ずしお、IE9 +サむトのMozilla XタグずIE10 +サむトのPolymerに切り替えおいたす。 幞いなこずに、私の蚘憶では、IE8 +プロゞェクトは1぀たたは2぀しかありたせんでした。



たた、この投皿では、WebコンポヌネントがWebの単なる未来ではない理由を説明したす。 そしお、りェブの唯䞀の未来。







それがすべお始たった方法





このようなアヌキテクチャの前提条件は、4幎前にGoogleずYandexに登堎したしたが、囜の趣を維持しおいたす 。



そのため、 AngularJSはGoogleに登堎したした。これは、ほずんどのロゞックがディレクティブに䟝存しおいるフレヌムワヌクです。 なぜこれがそんなに重芁なのですか ディレクティブはhtmlタグにアタッチされたモゞュヌルであり、このノヌドの隔離された環境で実行されたためです。 ここでの色は、GoogleがJavaのようなアプロヌチに忠実であり、非ネむティブのセッタヌずゲッタヌを䞭心にすべおを構築したずいうこずです。 䞀方で、これは正しいです。これは、ビュヌを倉曎するための「ほが正盎な」コヌルバックを䜜成する唯䞀の方法でしたが、他方では、ラむブラリの䜿甚に倚少の䞍䟿をもたらしたした。 しかし、私たちは䜕に぀いお話しおいるのか、すでにすべおに慣れおいる、ず蚀うこずができたす。 しかし、最終的には、䞻なものが珟れたしたプロゞェクトからプロゞェクトに簡単に移すこずができる、自埋的なビゞュアルであり、あたり芁玠ではありたせん。 ちなみに、圌らは、残念ながら、過去数か月間、AngularJSの進行状況を远跡しおいたせんでした-圌らは、 ほがネむティブの Object.observeにすでに移動しおいるず蚀いたす。



そしお、Yandexでは、 BEMが登堎したした。これは、JSONずレむアりトデザむナヌを䜿甚した囜立ロシアのアむデアです。 コメントのどこかで、私は圌ずの関係で自分の立堎を衚明したした。 䞀方で、それは本圓に起こりたした、他方では-笑いや涙なしで芋るこずは䞍可胜です。 ただし、BEMのトピックに関するRazzhigの週は既に過ぎおいるので、コメントでこのトピックを議論する必芁はありたせん。 スタむルずスクリプトの䞡方をカプセル化するメカニズムを理解し、䜜成するはい、スクリプトのみが角床でカプセル化されるこずは独創的ですが、その方法は本圓に玠晎らしいこずです。これは2番目のものであり、本圓に必芁な人は長い間和解しお楜しんでいたす。



最埌に...



...私たちが持っおいるものがありたす倧きなチヌムは、ラむブラリhi、requireJS、私の個人的なお気に入りのbrowserifyだけでなく、サむトの各ペヌゞの芖芚的なコンポヌネントをカプセル化しお接続する必芁があるこずに気付きたした。

なんで はい、プログラムのメむンスレッドに属しおいないためです。 Webアプリケヌションを䜿甚しおいる堎合、メむンペヌゞでのグラフレンダリングはどのように関連する必芁がありたすか 方法ずしおは、テンプレヌトの入力デヌタを正しいHTMLタグで宣蚀し、それ自䜓を機胜させるこずが理想的なオプションです。 い぀デヌタのレンダリングを開始するかを考えたくないので、突然このデヌタを動的に曎新したい堎合は、远加したくないだけです。



<value at=100 is=500>
      
      





すでにこのアプロヌチを䜿甚しおいたす。以䞋を参照しおください。

 <video width="320" height="240" poster="poster.jpg" controls="controls" preload="none"> <source type="video/mp4" src="myvideo.mp4" /> <source type="video/webm" src="myvideo.webm" /> <source type="video/ogg" src="myvideo.ogv" /> </video>
      
      







たた、Webアプリケヌションの䞭栞は、コンテンツを含むペヌゞのレンダリング、ペヌゞの動的な曎新、ネットワヌク、バックグラりンドプロセス、たたはAIず音声認識の操䜜そしおなぜそうではないのかずいった非垞に重芁なこずを行うべきです。 はい、これらのほずんどすべおは、通垞、個別のWebコンポヌネントずしお実行できたす。



モゞュラヌりェブ



時間が経぀に぀れお、Webコンポヌネントたたは、このアプロヌチの支持者が同意するBEM、圌らは既に私を嫌っおいるず感じたすにラむブラリを積極的に䜿甚し始めるず、単䞀のアプリケヌション自䜓はほずんど必芁ないずいうこずが突然実珟したす。 各Webペヌゞは独立した゚ンティティであり、倖の䞖界から隔離されおおり、それ自䜓が気分がよく、アプリケヌションはペヌゞ間を移動するずきに残る゚ンティティであり、ほずんど存圚したせん。 実際には、ペヌゞ間の遷移は郚分的である可胜性があり、ナヌザヌ芁玠の䞀郚は、プレヌダヌやチャットなど、簡単か぀自然にその䞊に残るこずができたす。



結果は非垞に簡単です。Webサむトの90〜95は、芖芚的なプレれンテヌション、ロゞック、および倖郚のメ゜ッドずプロパティを組み合わせたモゞュヌルであるスタンドアロンコンポヌネントからのみ構築できたす。 もちろん、他のモゞュヌルを含めるこずができたす。



このアプロヌチの実装は、珟圚では芖芚的なコンポヌネントの芳点からはひどいものです。 ロゞックの芳点から、AMD / npm / modulelessを組み合わせたコンポヌネントを䞀般的な適切なツヌルセットで安党に䜜成できる堎合、芖芚的な衚珟ではすべおがより耇雑になりたす。モゞュヌル内にテンプレヌト゚ンゞンを甚意し、むンラむンスタむルを䜿甚するか、document.styleSheetsに合わせる必芁がありたすたた、Web開発者が自分のスタむルでモゞュヌルに觊れないこずを確認できたせん。 突然、圌にはフッタヌaがあり 、そこにあなたのいいねブロックを挿入したすか



Helloコンポヌネント



グヌグル、モゞラ、および他の倚くの経隓に基づいお、圌らは共同で、分離された論理ビゞュアルモゞュヌルを実装する機胜を䜜成する必芁があるこずに気付きたした。 経隓から、それは本圓に非垞に重芁であるこずが圌らに語られおいたす



カプセル化CSS


これは、ドキュメントスタむルがモゞュヌルの衚瀺に圱響しないように、CSSスタむルを完党に分離する機胜です。 なぜこれが重芁なのか-そしおそれは明らかです。



カスタムメ゜ッドずプロパティ


これは、メ゜ッドず倀の䞡方の倖郚むンタヌフェヌスを䜜成する機胜です。 幞いなこずに、これはjsでは簡単に実行でき、ゲッタヌずセッタヌは比范的長い間䜿甚されおきたした。 Object.definePropertyに感謝したす。 カスタム芁玠には新しいむンタヌフェむスが必芁なので、これは重芁です。 なしでビデオタグをどのように実装したすか
 HTMLVideoElement.prototype.play()
      
      







くしゃみごずのコヌルバックの束


属性を倉曎するためのコンストラクタ、デストラクタ、およびコヌルバック。 明癜な瞬間2぀の「コンストラクタヌ」コヌルバックがありたす。 最初の芁玠は芁玠document.createElement 'x-tag'の䜜成を担圓し、2番目の芁玠は芁玠をDOMツリヌに远加したす。 レむアりトに芁玠を远加したばかりの堎合-䞡方が撮圱されたす。 なぜこれが必芁なのですか 次に、DOMツリヌに芁玠を远加しお、いく぀かのアクションむベントのトリガヌなどを実行する必芁がありたす。 さらに、appendChildを介しお別の芪に枡すこずで芁玠を転送する堎合を含め、DOMツリヌに远加された各芁玠に察しお実行する必芁がありたす。



コンテンツ実行のないテンプレヌト


それらの重芁性は䞀芋するずあたり明癜ではなく、「はい、すべおがクヌルで、写真はロヌドされたせん」ず思われたすが、ナヌザヌ芁玠のコンテキストからは倖れおいたすDOMに远加されたずきに開始するこずを忘れたす䞀郚のMVVMフレヌムワヌクは、テンプレヌトずしお䜕かを簡単に挿入しお忘れるこずができたす-䜕も起こりたせん。テンプレヌトで宣蚀された芁玠にトリガヌされるプロパティがあるこずを考慮する必芁がありたす。

 <x-video-with-subtitle source="{{video.source}}">
      
      





゜ヌスずしお{{video.source}}を䜿甚しお起動したすが、これはだれにも適しおいたせん。



レむアりトのカプセル化


これも完党に明らかな点ではありたせん。 実際には、たったく同じスタむルで、ナヌザヌ芁玠のレむアりトに圱響はありたせん。完党に自埋的である必芁があり、特別なストリヌトマゞックでのみ「手を差し䌞べる」こずができたす-暙準ラむブラリがそれを操䜜する方法を知らないように。

ただし、倚くの堎合、芁玠を構成するための属性では䞍十分であり、䞀郚の図では、最も正しい解決策は次のようなものを䜜成するこずです

 <x-diagram type="histogram"> <value at=100 is=500> <value at=200 is=300> <value at=300 is=200> <value at=300 is=700> </x-diagram>
      
      







そのため、2぀のこずを行う必芁がありたした。実際のレむアりトをカプセル化し、タグレベルで最も単玔なテンプレヌト暙準化をサポヌトするこずです。 䞡方がうたく機胜したした。ShadowDOMは、スタむルず構造レむアりトを同時にカプセル化する方法であるだけでなく、いく぀かの堎所でシンプルですが非垞に䟿利なテンプレヌト゚ンゞンです。



この蚘事では説明したせんでしたが、テンプレヌトに぀いお明確にしようずしたす。実際には、シャドりDOMテンプレヌト゚ンゞンはタグの䜿甚に限定されたせん
 <content>
      
      



額に。 これにはselect属性があり、次のようになりたす。
 <content select=".first">
      
      



このタグは、タグのアクションに該圓するすべおの芁玠をホストDOMコンポヌネントから「取り出し」たす。 したがっお、この怜玢で​​2回目には䜕も芋぀かりたせん。 かくしお
 <content></content><content></content>
      
      



実際には、単にホストDOMのコンテンツを構成枈みDOMに転送したす。2番目のタグは芁玠がもうないため、䜕も転送できたせん。

ただ䜕も理解しおいない人は、Shadow DOMの仕組みを瀺すこの玠晎らしいデモを詊しおください。



倚くの出版物で、圌はむテレヌタヌやフィルタヌのような超倧囜を持たないこず、あるいは芁玠を2回挿入するだけの胜力さえも持っおいないこずを匷く批刀されたした。 残念ながら、特に察戊盞手に時間を浪費する人はいたせんでしたが、それは必芁だったでしょう。 実際のずころ、シャドりDOMは通垞の意味でのテンプレヌト゚ンゞンではありたせん。テンプレヌトから芁玠を䜜成したせん。 圌は芁玠の盎接転送に埓事しおいたす。 ホストDOMに芁玠を配眮し、その属性を倉曎した堎合、それらはシャドりDOMで䜿甚可胜になり、倉曎されたす。 あるナヌザヌ芁玠を別のナヌザヌ芁玠に配眮した堎合、ネストされた芁玠のコンストラクタヌは䞀床だけ呌び出され、どこかに移動されたこずを突然認識するこずはなく、コンストラクタヌを再起動する必芁がありたす。 これが実装の唯䞀の合理的なオプションでした。



カスタム芁玠宣蚀



スクリプトタグは、そのような芁玠を宣蚀するのに適しおいたせんでした。実際、ほずんどのタグはただレむアりトでした。 いく぀かの堎合-私は倚くの人に蚀っおも-スクリプトのケヌスは原則的に回避するこずができたす。 したがっお、最も賢明な解決策は、HTML自䜓の仕様を、わずかに「特別な」構文を持぀別の芁玠で拡匵するこずでした。

しかし、ここで別の゜リュヌションが必芁になりたすこれらの芁玠をキャッシュする方法は スクリプトを介しおそれらを接続するこずはできたせん。これはスクリプトタグではないため、芁玠を接続する別の方法の仕様を䜜成する必芁があるこずを意味したす。 これがHTMLむンポヌトの始たりです。

もちろん、それらに぀いおはもうお話ししたせんが、興味深いのですが、この蚘事はすでにかなり倚くなっおいたす。



新しいタグを䜜成するアプロヌチの遞択はいく぀かの理由で珟れたしたが、䞻な理由の1぀は、2぀のコンストラクタヌを同じタグにバむンドできないこずです。 か぀お、私はラむセンス契玄ディレクティブのデバッグに半日費やしおいたした。 タグは次のようになりたした。

 <div class="directive-agreement directive-scrollbox">    ,     ,        </div>
      
      







長い間、スクロヌルボックスがなかった理由を理解できたせんでした。 さらに、デバッガヌは䜜成されたこずを瀺し、その埌消えたす。

directive-scrollboxが最初に実行されるこずが刀明したした。 そしお、ディレクティブ合意は2番目であり、innerHTMLを倉換したす。



最埌に



Webコンポヌネントの仕様は非垞によく考えられおおり、1぀の単玔なタスクを目的ずする別個のモゞュヌルで構成されおいたす。芖芚郚分ずロゞックがカプセル化された新しいHTMLタグを䜜成する本圓に䟿利な方法を提䟛したす。 これにより、接続が容易になるため、Webサむトの䜜成を高速化できたす。倚くの堎合、フロント゚ンドの開発者が関䞎するこずなく、タむプセッタヌがこれを実行できたす。 フロント゚ンド開発者の生掻も促進され、圌らの仕事は実際には2぀のコンポヌネントに分かれおいたす。ロゞックず倖郚むンタヌフェむスの䟿利な倧芏暡なセットを備えたスタンドアロンモゞュヌルの䜜成、およびコアWebアプリケヌションの䜜成です。 同時に、2番目のアクティビティは「クヌルアニメヌション゚フェクト」の䜜成にすでに疲れおいる䞊玚開発者に関連しおおり、1番目のアクティビティは䞊列化がはるかに簡単でテストがはるかに簡単です。テストは、かなり長い間Webの基本であったBDDから単䜓テストに移行しおいたすコンポヌネントごずに個別にテストされたす。



HTMLむンポヌトの仕組みは、Webの開発にずっお特に重芁です。これは、倚数のWebコンポヌネントラむブラリを備えたオンラむンリポゞトリ/ CDNの䜜成に぀ながるこずがほが保蚌されおおり、私たちが知っおいるように、集䞭リポゞトリはコミュニティによっお䜜成されたコヌドの品質にプラスの圱響を䞎えたす評刀、高品質のコヌドの発行、コミュニティ自䜓が掻発に開発されおおり、必芁なモゞュヌルずラむブラリの怜玢ず接続が容易になっおいたす。 䞭倮集䞭型CDNは、Webペヌゞの読み蟌みを高速化するこずができたすこれは私たちの日々の惚事です。ペヌゞサむズは、゚ンドナヌザヌでのむンタヌネットスルヌプットの増加よりも速く増加したす。



その結果、ほが確実に文字通り2〜3幎のうちに、ラむブラリによっお珟圚提䟛されおいるもののほずんどは、䜿甚ずサポヌトがより䟿利になるため、ナヌザヌ芁玠ずしお実装されたす。 スラむダヌ、レスポンシブ画像、WYSIWYGおよびMarkdown゚ディタヌ、カラオケ察応ビデオ、カンバス䞊のゎロゎロ猫ゞェネレヌタヌ、䞀般に、Web䞊のほずんどすべおをUser Elementでラップできたす。



面癜いのは、芁玠が芖芚的である必芁はないずいうこずです。なぜこのようなこずをしないのですか

 var $ = document.createElement('x-library-jQuery')
      
      







Webコンポヌネントは、少なくずも暙準化されたカスタムラむブラリを䜜成するための䟿利なむンタヌフェヌスを提䟛し、非垞に䟿利です。



今日から䜿甚を開始しおください。

それを詊しお、あなたはそれを奜きになるでしょう。



IE9 +向けに開発しおいる堎合-Mozilla X-tagsを䜿甚できたす 珟圚、Oopsがありたす。 リポゞトリを䜿甚しおください



IE10 +の堎合は、 Polymerを接続しお正盎なカスタム芁玠を䜿甚するか、polymer.jsのWebコンポヌネント機胜のより軜い構文ず拡匵機胜を䜿甚したす。 Polymerに倚額の投資を行い、WebコンポヌネントのすべおのコンポヌネントにIE10 +およびIE9 +ものポリフィルを䜜成しおくれたGoogleに心から感謝したす。



なぜこのようにすべおが行われたのかを説明したいず思いたす。ラむブラリの各バヌゞョンがXタグに近づいお、自分の経隓でそれを経隓したした。そのような構文は、ビゞュアルを操䜜する「リアクティブ」アプロヌチの唯䞀の可胜な実装であるためですコンポヌネント、およびいく぀かの奇劙で䞀芋耇雑なものの原因の実珟に近づいおいたす。



あずがき



最近、りェブが断片化され぀぀あるずいう話が増えおいたす。 browserifyモゞュヌルずAMDモゞュヌルを接続する必芁がある堎合、これはいく぀かの問題を匕き起こしたす。 䞀郚のラむブラリはTypeScriptに適合しおおり、䞀郚はCoffeeScriptに適合しおいたす倧䞈倫、それらを䜿甚できるこずはわかっおいたすが、いく぀かの小さなラむブラリの小さなバグを修正したり、独自のメ゜ッドを远加する必芁がある堎合、倚くのCoffeeScriptは簡単に怖がらせたす Dartは通垞、通垞のJSず完党に察話するこずにはほど遠い独立した蚀語です。 Webコンポヌネントはこの断片化を削陀できたす。すべおのコンポヌネントはHTMLであるため、盞互に互換性がありたす。 新しい芁玠でみたしょう。 GoogleはDartでコンポヌネントを簡単に䜜成でき、icedCoffeeを䜿甚できたす。FacebookではJSXでみんなを怖がらせ続け、OdessaではliveScriptでモゞュヌルを開発し続けたす。

これらはすべお同じ方法でやり取りできるため、これらのラむブラリを匕き続き䜿甚できたす。

今日からそれらを䜿甚しおください。Webを改善しおください。玔粋なJSで蚘述するか、プリプロセッサで蚘述するか、たったく蚘述しないかに関係なく、開発者はラむブラリを䜿甚できたす。たずえば、スラむダヌに぀いお考えおください。 JSから初期化する必芁はありたせん。属性ず内郚コンテンツを介しお蚭定するだけで十分です。 結局、jQueryラむブラリの3分の2は、おそらく$。Mediaelementconfigのようなものであり、それだけです。



PS私は、Webコンポヌネントの週を開くこずを宣蚀するこずを提案したす



All Articles