React フレンドリー。ノードモデルを自分で設計しやすい。
柔軟だけど、IME / selection / normalize の設計力が必要。
拡張エコシステムが強い。実戦投入しやすい。
ドキュメントモデルと plugin 理解の学習コストは高め。
Meta 製。更新モデルとパフォーマンス設計がモダン。
API の作法に乗ると強い。内部設計の理解が効く。
複雑なことをやろうとすると大変
今ならAIでゴリ押しできそうではある
入力と描画が密結合なのがしんどい。
「入力はネイティブ」「描画は自前」に分けたい。
contenteditable のつらみの解消を狙う API
const ec = new EditContext()
element.editContext = ec
textupdate
ポイント: DOM を直接編集させずに、イベント駆動で状態を更新する。
EditContext = エディタそのものではないあくまで「入力コンテキスト」を渡してくれる API。
ec.text
ec.selectionStart
ec.selectionEnd
ec.characterBoundsRangeStart
compositionstart
compositionend
textformatupdate
characterboundsupdate
「入力イベントを受ける層」と「描画する層」を分離する。
React state / internal model / render の責務が整理しやすい。
contenteditable
editor.editContext
「見た目は完全に自前」でも、IME の候補位置・入力は OS と連携できるのが面白い。
div[role=textbox] に editContext を付与し、React 側でテキスト・選択・装飾・キャレットを描画。
div[role=textbox]
editContext
updateSelection(...)
Range
updateControlBounds
updateSelectionBounds
updateCharacterBounds
「入力をネイティブに任せつつ、表示は自前にできる」 を体感してもらう。
その代わり、selection/caret/IME座標の同期責務は増える。
selectionBounds
エディタ実装力そのもの
contenteditable の苦労がゼロになるわけではなく、責務の置き場所が変わる。ただ、今はAIがあるのでゴリ押しできそう
みんなも自作エディタを作ろう!