Я только начал изучать пользовательские элементы HTML, и, прочитав серию интро, учебники и документацию, я думаю, что у меня есть хорошая инструкция о том, как это работает, но у меня есть философский вопрос о том, как правильно использовать или не использовать <template>
.
Пользовательские элементы дают возможность инкапсулировать новые функции, упрощая структуру вашего HTML-документа и позволяя просто вставить <my-custom-element>...</my-custom-element>
вместо <div class="my-custom-element"><span class="part1">...</span><span class="part2">...</span></div>
.
Затем определение класса для элемента устанавливает структуру и функциональность этого элемента. Затем в кучу учебников описывается, как использовать <template>...</template>
и <slot>...</slot>
чтобы настроить содержимое настраиваемого элемента. Затем вам следует включить код шаблона в каждый HTML-документ, в котором вы хотите использовать элемент, а не его настройку в конструкторе класса пользовательского элемента. Разве это не противоречит тому факту, что пользовательские элементы упрощают и инкапсулируют функциональность таким образом, чтобы сделать их более переносимыми? Или я не понимаю правильное использование и/или размещение шаблона в документе?
Глядя через SO, ближайший я могу найти для решения этого вопроса:
Как отменить шаблон в автономных пользовательских элементах с ванильным js?
Но ответ, по сути, обходит все это вместе и говорит: "Не используйте <template>
", и поэтому на самом деле не проясняет мое замешательство.
Фактически элементы <template>
могут быть импортированы из другого документа с помощью импорта HTML вместе с кодом Javascript, который определит пользовательский элемент:
<link rel="import" src="my-custom-element.html">
...
<custom-element></custom-element>
Поэтому его не нужно включать в каждый HTML-документ. Этот пост показывает минимальный пример.
Импорт HTML реализован только в Chrome и Opera. Если вы хотите использовать их вместе с Firefox и Safari, вам нужно использовать полифилл HTML Imports.
С другой стороны, на данный момент Mozilla и Apple не намерены реализовывать HTML-импорт непосредственно в своих браузерах. Поэтому они рекомендуют определять пользовательские элементы с чистыми модулями Javascript (с помощью import
или <script src="...">
) и вместо этого продвигать строки литералов шаблона, которые предлагают некоторые преимущества (переменные, функции), но иногда более сложны для код в IDE (из-за их строкового представления).
Возможно, в будущем стандартные HTML-модули будут приняты всеми браузерами, и <template>
вернется в центр внимания...
Обратите внимание, что без HTML-импорта вы можете импортировать некоторые HTML-документы с помощью fetch()
:
fetch( "template.html" )
.then( stream => stream.text() )
.then( text =>
customElements.define( "c-e", class extends HTMLElement {
constructor() {
super()
this.attachShadow( { mode: 'open'} )
.innerHTML = text
}
} )
)
Обновление 2019
HTML-импорт не будет изначально поддерживаться после Chrome 73. Затем вы должны использовать другие решения, перечисленные выше (polyfill, загрузчик альтернативных модулей, import
JS или прямая загрузка с fetch
).