Я разрабатываю веб-приложение, используя веб-компоненты HTML5 (импорт HTML, теневой DOM, шаблоны и пользовательские элементы HTML), реализованные с помощью ванильного JavaScript (без фреймворка). Веб-приложение достаточно простое и должно быть реализовано как одностраничное приложение. Частью требований приложения является настраиваемость пользовательского интерфейса.
Дизайн-подход
В примере используется пользовательский элемент <application-navigation>
. Этот элемент взаимодействует с JavaScript «верхнего уровня» (например, «маршрутизатор» на языке JavaScript MV *) через пользовательские события (например, new CustomEvent('application-navigation', {location:'/sign-in'})
) и вызовы методов (например, document.querySelector('application-navigation').enableSignOut()
). По сути, пользовательские события и методы образуют «общедоступный API» элемента.
Настроенный элемент <application-navigation>
может быть включен в приложение с помощью другого импорта HTML. Например, используя <link rel="import" href="default/application-navigation.html"/>
или <link rel="import" href="my_cool_theme/application-navigation.html"/>
. Пока HTML-импорт имеет одни и те же методы и производит одни и те же настраиваемые события, приложение должно работать одинаково независимо от того, какая настройка пользовательского интерфейса используется.
Основное преимущество этого дизайна заключается в том, что он отвечает требованиям, позволяя настраивать пользовательский интерфейс - внутренние события JavaScript, CSS и (теневая) структура DOM могут быть разными в разных шаблонах. Это также позволяет повторно использовать существующие библиотеки, если и где это необходимо. Например, элемент <application-navigation>
по умолчанию может использовать раскрывающуюся разметку HTML из Twitter Bootstrap, а тематическая версия может использовать библиотеку Foundation.
Однако этот компонент не является универсальным. Он выполняет довольно конкретную цель (управление запросами навигации), в отличие, например, от элемента <application-dropdown>
(хотя элемент <application-navigation>
может использовать (настраиваемый) элемент <application-dropdown>
).
Повторение вопроса
У меня вопрос: следует ли создавать настраиваемые элементы для выполнения конкретной цели, более общей цели или широта цели не имеет значения?