posted: 2019/10/14
Web Componentsをgatsbyで使えばmdxいらずである程度色々出来る
Gatsbyのmarkdownで「ちょっとだけ凝ったことがしたい!」というとき、割とよく出てくるものにmdxを使うという選択肢がある。
ただトランスパイラが面倒になったりで色々と嫌なとこがあり嫌な部分がある。
そこでWebComponentsが使えそうだ。
タイマーのサンプルはこんな感じ↓
コードはこんな具合だ。
import { css } from "styled-components"
const container = css`
border: dotted 3px #ccc;
padding: 1em;
`
export class SampleTimer extends HTMLElement {
constructor() {
super()
}
connectedCallback() {
const shadowRoot = this.attachShadow({ mode: "open" })
window.setInterval(() => {
shadowRoot.innerHTML = this.template()
}, 500)
}
template() {
return `<div style="${container}">現在時刻: ${new Date()}</div>`
}
}
あとはdefineすれば使える。ただgatsbyの場合SSRのタイミングで壊れるので
window
のアリナシで判定してrequire
を使う必要がある(dynamic importでも良いかもしれない)if (typeof window !== `undefined`) {
const { StackbritzIframe } = require("./Stackblitz")
const { SampleTimer } = require("./SampleTimer")
customElements.define("stackblitz-iframe", StackbritzIframe)
customElements.define("sample-timer", SampleTimer)
}
Markdown側にこんなふうに書けばOKだ
<sample-timer></sample-timer>