CodeMirrorをモジュールで使用する
こんにちは、フリーランスエンジニアの太田雅昭です。
1万行ほどのデータをtextareaに入れていたのですが、動作が重すぎるためCodeMirrorを使用することにしました。仮想スクロールで動作がサクサクになります。
WordPressのプラグインということもあって、できるだけ他のプラグインと干渉しないように、JavaScriptはmoduleでいきたいです。ただCodeMirrorはCDN経由でのmodule使用はバグがあるようです。
https://gist.github.com/Potherca/028514c75f581db115797ecb50c6f945
上記サイトによると、esm.shで読み込めば問題ないとのこと。そこで、以下のようにしました。フォーム内の全てのテキストエリアをCodeMirrorで置き換え、送信時にはデータをテキストエリアに反映させています。
import { basicSetup, EditorView } from 'https://esm.sh/codemirror@6.0.1'
// フォーム要素を取得
const form = document.getElementById('settings-form');
// すべてのtextarea要素を取得
const textareas = form.querySelectorAll('textarea');
textareas.forEach((textarea, index) => {
// 新しいdiv要素を作成してtextareaの隣に挿入
const div = document.createElement('div');
div.classList.add('editor-container');
textarea.parentNode.insertBefore(div, textarea.nextSibling);
// CodeMirrorインスタンスを作成
const editorView = new EditorView({
doc: textarea.value,
extensions: [basicSetup],
parent: div,
});
// フォーム送信時に隠しinput要素とCodeMirrorの内容を同期
form.addEventListener('submit', () => {
textarea.value = editorView.state.doc.toString();
});
});