Чем строить DOM на C++ или pure JS (без браузера)?
От: Alekzander  
Дата: 16.12.24 14:49
Оценка:
Есть небольшой JS-шаблонизатор для HTML. Он является, так сказать, рантаймовым, т.е. работает на лету у юзера в браузере.

В какой-то момент захотелось сделать дизайн-таймовую версию для встраивания в пайплайн. Оптимально — в виде утилиты командной строки, которую натравливаешь на файлы, а она генерирует другие файлы. Смысл в том, чтобы избежать ненужного дёрганья интерфейса после загрузки. (Для этого ещё используют плейсхолдеры, но я не хочу).

На самом же деле, я хочу позже научить шаблонизатор исполнять ряд фокусов, которые в рантайме просто не сделаешь. (Например, когда нужен доступ к shadow DOM, а он не предусмотрен, как и режим управления этим доступом. Это и iframe, и даже некоторые тонкости при работе с SVG).

Шаблонизация, по сути, это когда в строке находится подстрока, маркированная как шаблон, в ней заменяются фрагменты, маркированные как переменные, и затем результат вставляется вместо подстрок, маркированных как заглушки. Казалось бы, string.replace и дело в шляпе.

Однако мой шаблонизатор работает на селекторах. Что означает, что нужно по исходной строке с HTML воссоздать DOM и отобрать нужный узел по классам/атрибутам/позиции в дереве, а потом уже превратить его в подстроку и уже дальше её обрабатывать. В браузере это делать легко: браузер строит DOM за меня, а мне даёт browser API на JS. А что делать в утилите командной строки?

Можно взять библиотеку на C++. Но какие-то они все старые. У одной из рекомендованных на SO дата последнего коммита — 20 лет назад. То есть, о всяких :has() и :is() можно не мечтать, гы-гы.

Можно взять библиотеку на JS, и запускать код через QuickJS. Одну из них написал Резиг для jQuery. Но с тех пор все перешли на нативную реализацию в querySelector(), и проект, я так понимаю, заглох. Только не надо забывать, что построение DOM, которое умеет браузер, в стандарт EcmaScript не входит.

Можно взять Хромиум (CEF) и встроить в утилиту командной строки. Будет классическое "Две метров грузят текста триста байт". Но вай бы и нот. Тогда хоть можно будет периодически обновлять Хромиум и получать новый синтаксис селекторов.

Можно воспользоваться WebView2. И получить в комплекте зависимость от Windows 11. Хотя сама утилита будет маленькая.

Почему-то мне не нравится ни один из этих вариантов.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.