我正在使用用 vanilla 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>
元素)。
重述问题
我的问题是,是否应该创建自定义元素来实现特定目的、更通用的目的,或者目的的广度是否无关紧要?