2017.11.15 html_modules_study @1000ch
#超速本
が発売されます📕<link rel="modulepreload">
※2017年11月現在、実験的な・議論中の内容です
カスタム要素で /
の省略やセルフクロージングをできるようにする
<!-- まぁわかる -->
<fancy-button>fancy button</fancy-button>
<!-- だがてめーは(ry -->
<fancy-input></fancy-input>
<!-- できればこう書きたい -->
<fancy-input>
<!-- あるいはこう書きたい -->
<fancy-input>
/
の省略やセルフクロージングの意義<input>
や <img>
のように独立して意味を成すカスタム要素があるかもしれない
<the-most-important-element><the-most-important-element>
は <the-most-important-element>
と書けても良さそう
assignedElements()
<slot>
要素に挿入された要素を参照する
<fancy-button>
<the-icon></the-icon>
Fancy Button
</fancy-button>
<the-icon>
と Fancy Button
が <fancy-button>
のデフォルトスロットに挿入される
HTMLSlotElement#assignedNodes()
は?const button = document.querySelector('fancy-button');
const slot = button.shadowRoot.querySelector('slot');
// 要素だけでなくテキストノードも返る
console.log(slot.assignedNodes());
HTMLElement
だけ取得したい === assignedElements()
HTMLSlotElement.prototype.assignedElements = function() {
const nodes = this.assignedNodes();
const elements = nodes.filter(function (node) {
return node.nodeType === Node.ELEMENT_NODE;
});
return elements;
};
Shadow DOM 内の要素に任意の疑似セレクタを定義できるようにする
<date-range-selector>
<!-- #shadow-root -->
<input pseudo="start-date" type="date">
<input pseudo="end-date" type="date">
<!-- /shadow-root -->
</date-range-selector>
<style>
date-range-selector::start-date,
date-range-selector::end-date {
color: red;
}
</style>
パーサーの振る舞いと相性が若干悪そうで、旗色が悪い?
Shadow Host を ::part()
や ::theme()
で参照する CSS セレクタ。/deep/
やら ::shadow
の登場によって削除された仕様だが、Custom Psuedo-elements によって復活?
<date-range-selector>
<!-- #shadow-root -->
<input part="start-date" type="date">
<input part="end-date" type="date">
<!-- /shadow-root -->
</date-range-selector>
<style>
date-range-selector::part(start-date),
date-range-selector::part(end-date) {
color: red;
}
</style>
ES Modules を拡張して HTML ファイルをロードできるようにする
<!-- bar.html -->
<template>
<div>Display!</div>
</template>
<!-- app.js -->
<script type="module">
import bar from './bar.html';
const template = bar.querySelector('template');
</script>
import/export
で HTML をロードしていいのか
as
によるキャスト前提なら大きな違和感はない<script type="module" src=".html"></script>
で HTML パーサー上のみで動いたほうがしっくり来る
template
要素に mustache の文法を取り込んで、テンプレートとしての機能を拡充する
<template id="tmpl">
<h1>{{name}}</h1>
<a href="mailto:{{email}}">{{email}}</a>
</template>
<script>
document.querySelector('#tmpl').createInstance({
name: 'Shogo Sensui',
email: 'shogosensui@gmail.com'
}).update({
name: '1000ch',
email: 'shogosensui+1000ch@gmail.com'
});
</script>
<template type="tmpl-type">
<h1>{{name}}</h1>
</template>
<script>
document.defineTemplateType('tmpl-type', {
processCallback: (instance, parts, state) => {
for (const part of parts) {
part.value = state[part.expression];
}
}
});
</script>
<link rel="modulepreload">
ES Modules な JavaScript ファイルを先読みする
rel="modulepreload"
の使い方<link rel="modulepreload" href="app.js">
<link rel="modulepreload" href="helpers.js">
<link rel="modulepreload" href="irc.js">
<link rel="modulepreload" href="fog-machine.js">
<script type="module" src="app.js"></script>
rel="preload"
と as="module"
はダメ?script
要素の credential と一致している必要がある<link rel="preload">
は単一リソースをロードする仕様