CDATA в RSS кажется удобным, пока вы не столкнётесь с
В RSS и Atom CDATA берут, чтобы не экранировать HTML и спецсимволы вручную. Проблема в том, что последовательность
При этом CDATA не делает содержимое «безопаснее» — XML-парсер выдаёт точно такой же текст, как при обычном экранировании. Вывод получается разнородным: где-то один блок, где-то несколько склеенных. А отладка превращается в головоломку, если контент сам оказывается про CDATA.
Проще сразу сериализовать XML корректно и избавиться от лишнего edge case в коде генерации фида.
]]> внутри контентаВ RSS и Atom CDATA берут, чтобы не экранировать HTML и спецсимволы вручную. Проблема в том, что последовательность
]]>, закрывающая блок, не может быть экранирована внутри него. Приходится разбивать CDATA на куски, что сразу ломает всю простоту подхода.При этом CDATA не делает содержимое «безопаснее» — XML-парсер выдаёт точно такой же текст, как при обычном экранировании. Вывод получается разнородным: где-то один блок, где-то несколько склеенных. А отладка превращается в головоломку, если контент сам оказывается про CDATA.
Проще сразу сериализовать XML корректно и избавиться от лишнего edge case в коде генерации фида.
❤3
Chrome пробует частичные обновления прямо в HTML
HTML снова пытается стать самостоятельнее. В Chrome тестируют Declarative Partial Updates:
Практический смысл простой: часть того, что сейчас делается через JS-слой или фреймворк, можно будет отдавать как поток HTML и подставлять по готовности. Для островной архитектуры, тяжёлых блоков и SPA-обновлений это очень интересный сигнал.
Пока это эксперимент: Chrome 148 с флагом, есть polyfill, ограничения тоже есть.
HTML снова пытается стать самостоятельнее. В Chrome тестируют Declarative Partial Updates:
template for может заменить заранее оставленный маркер в документе, а новые streaming-методы — дописывать HTML в уже существующий узел.Практический смысл простой: часть того, что сейчас делается через JS-слой или фреймворк, можно будет отдавать как поток HTML и подставлять по готовности. Для островной архитектуры, тяжёлых блоков и SPA-обновлений это очень интересный сигнал.
Пока это эксперимент: Chrome 148 с флагом, есть polyfill, ограничения тоже есть.
👍14🔥6🤔2🗿1
MDN показали, как разгрузили фронтенд после редизайна
Не знаю, обратили ли вы внимание, но у MDN изменился не только дизайн. Интереснее то, что случилось под капотом: команда рассказала, как Markdown превращается в HTML и JSON, компоненты рендерятся на сервере, а на клиент уезжает только тот JS/CSS, который нужен конкретной странице.
Ставка на Web Components и Declarative Shadow DOM здесь понятна: документация быстрее грузится и не тащит лишний runtime.
Рекомендую почитать всем, кто делает большие контентные сайты. Можно взять из их опыта пару решений или собрать себе чеклист для следующего рефакторинга.
Не знаю, обратили ли вы внимание, но у MDN изменился не только дизайн. Интереснее то, что случилось под капотом: команда рассказала, как Markdown превращается в HTML и JSON, компоненты рендерятся на сервере, а на клиент уезжает только тот JS/CSS, который нужен конкретной странице.
Ставка на Web Components и Declarative Shadow DOM здесь понятна: документация быстрее грузится и не тащит лишний runtime.
Рекомендую почитать всем, кто делает большие контентные сайты. Можно взять из их опыта пару решений или собрать себе чеклист для следующего рефакторинга.
🔥8
DOM и canvas наконец-то пытаются подружить
Canvas хорош, пока вам нужна только графика. Как только появляются кнопки, формы, выделение текста, accessibility и нормальное поведение браузера, начинается второй фронтенд поверх первого. Все, кто делал редакторы, 3D-интерфейсы или игры в браузере, понимают боль.
HTML-in-Canvas API предлагает интересный компромисс: DOM-элементы можно рисовать в 2D canvas или WebGL/WebGPU texture, но сохранять интерактивность и браузерные возможности. То есть UI остаётся HTML, а жить может внутри canvas-сцены.
Пока это origin trial так что в прод не несём. Но идею я бы сохранил: если взлетит, часть canvas-костылей станет не нужна.
Canvas хорош, пока вам нужна только графика. Как только появляются кнопки, формы, выделение текста, accessibility и нормальное поведение браузера, начинается второй фронтенд поверх первого. Все, кто делал редакторы, 3D-интерфейсы или игры в браузере, понимают боль.
HTML-in-Canvas API предлагает интересный компромисс: DOM-элементы можно рисовать в 2D canvas или WebGL/WebGPU texture, но сохранять интерактивность и браузерные возможности. То есть UI остаётся HTML, а жить может внутри canvas-сцены.
Пока это origin trial так что в прод не несём. Но идею я бы сохранил: если взлетит, часть canvas-костылей станет не нужна.
❤6🤔4
Oxlint — линтер на Rust, который в 50–100 раз быстрее ESLint и работает сразу после установки
Если проверка кода в вашем проекте растягивается на минуты, я бы присмотрелся к Oxlint. Это рабочий инструмент из экосистемы Oxc от VoidZero: 107 правил из коробки, конфигурировать ничего не нужно.
В репозитории Vue Core Oxlint справляется за 1,3 секунды против 133,8 у ESLint с typescript-eslint: почти в сотню раз быстрее. Для React Router: 435 мс против 29,5 с. Проверка с учётом типов при этом не требует полного прогона компилятора tsc.
Поддержка ESLint-плагинов пока экспериментальная, так что если проект завязан на редкие кастомные правила, я бы запустил оба линтера параллельно и мигрировал постепенно. Когда миграция оправдана, читайте в материале.
Если проверка кода в вашем проекте растягивается на минуты, я бы присмотрелся к Oxlint. Это рабочий инструмент из экосистемы Oxc от VoidZero: 107 правил из коробки, конфигурировать ничего не нужно.
В репозитории Vue Core Oxlint справляется за 1,3 секунды против 133,8 у ESLint с typescript-eslint: почти в сотню раз быстрее. Для React Router: 435 мс против 29,5 с. Проверка с учётом типов при этом не требует полного прогона компилятора tsc.
Поддержка ESLint-плагинов пока экспериментальная, так что если проект завязан на редкие кастомные правила, я бы запустил оба линтера параллельно и мигрировал постепенно. Когда миграция оправдана, читайте в материале.
❤4🔥3👍1
TypeScript иногда выбирает тип, который кажется нелогичным. Вот почему
В TypeScript дженерики обычно работают интуитивно, пока внезапно не выдают
Если пишете типизированные библиотеки или просто хотите понять, почему компилятор ведёт себя именно так, я бы сохранил на тот случай, когда очередной неожиданный вывод типов застанет врасплох и придётся объяснять команде, почему ваш код компилируется совсем не так, как вы предполагали.
В TypeScript дженерики обычно работают интуитивно, пока внезапно не выдают
unknown вместо ожидаемого пересечения или сворачивают объединение обобщённых типов не туда. Автор разбирает механику, которая стоит за этими сюрпризами: как компилятор выбирает кандидатов для типовых переменных, почему один аргумент может доминировать над другим и когда inference ломает интуицию.Если пишете типизированные библиотеки или просто хотите понять, почему компилятор ведёт себя именно так, я бы сохранил на тот случай, когда очередной неожиданный вывод типов застанет врасплох и придётся объяснять команде, почему ваш код компилируется совсем не так, как вы предполагали.
❤5
Forwarded from Типичный программист
Форма регистрации начинается не с полей и кнопки
Можно собрать красивую онлайн-регистрацию на тысячу человек, привязать базу, письма и сверку сотрудников. А потом HR пришлёт регламент и спросит: где лежат персональные данные, кто имеет доступ, что с HTTPS, ФЗ-152 и планом на случай утечки.
Вот тут внезапно оказывается, что главная сложность не в форме. Код работает, письма уходят, но проект всё равно может упереться в ответственность и процессы: лишний аккаунт в базе, серверы не там, согласие пользователя забыли.
В свежем разборе на Tproger это превращается в чеклист вопросов, которые лучше задать себе до того, как первый гость оставит телефон и почту.
Можно собрать красивую онлайн-регистрацию на тысячу человек, привязать базу, письма и сверку сотрудников. А потом HR пришлёт регламент и спросит: где лежат персональные данные, кто имеет доступ, что с HTTPS, ФЗ-152 и планом на случай утечки.
Вот тут внезапно оказывается, что главная сложность не в форме. Код работает, письма уходят, но проект всё равно может упереться в ответственность и процессы: лишний аккаунт в базе, серверы не там, согласие пользователя забыли.
В свежем разборе на Tproger это превращается в чеклист вопросов, которые лучше задать себе до того, как первый гость оставит телефон и почту.
💩5🔥2
@counter-style: CSS-генератор текста, который многие игнорируют
Я бы сохранил этот трюк: at-rule
Практический сценарий: замаскировать текст символьной лапшой прямо в CSS. Или собрать ротатор слов, где счётчик сам подбирает вариант из заданного набора. Для декоративных задач это избавляет от ручной сборки последовательности, а @counter-style всё делает сам. Frontend Masters показывают, как это устроено.
Я бы сохранил этот трюк: at-rule
@counter-style работает не только с маркерами списка, но и как полноценный генератор строк через CSS counter. По умолчанию там system: symbolic — символы зацикливаются и умножаются по мере роста счётчика.Практический сценарий: замаскировать текст символьной лапшой прямо в CSS. Или собрать ротатор слов, где счётчик сам подбирает вариант из заданного набора. Для декоративных задач это избавляет от ручной сборки последовательности, а @counter-style всё делает сам. Frontend Masters показывают, как это устроено.
❤3
Почему TypeScript иногда выводит не тот тип: разбор алгоритма
Казалось бы, вывод типов — базовая механика компилятора. Но в двухфазном алгоритме TypeScript есть ловушки, которые ловят даже опытных разработчиков: компилятор сначала собирает кандидатов из ковариантных и контравариантных позиций, а потом сворачивает их в единственный тип. При этом контравариантный результат обычно побеждает, а общий супертип никогда не выходит за рамки списка кандидатов.
В материале разбирают, почему пересечения типов ведут себя непредсказуемо, почему условные типы внутри generic-контекста не вычисляются и как
Сохраните, если пишете API со значениями по умолчанию или ловили странный unknown там, где ждали конкретный тип.
Казалось бы, вывод типов — базовая механика компилятора. Но в двухфазном алгоритме TypeScript есть ловушки, которые ловят даже опытных разработчиков: компилятор сначала собирает кандидатов из ковариантных и контравариантных позиций, а потом сворачивает их в единственный тип. При этом контравариантный результат обычно побеждает, а общий супертип никогда не выходит за рамки списка кандидатов.
В материале разбирают, почему пересечения типов ведут себя непредсказуемо, почему условные типы внутри generic-контекста не вычисляются и как
NoInfer<T> с TypeScript 5.4+ блокирует вывод из конкретной позиции.Сохраните, если пишете API со значениями по умолчанию или ловили странный unknown там, где ждали конкретный тип.
❤2
Zero 1.0: веб-приложение читает данные локально, а сервер догоняет потом
Если интерфейс ждёт каждый запрос к серверу, загрузка становится частью дизайна. Zero предлагает другой подход: приложение читает данные из локального кэша, а сервер синхронизируется в фоне.
Под капотом —
Пока только Postgres, SSR ещё в roadmap, а клиентский слой добавляет вес и сложность. Зато как идея для интерфейсов без вечного ожидания сети — очень сильная.
Если интерфейс ждёт каждый запрос к серверу, загрузка становится частью дизайна. Zero предлагает другой подход: приложение читает данные из локального кэша, а сервер синхронизируется в фоне.
Под капотом —
zero-client в приложении, zero-cache рядом с сервером и read-only реплика Postgres. Запросы пишутся на ZQL, выполняются локально и возвращают результат почти сразу, а авторитетные данные доезжают асинхронно.Пока только Postgres, SSR ещё в roadmap, а клиентский слой добавляет вес и сложность. Зато как идея для интерфейсов без вечного ожидания сети — очень сильная.
zero.rocicorp.dev
Zero 1.0
First Stable Release
🤔5👍3❤2👎1
3D на CSS, когда canvas и WebGL остались за дверью
Оказывается, DOM ещё не всё сказал в теме странных визуальных экспериментов. PolyCSS рендерит текстурированные 3D-меши обычными HTML-элементами: каждый полигон — отдельный DOM-узел, а положение задаётся через
Практической замены Three.js тут, конечно, нет. Зато есть интересный трюк: элементы остаются частью DOM, их можно стилизовать CSS, делать интерактивными и трогать привычными веб-инструментами. Для прототипов и демо самое то.
https://polycss.com/
Оказывается, DOM ещё не всё сказал в теме странных визуальных экспериментов. PolyCSS рендерит текстурированные 3D-меши обычными HTML-элементами: каждый полигон — отдельный DOM-узел, а положение задаётся через
matrix3d().Практической замены Three.js тут, конечно, нет. Зато есть интересный трюк: элементы остаются частью DOM, их можно стилизовать CSS, делать интерактивными и трогать привычными веб-инструментами. Для прототипов и демо самое то.
https://polycss.com/
🤔6👍3👎1
В свежем JavaScript Weekly сразу несколько поводов обновить веб-радар
В одном выпуске собрали неплохой срез того, куда сейчас движется JS-экосистема: VoidZero уходит в Cloudflare, Angular v22 выкатывает стабильные Signal Forms и Angular Aria, а в подборке инструментов всплывают штуки для source maps, доступных модалок и поиска замен npm-пакетам.
Веб-тулчейн всё сильнее собирается вокруг скорости, меньшего числа зависимостей и нативных возможностей платформы. Даже маленький сервис вроде replacements.fyi попадает ровно в эту боль: прежде чем поставить очередной пакет, можно проверить, нет ли нативного API, сниппета или более лёгкой библиотеки.
Сам выпуск: https://javascriptweekly.com/issues/789
В одном выпуске собрали неплохой срез того, куда сейчас движется JS-экосистема: VoidZero уходит в Cloudflare, Angular v22 выкатывает стабильные Signal Forms и Angular Aria, а в подборке инструментов всплывают штуки для source maps, доступных модалок и поиска замен npm-пакетам.
Веб-тулчейн всё сильнее собирается вокруг скорости, меньшего числа зависимостей и нативных возможностей платформы. Даже маленький сервис вроде replacements.fyi попадает ровно в эту боль: прежде чем поставить очередной пакет, можно проверить, нет ли нативного API, сниппета или более лёгкой библиотеки.
Сам выпуск: https://javascriptweekly.com/issues/789
❤3
В WebKit выкатили большой разбор Safari 27 beta. Формально там 58 новых фич, 525 фиксов и 4 deprecation, но мне тут интереснее не список галочек, а направление: Safari многое догоняет и выравнивает поведение с остальными браузерами.
Из заметного для фронтенда: кастомизируемый
Хороший повод прогнать свои проблемные места в Safari 27 beta. Особенно если у вас есть компоненты, где нативный HTML давно хотелось использовать, но приходилось тащить JS-костыль ради стилизации или предсказуемого поведения. Официальный релиз обновы, как обычно у Apple, осенью.
Из заметного для фронтенда: кастомизируемый
<select> без пересборки контрола на JavaScript, scroll anchoring против прыжков страницы, anchor positioning с учётом transform, :heading, stretch для размеров, WebAssembly JSPI и пачка фиксов вокруг :has(), SVG, таблиц, форм, accessibility и Web Inspector.Хороший повод прогнать свои проблемные места в Safari 27 beta. Особенно если у вас есть компоненты, где нативный HTML давно хотелось использовать, но приходилось тащить JS-костыль ради стилизации или предсказуемого поведения. Официальный релиз обновы, как обычно у Apple, осенью.
😁2👍1
Кэш браузера может промахиваться просто из-за мусора в URL
Если одна и та же страница открывается как /sale?utm_source=google, /sale?utm_source=newsletter и /sale?fbclid=..., браузерный кэш обычно считает это разными URL. Хотя HTML может быть байт в байт одинаковым. В итоге вместо повторного использования ответа получаем лишние запросы и фрагментацию кэша.
Harry Roberts разобрал No-Vary-Search — HTTP-заголовок, который говорит кэшу, какие query-параметры не влияют на содержимое страницы. Например, можно игнорировать utm_source, utm_medium, gclid, fbclid и не плодить отдельные cache entry для маркетингового хвоста.
Главное не переборщить. Если ?color=red и ?color=blue реально отдают разные страницы, игнорировать такие параметры нельзя.
Если одна и та же страница открывается как /sale?utm_source=google, /sale?utm_source=newsletter и /sale?fbclid=..., браузерный кэш обычно считает это разными URL. Хотя HTML может быть байт в байт одинаковым. В итоге вместо повторного использования ответа получаем лишние запросы и фрагментацию кэша.
Harry Roberts разобрал No-Vary-Search — HTTP-заголовок, который говорит кэшу, какие query-параметры не влияют на содержимое страницы. Например, можно игнорировать utm_source, utm_medium, gclid, fbclid и не плодить отдельные cache entry для маркетингового хвоста.
Главное не переборщить. Если ?color=red и ?color=blue реально отдают разные страницы, игнорировать такие параметры нельзя.
Csswizardry
Better Browser Caching with No-Vary-Search – CSS Wizardry
No-Vary-Search lets HTTP caches ignore irrelevant query parameters such as UTM tags, while still keeping meaningful ones like product variants in the cache key.
❤4👍4
HTML-first, который обогнал React не по идеологии, а по конверсии
Я бы сохранил этот кейс не как очередной спор «React или без React», а как напоминание: большая форма для публичного сервиса не обязана быть SPA. У автора до этого уже был React-вариант, его сняли через три дня из-за жалоб: спиннеры, глобальное состояние, проблемы с доступностью и загрузки в localStorage.
Новая версия на Astro работала HTML-first: каждый шаг формы отдельной страницей, данные и файлы сразу сохранялись на бэкенде, JS только улучшал опыт. Валидацию автор вынес в web component меньше 1 КБ, который использует обычную HTML-валидацию и откатывается к браузеру/серверу, если что-то не сработало.
Самое показательное: после запуска число завершённых форм выросло вдвое. Разбор хорош тем, что возвращает веб к простому вопросу: а будет ли это работать на старом телефоне и плохой сети?
Я бы сохранил этот кейс не как очередной спор «React или без React», а как напоминание: большая форма для публичного сервиса не обязана быть SPA. У автора до этого уже был React-вариант, его сняли через три дня из-за жалоб: спиннеры, глобальное состояние, проблемы с доступностью и загрузки в localStorage.
Новая версия на Astro работала HTML-first: каждый шаг формы отдельной страницей, данные и файлы сразу сохранялись на бэкенде, JS только улучшал опыт. Валидацию автор вынес в web component меньше 1 КБ, который использует обычную HTML-валидацию и откатывается к браузеру/серверу, если что-то не сработало.
Самое показательное: после запуска число завершённых форм выросло вдвое. Разбор хорош тем, что возвращает веб к простому вопросу: а будет ли это работать на старом телефоне и плохой сети?
👍10❤4😁1
WebGPU-чарты уже тянут десятки миллионов точек
ChartGPU — не просто очередная charting library с красивыми демками. Проект использует WebGPU и показывает бенчмарки вроде 35 млн точек примерно на 72 FPS и streaming dashboards с несколькими графиками на одном
Интереснее всего здесь даже не цифра, а направление: визуализация больших данных постепенно перестаёт быть задачей только для десктопных тулов и серверного pre-render. Браузер получает GPU-пайплайн, typed arrays, shared resources и нормальный шанс не умереть на первом же scatter plot.
Репозиторий я бы смотрел, если делаете мониторинги, финтех-графики, observability или любые интерфейсы, а ваш canvas уже начинает задыхаться.
ChartGPU — не просто очередная charting library с красивыми демками. Проект использует WebGPU и показывает бенчмарки вроде 35 млн точек примерно на 72 FPS и streaming dashboards с несколькими графиками на одном
GPUDevice.Интереснее всего здесь даже не цифра, а направление: визуализация больших данных постепенно перестаёт быть задачей только для десктопных тулов и серверного pre-render. Браузер получает GPU-пайплайн, typed arrays, shared resources и нормальный шанс не умереть на первом же scatter plot.
Репозиторий я бы смотрел, если делаете мониторинги, финтех-графики, observability или любые интерфейсы, а ваш canvas уже начинает задыхаться.
❤5😁1
JSON исполнилось 25 лет, и улучшать его уже почти нельзя
Tim Bray, один из людей с именем в спецификациях XML и JSON, написал хороший текст о состоянии форматов в 2026 году.
Главная мысль цепляет: JSON уже настолько везде, что чинить его странности почти невозможно. Комментариев нет, даты нет, числа неудобные, Unicode может неприятно удивлять, но миллиарды парсеров в устройствах и сервисах никуда не денутся.
Для веб-разработки это хороший трезвый вывод: формат данных — не только красота спецификации, но и инерция экосистемы. Иногда «достаточно хорошо» побеждает потому, что его уже невозможно заменить без боли.
Tim Bray, один из людей с именем в спецификациях XML и JSON, написал хороший текст о состоянии форматов в 2026 году.
Главная мысль цепляет: JSON уже настолько везде, что чинить его странности почти невозможно. Комментариев нет, даты нет, числа неудобные, Unicode может неприятно удивлять, но миллиарды парсеров в устройствах и сервисах никуда не денутся.
Для веб-разработки это хороший трезвый вывод: формат данных — не только красота спецификации, но и инерция экосистемы. Иногда «достаточно хорошо» побеждает потому, что его уже невозможно заменить без боли.
ongoing by Tim Bray
XML and JSON in 2026
❤9👍2
Один клик в github.dev мог утащить GitHub-токен
Сильный security-разбор на стыке веба и редактора: в github.dev OAuth-токен давал доступ к репозиториям пользователя, а VS Code webviews пытались быть удобными и прокидывали часть keyboard events наружу.
Автор показал цепочку: Jupyter notebook в webview, message passing, симуляция горячих клавиш, установка расширения через рекомендованные extensions и доступ к токену. Звучит дико, но именно такие баги рождаются на границе iframe isolation, UX и доверенных workspace.
Материал полезен не только безопасникам. Если делаете web IDE, sandbox, preview HTML или plugin system, там много уроков про то, где удобство начинает пробивать модель безопасности.
Сильный security-разбор на стыке веба и редактора: в github.dev OAuth-токен давал доступ к репозиториям пользователя, а VS Code webviews пытались быть удобными и прокидывали часть keyboard events наружу.
Автор показал цепочку: Jupyter notebook в webview, message passing, симуляция горячих клавиш, установка расширения через рекомендованные extensions и доступ к токену. Звучит дико, но именно такие баги рождаются на границе iframe isolation, UX и доверенных workspace.
Материал полезен не только безопасникам. Если делаете web IDE, sandbox, preview HTML или plugin system, там много уроков про то, где удобство начинает пробивать модель безопасности.
❤4👍1