バニラ JavaScript (フレームワークなし) で実装された HTML5 Web コンポーネント (HTML インポート、シャドウ DOM、テンプレート、およびカスタム HTML 要素) を使用して Web アプリケーションを設計しています。Web アプリケーションはかなりシンプルで、単一ページのアプリケーションとして実装する必要があります。アプリケーションの要件の一部は、ユーザー インターフェイスがカスタマイズ可能であることです。
設計アプローチ
この例では、<application-navigation>
カスタム要素を使用しています。new CustomEvent('application-navigation', {location:'/sign-in'})
この要素は、カスタム イベント (例: ) およびメソッド呼び出し (例: ) を介して、「トップレベル」の JavaScript (JavaScript MV* 用語の「ルーター」など) と通信しますdocument.querySelector('application-navigation').enableSignOut()
。本質的に、カスタム イベントとメソッドは要素の「パブリック API」を形成します。
別の HTML インポートを使用して、カスタマイズさ<application-navigation>
れた要素をアプリケーションに含めることができます。たとえば、<link rel="import" href="default/application-navigation.html"/>
またはを使用し<link rel="import" href="my_cool_theme/application-navigation.html"/>
ます。HTML インポートが同じメソッドを持ち、同じカスタム イベントを生成する限り、どのユーザー インターフェイスのカスタマイズが使用されているかに関係なく、アプリケーションは同じように機能するはずです。
この設計の主な利点は、非常にカスタマイズ可能なユーザー インターフェイスを許可することで要件を満たすことです。内部 JavaScript イベント、CSS、および (シャドウ) DOM 構造は、テンプレート間で完全に異なる場合があります。また、必要に応じて既存のライブラリを再利用することもできます。たとえば、デフォルト<application-navigation>
要素は Twitter Bootstrap のドロップダウン HTML マークアップを使用でき、テーマ バージョンは Foundation ライブラリを使用できます。
ただし、このコンポーネントはあまり一般的ではありません。たとえば、<application-dropdown>
要素とは異なり(ただし、<application-navigation>
要素は(カスタマイズ可能な)<application-dropdown>
要素を利用できます)、かなり特定の目的(ナビゲーション要求を制御する)を果たします。
質問を言い換える
私の質問は、特定の目的、より一般的な目的を満たすためにカスタム要素を作成する必要がありますか、それとも目的の幅は無関係ですか?