Пару недель назад я писал, что у библиотеки появился второй читатель — языковая модель. Тогда я думал, что главная задача — научить LLM правильно её готовить. Но потом решил, что не менее полезно послушать, что LLM думает о самой библиотеке.
Я скормил llms.txt другой модели и попросил разобрать: чего не хватает «идеальному фреймворку для тех, кому React — оверхед». Часть идей взял на заметку. Примерно тогда же я доводил до конца PR с Micra в js-framework-benchmark — один из самых авторитетных бенчей JS-фреймворков, где рядом React, Vue, Svelte, Solid и другие. При ревью этого PR его автор указал на проблему, которая пересеклась с одним из пунктов от модели.
Первое — выражения падали под строгим CSP. Всё, что сложнее «простого пути», Micra компилировала через new Function, а это требует unsafe-eval в default-src 'self'. В самом начале я не стал решать эту проблему, но для server-rendered стека она критична — именно на этот пробел и указал автор бенчмарка.
Пришлось выкинуть new Function целиком и написать свой парсер выражений — токенайзер, Pratt-парсер, интерпретатор, — чтобы полностью исключить eval. Теперь Micra работает под строгим CSP из коробки. Бонусом security-модель стала строже: глобалы вроде window недостижимы, потому что в области видимости их просто нет. Сборка теперь падает, если eval случайно вернётся. Доработанный PR смержили 14 июня — теперь Micra в js-framework-benchmark, рядом с React, Vue, Svelte, Solid и остальными.
Второе — реактивность. Изначально она была плоской: state.user.name = 'x' не работал, и приходилось пересобирать весь объект руками. Глубокий Proxy я тащить не стал — хотел сохранить размер библиотеки минимальным (и заодно бóльшую предсказуемость). Вместо этого добавил эргономичный путь: this.set('user.name', x) и data-model="filters.search" сами пересобирают вложенный объект. Shallow-модель внутри осталась.
Третье — мелочь, которую я раньше документировал, а не чинил. @keydown.enter не работал, и я честно писал в каждом гайде «проверяй e.key вручную». А Enter в форме и Escape в модалке — топ-2 паттерна интерфейсов. Теперь модификаторы есть: @keydown.enter, @keydown.escape, @click.ctrl — и комбинируются.
Ещё data-html получил опциональный санитайзер в одну строку:
Micra.config({ sanitize: DOMPurify.sanitize })
Размер вырос с ~5 до ~7 KB. Как бы ни хотелось сохранить размер, строгий CSP и удобный path-API кажутся важнее, чем полный минимализм. Так что сделка выгодная.