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
Let’s Encrypt готовит сертификаты к post-quantum эпохе
Вебу придётся жить с post-quantum TLS не в теории, а в браузерах, цепочках сертификатов и размерах handshake. Let’s Encrypt разобрали, как они подходят к post-quantum будущему сертификатов.
Новые алгоритмы меняют размер ключей, подписи, цепочки и требования к инфраструктуре. Для обычного сайта это пока не задача на завтра, но для CDN, хостингов, CA и браузеров подготовка уже идёт.
Вебу придётся жить с post-quantum TLS не в теории, а в браузерах, цепочках сертификатов и размерах handshake. Let’s Encrypt разобрали, как они подходят к post-quantum будущему сертификатов.
Новые алгоритмы меняют размер ключей, подписи, цепочки и требования к инфраструктуре. Для обычного сайта это пока не задача на завтра, но для CDN, хостингов, CA и браузеров подготовка уже идёт.
👍5❤2
URL — это не строка, а источник маленьких несовпадений
Если когда-нибудь парсили URL на бэке, фронте и в соседнем сервисе, то знаете этот неприятный момент: вроде вход один, а результат чуть разный.
URL Parser Tester сравнивает поведение разных парсеров прямо в браузере. Для этого авторы тянут реализации через WebAssembly и Web Workers, а потом показывают, где расходятся Python, Go, Node.js, libcurl, Firefox, Safari и WHATWG URL.
Там есть хорошие примеры: `file://` с Windows UNC paths, invalid percent encoding, IDNA, нормализация пути. Я бы держал такой инструмент под рукой перед тем, как писать свою «простую» URL-валидацию.
Если когда-нибудь парсили URL на бэке, фронте и в соседнем сервисе, то знаете этот неприятный момент: вроде вход один, а результат чуть разный.
URL Parser Tester сравнивает поведение разных парсеров прямо в браузере. Для этого авторы тянут реализации через WebAssembly и Web Workers, а потом показывают, где расходятся Python, Go, Node.js, libcurl, Firefox, Safari и WHATWG URL.
Там есть хорошие примеры: `file://` с Windows UNC paths, invalid percent encoding, IDNA, нормализация пути. Я бы держал такой инструмент под рукой перед тем, как писать свою «простую» URL-валидацию.
timothygu.me
URL parser tester
❤4👍1
CSS ломает голову не только фронтендерам
matklad написал разбор CSS с позиции человека, которому нужно сверстать страницу, но который не хочет внезапно становиться специалистом по каскаду.
Получился хороший список мест, где CSS неприятен: browser defaults, wrapper-слои, layout без единого универсального алгоритма, selectors как наследование на стероидах, margin collapsing,
Мне нравится, что текст не превращается в нытьё. Это скорее практичная карта минного поля: что стоит зафиксировать в reset, где не полагаться на дефолты и почему семантический HTML часто упрощает CSS сильнее, чем очередная обёртка. Особенно пригодится вайб-кодерам.
matklad написал разбор CSS с позиции человека, которому нужно сверстать страницу, но который не хочет внезапно становиться специалистом по каскаду.
Получился хороший список мест, где CSS неприятен: browser defaults, wrapper-слои, layout без единого универсального алгоритма, selectors как наследование на стероидах, margin collapsing,
box-sizing, font-size и line-height.Мне нравится, что текст не превращается в нытьё. Это скорее практичная карта минного поля: что стоит зафиксировать в reset, где не полагаться на дефолты и почему семантический HTML часто упрощает CSS сильнее, чем очередная обёртка. Особенно пригодится вайб-кодерам.
matklad.github.io
CSS: Unavoidable Bad Parts
An ersatz CSS tutorial for people who need to style a web page, but aren't web developers. I am a wrong person to write this kind of thing, as I have neither the time, nor experience. I'd much rather read a book about this. Alas, I had to learn all this stuff…
👍6😁4🤣2
Forwarded from Типичный программист
x86-эмулятор, который работает на одном CSS
Разработчица собрала x86 CPU emulator без JavaScript, без WebAssembly и без привычного runtime — только на CSS.
Это не кандидат на прод и не новая платформа для вычислений. Ценность в другом: CSS здесь используют как странную вычислительную модель с состояниями, селекторами и каскадом, которые внезапно начинают напоминать машину выполнения.
История хороша как инженерный фокус. Подробности по ссылке
Разработчица собрала x86 CPU emulator без JavaScript, без WebAssembly и без привычного runtime — только на CSS.
Это не кандидат на прод и не новая платформа для вычислений. Ценность в другом: CSS здесь используют как странную вычислительную модель с состояниями, селекторами и каскадом, которые внезапно начинают напоминать машину выполнения.
История хороша как инженерный фокус. Подробности по ссылке
👍3❤1