«VS Code слишком тяжёлый. Сделаю свой редактор!»
— примерно так начался эксперимент одного разработчика.
🔘 Первый вариант — всё рисовать через <canvas>. Курсор, текст, подсветка строки, ввод с клавиатуры — работает. Но почти всё приходится реализовывать самостоятельно:
canvas.addEventListener("pointerdown", positionCursor);
document.addEventListener("keydown", moveCursor);
И быстро выясняется проблема: canvas ничего не знает о тексте. Нет нормального выделения, undo/redo, скроллинга и доступности.
🔘 Тогда появляется идея использовать contenteditable:
<div
contenteditable="plaintext-only"
autocapitalize="off"
autocorrect="off"
spellcheck="false"
translate="no">
</div>
Браузер сразу берёт на себя выделение текста, историю изменений и часть accessibility. Но на больших текстах производительность становится непредсказуемой.
🔘 Поэтому следующий кандидат — обычный <textarea>:
<textarea
autocapitalize="off"
autocorrect="off"
spellcheck="false">
</textarea>
И неожиданно он оказывается лучшим вариантом для длинных файлов. Правда, синтаксическую подсветку приходится строить отдельным слоем поверх текста.
📍 А потом начинается самое интересное: Unicode.
"🍋🟩".length;
// 5
[..."🍋🟩"].length;
// 3
const segmenter = new Intl.Segmenter("en", {
granularity: "grapheme"
});
[...segmenter.segment("🍋🟩")].length;
// 1
Один визуальный символ может состоять из нескольких UTF-16 code units и нескольких Unicode code points.
В итоге автор получил редактор, который выглядит примерно на 90% готовым, но имеет лишь 1% возможностей настоящего редактора.
И именно оставшиеся 10% — выделение, виртуализация, подсветка, табуляция, скроллинг, Unicode и accessibility — превращают «простой текстовый редактор» в огромный проект.
📍 Навигация: [Вакансии]
🐸 Библиотека фронтендера
#under_hood