Будни разработчика
14.3K subscribers
1.42K photos
410 videos
8 files
2.34K links
Блог Lead JS-разработчика
Автор: @bekharsky

По рекламе: https://telepost.pro/ch/id2415 или https://t.me/it_adv

Чат: https://t.me/htmlshitchat

№5001017849, https://www.gosuslugi.ru/snet/679b74f8dad2d930d2eaa978
Download Telegram
#инструмент дня

TanStack Charts 1.0 — Таннер Линсли довёл до стабильного релиза свою библиотеку графиков.

Вот это, конечно, эффективность у человека.

Анонс: https://tanstack.com/blog/tanstack-charts-1-0
Каталог: https://tanstack.com/charts/catalog

Charts устроен не как коллекция <LineChart>, <BarChart> и <PieChart>. График собирается из меток (marks), шкал (scales), осей (axes) и взаимодействий (interactions): можно начать с линии, добавить поверх точки, снизу столбцы, свои аннотации или вообще собственную метку (mark) — без поиска нового компонента под каждую комбинацию.

По умолчанию используется SVG, но тяжёлый слой можно отдельно перевести на Canvas, оставив оси, подписи и интерактивность в SVG. Canvas, анимации и более тяжёлые части не попадают в bundle, пока они действительно не понадобились.

Линсли пришёл к этой архитектуре после D3, работы над Chart.js 2.0 и собственного react-charts. Последний тоже со временем упёрся в ограничения заранее заданных видов графиков. Поэтому Charts построен ближе к Grammar of Graphics: визуализация складывается из отдельных частей, а не выбирается целиком из списка готовых типов.

Линсли пишет, что идеи для API копил около десяти лет, архитектуру и поведение проектировал сам, а почти всю реализацию отдал coding agents. Для Charts уже есть отдельный гайд по AI authoring — как агенту выбирать примитивы, проверять результат и не выдумывать несуществующие API. Собственный Skill через TanStack Intent тоже запланирован, но пока не выпущен.

В результате Charts рассчитан даже не столько на графики, это весьма решённая проблема, сколько на все придури вашего дизайнера :)

#charts #tanstack
❤10🤩4
Media is too big
VIEW IN TELEGRAM
#дичь дня

Лукас Бономи сделал GSS (GPU Style Sheets) — язык, на котором можно создавать полноценную 3D-графику, используя практически обычный CSS. И чем дальше читаешь документацию, тем больше вопросов к автору.

Объекты объявляются через @scene. Хотите куб? Пишите cube. Сферу? sphere. Трёхмерный бублик? torus. Можно назначить им классы и идентификаторы, расположить в пространстве и стилизовать привычными селекторами.


@scene {
sphere#ball;
}

#ball {
translate: 0 1 0;
color: #ff5a36;
material: glass(1.5, frosted 0.3);
animation: float 2s ease-in-out alternate;
}

@keyframes float {
from {
translate: 0 1 0;
}
to {
translate: 0 1.5 0;
}
}


А дальше начинается прекрасное. Тут есть каскад, специфичность, `!important`, `:nth-child()`, `:hover` и даже `:has()`. Последний позволяет, например, менять внешний вид куба при наведении на соседнюю сферу. Да, теперь можно три часа выяснять, почему CSS не красит бублик.

Материалы тоже описываются стилями: metal(), glass(), jelly(), iridescent(). Есть градиенты, текстуры, освещение, тени, туман и фильтры. Анимации задаются через @keyframes, работают переходы и управление сценой через прокрутку страницы.

Причём это не какая-то хитрая обёртка над Three.js. GSS компилирует сцену в GPU-шейдеры GLSL или WGSL, а геометрия строится через SDF (функции расстояния) и raymarching. Никаких привычных полигональных мешей — видеокарта сама вычисляет поверхности объектов при отрисовке.

У проекта есть интерактивная песочница, npm-пакет, интеграция с Vite и даже расширение для VS Code. Всё это пока экспериментальное, но вполне работающее.

Не знаю, кому пришло в голову, что трёхмерной графике не хватает CSS-каскада и проблем со специфичностью, но теперь я хочу увидеть, как кто-нибудь будет отлаживать сцену с сотней объектов и !important.

https://www.gss-lang.dev/

#3d #webgpu
❤7👍4🫡2🔥1
#статья дня

У vlt.io есть собственный коммерческий реестр npm-пакетов. Казалось бы, зачем кому-то альтернатива бесплатному npmjs.org? Но разработчики vlt решили покопаться в том, как npm передаёт метаданные пакетов, и нашли довольно много лишнего.

Например, полный документ с метаданными 759 версий Vite занимает 4,41 МБ даже после gzip. У npm есть сокращённый формат, но в нём не хватает некоторых полей, поэтому пакетным менеджерам иногда приходится запрашивать полную версию со всей накопившейся за годы историей.

В vlt переработали формат, убрали ненужные данные и сократили тот же документ Vite до 104 КБ. В среднем объём передаваемых метаданных уменьшился на 70%, а холодная установка зависимостей в их тестах ускорилась на 20–70%.

Причём менять пакетный менеджер не требуется: обычные npm, pnpm и Bun могут работать с альтернативным реестром. То есть значительную часть оптимизаций удалось сделать исключительно на стороне сервера.

Конечно, тесты проводились без lockfile, а в проектах с кешированием выигрыш будет скромнее. Но сама история показательна: спустя столько лет развития npm в его протоколе всё ещё остаются неэффективности, которые можно устранить, даже не меняя клиентский код.

https://www.vlt.io/blog/registry-metadata-70-percent-smaller

#npm #pnpm
❤5👍5
#инструмент дня

Когда надоело, что ссылки из рабочего Slack открываются в личном профиле Chrome, а мемчики из Telegram — в рабочем.

Встречайте — ContextRoute! Создано мной с любовью для вас, котаны. Пока только для macOS.

Работает просто: выбираете, в каком браузере или профиле открывать ссылки из конкретных приложений.

Например, всё из Slack отправляется в рабочий профиль Chrome, из Telegram — в личный, а из остальных приложений — как принятно в macOS aka в последнее окно. Чуть меньше раздражения.

Альтернативы, конечно, существуют. Но мне они как-то не зашли.

Такие утилиты, во-первых, очень opinionated, а во-вторых, любят обрастать настройками. А я люблю минимум.

Вот, например, Yojam. У него только тёмная тема. И не просто тёмная, а чёрная! В сочетании с обилием, несомненно, прекрасных настроек пользоваться этим мне показалось невозможным. Skill issue.

Finicky — прекрасный инструмент, но зачем мне писать конфиг на TypeScript, чтобы открывать ссылки в браузере? Я вот не понял.

Поэтому и сделал свою утилиту. Пока она умеет только маршрутизировать ссылки по приложениям, из которых их открывают. Никаких правил по доменам, сложных условий и прочих радостей автоматизации. Всё это появится позже, но сейчас мне хотелось решить одну конкретную проблему.

Надеюсь, что смогу вовремя остановиться. Хотя, наверное, разработчик Yojam тоже так считал.

#swift #macos
❤14👍1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
#такое дня

Сидим, разрабатываем дизайн систему, следуем WCAG, вычитываем эксплейнеры с https://open-ui.org/, следуем всем законам о доступности...

Но мы все лишь грязь под ногтями дизайнеров Apple, потому что спроектировать убегающий из под курсора компонент в их понимании абсолютно нормально.

Что дозволено Юпитеру, не дозволено быку, да?

#apple #ui
🤩10🤡8🫡2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍1👏1
#заметка дня

Когда Гарри Каспаров проиграл DeepBlue в шахматы, всем, в целом, стало понятно, что шахматисты не победят ботов.

Помешало ли это шахматам с переменным успехом быть самой популярной игрой? Нет. Помешало ли это шахматистам снова достигать уровня практически рок-звёзд? Тоже нет. Признание, процесс, обучение, скандалы — всё на месте.

Это я к чему. Ну, собственно, что меня зацепило — оно на иллюстрации. «Ни одна модель». Ссылка на X. Вызов принят!

Задача предельно ясна: закрыть картинку и видео-файл "скелетоном", все только через css, видео-элементу нельзя добавлять никакие атрибуты и доп. css-классы, разметку менять нельзя, можно только менять css root элемента, работать должно везде.

И, собственно, GPT 6.1 Sol Max прекрасно справился, по пути выдав весьма интересное решение: через filter.

Вот оно: https://codepen.io/editor/alinaki/pen/01a13fa3-609c-71ea-b6ae-8fc97433cae8

Лучше ли оно предложенного? Хороший вопрос! Я пока предложенное не видел, но оно, как минимум, использует сильно более новые возможности, которые гораздо менее доступны в браузерах.

Одну проблему своего решения я уже знаю — маска анимации заставляет фон просвечиваться. Но я уверен, что это можно решить, и проблемой стать не должно.

Но целая ночь против 10 минут. Никогда не говори никогда, короче.

#css #skeleton
❤7👍2
#статья дня, даже две

Помните, я недавно рассказывал, почему появился Git и чем он отличается от SVN? Кажется, пора снова вспомнить о централизованных системах контроля версий.

Anthropic отказалась от Git и написала собственную VCS — Scion. Причём архитектурно она ближе к старому доброму SVN.

В мае компания вливала в свой монорепозиторий около 2500 изменений в день, а к сентябрю — уже больше 30 тысяч. История главной ветки приблизилась к 100 ГБ, CI выполнял 25 миллионов checkout в сутки. Git перестал справляться, несмотря на сотни зеркал и прочие оптимизации.

В Scion коммиты, слияния и ребейзы выполняются на сервере, а клиенты загружают файлы по необходимости. По данным Anthropic, это сократило потребление CPU и памяти инфраструктурой в 200 раз.

На разработку ушло пять месяцев и работа семи инженеров. Разумеется, при участии Claude, из-за которого вся эта проблема и возникла.

Но объёмы генерируемого агентами кода создают проблемы не только для Git, но и для платформ вокруг него.

Разработчик Йови де Крок представил экспериментальный проект gittifacts, в котором предлагает пересмотреть привычный процесс Pull Request. Вместо чтения каждого диффа человек согласовывает план и критерии приёмки, агент пишет код, а система собирает результаты тестов, покрытие, изменения API и зависимостей. На их основании изменение отправляется на ревью или автоматически сливается, если это разрешено настройками.

В отличие от Scion, gittifacts не заменяет Git, а пытается решить проблему человеческого ревью, которое тоже плохо масштабируется вместе с количеством сгенерированного кода.

В общем, за каких-то двадцать лет мы прошли путь от централизованного SVN к распределённому Git, а теперь снова выясняем, что централизованная архитектура может быть удобнее. И заодно думаем, зачем заставлять людей читать весь код, который генерируют машины.

Scion — статья Anthropic
gittifacts — статья автора

#git #svn #ai
❤5👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
#статья дня

В Base UI написали целую статью о том, как добавить поиск в выпадающее меню. Не о том, как фильтровать массив по строке — с этим как раз никаких проблем.

Допустим, есть меню с командами Rename, Duplicate и Delete. Добавляем поле поиска, начинаем печатать, стрелками выбираем нужный пункт, Enter выполняет действие.

А теперь вопрос: что это за компонент с точки зрения доступности?

Первым напрашивается combobox. Но комбобокс предполагает выбор значения для поля ввода, а здесь мы выполняем команду. aria-autocomplete тоже не подходит: он предполагает определённое поведение списка подсказок, которого наше меню не обеспечивает.

В Base UI в итоге выбрали dialog, внутри которого находятся поле поиска и настоящее menu.

Но с семантикой разобрались — осталась клавиатура. Например, Home и End в текстовом поле перемещают курсор, а в меню — выделение. Стрелками нужно перемещаться между пунктами, сохраняя возможность продолжать печатать. Причём DOM-фокус остаётся в поле ввода, а активный пункт определяется через aria-activedescendant.

Отдельная история с подменю: если оно открылось при наведении мыши, нельзя сразу переводить фокус на его поле поиска. Пользователь мог просто провести указателем мимо.

И всё это ещё нужно проверить с VoiceOver, NVDA и TalkBack. Кстати, по ходу работы команда обнаружила несколько багов доступности даже в обычном компоненте Menu.

Ну что же, давайте снова поговорим о том, что AI избавит нас от необходимости писать код. Допустим, агент за минуту напишет весь JSX, фильтрацию и обработчики клавиатуры. Но кто-то всё равно должен определить, какое поведение мы вообще хотим получить, почему именно такое и соответствует ли оно ожиданиям пользователей.

Особенно тех, кто взаимодействует с интерфейсом не так, как его разработчик.

Отдельный вопрос, конечно, нельзя ли просто заменить все меню на одно обращение в чат.

В общем, очень рекомендую почитать разбор Base UI. Там много интересных деталей, о которых легко не задуматься, даже если весь код пишешь собственноручно.

А ещё обратите внимание, у них видеоиллюстрации отдельные для тёмной и светлой темы 🫠

#ui #a11y #aria
1❤8
#заметка дня

Всего три месяца назад Microsoft выпустила TypeScript 7 на Go, который должен был решить проблемы с производительностью. А за последние недели появилось сразу несколько альтернативных реализаций компилятора. Только ленивый не переписал компилятор TypeScript на Rust или на что-то ещё.

Отчасти виноват сам переход на Go: новый компилятор стал нативным бинарником, а инструменты, использовавшие JavaScript API, теперь вынуждены общаться с ним через отдельный протокол. И ещё когда стало известно об этом — кругом сразу поднялся визг: «Почему не на Rust?!».

А теперь следите за руками:

• ts-rust — экспериментальный Rust-порт от команды Theo Browne. Проверяет типы в VS Code за 4,8 секунды против 9,6 у Go-версии.
• bun check — реализация от Bun, по их тестам в 3–6,4 раза быстрее Go-компилятора.
• tsc-ts — Vercel решила вернуть компилятор на TypeScript, но собирать его в нативный бинарник.
• tsrs — Rust-порт от Cloudflare и VoidZero, обещающий до 8 раз больше скорости и на 70% меньше потребления памяти.

Причём Cloudflare собирается объединить tsrs с проектом Theo Browne и развивать их как единую реализацию.

Сам Тео — персонаж офигеть какой неоднозначный. Его категоричность, бесконечные споры и провокации это нечто. А теперь его эксперимент с AI-портированием компилятора становится частью проекта Cloudflare.

У Cloudflare, впрочем, есть практический интерес: запуск TypeScript через WebAssembly внутри браузеров и Workers, в том числе для облачных IDE и AI-агентов.

Ещё недавно переписывание компилятора было многолетней инженерной задачей. Теперь портов столько, что разработчикам приходится договариваться, какие из них объединять.

Позиция Microsoft при этом, скорее, благодарная: какие-то оптимизации прекрасно бэкпортятся, и TypeScript 7.1 на Go уже стал в два раза быстрее.

#typescript #rust #cloudflare
🫡6❤3👏1
#такое дня

Вчера, 21 октября, был какой-то особенно весёлый день для тех, кто отвечает за продакшен. Да и вся неделя удалась.

— PHP2Shell — две критические уязвимости в самом PHP, позволяющие при определённых условиях получить RCE без авторизации. Патчи вышли вчера, сейчас бэкпортят на старые версии.

А о возможности такой проблемы знали с 2024 года как минимум.

— Node.js — сразу пачка исправлений: RCE в декодере Brotli, обходы проверки TLS-сертификатов, проблемы с DNS.

— LiteLLM — взломали аккаунты разработчиков и опубликовали заражённую версию 1.107.0 в PyPI и Docker Hub. Внутри — кража ключей и возможность удалённого выполнения кода.

— Plex2Shell — цепочка из четырёх уязвимостей Plex Media Server уже используется для установки майнеров и прокси.

— eMudhra — у восьми промежуточных центров сертификации оказались настолько слабые приватные ключи, что их можно восстановить из публичных. Mozilla пришлось срочно отзывать доверие к сертификатам.

Это было вообще слишком смешно, чтобы быть правдой, но как есть.

— Next.js — две критические RCE с оценкой 9.5, связанные с оптимизацией изображений и use cache. Исправления вышли ещё 14 октября.

— TiDB Cloud — подтвердили утечку клиентских и служебных данных после кражи учётных данных. Заявленные злоумышленниками 10,6 ТБ пока не подтверждены.

В общем, иногда npm audit fix — это наименьшая из ваших проблем.
🔥7❤6🤩2🫡1
#событие дня

Тимлидство — это не только раздавать задачи, проводить 1:1 и следить за дедлайнами. Чем больше команда, тем чаще приходится разбираться в людях, бизнесе и собственных управленческих решениях.

VK проводит два бесплатных TeamLead Meetup — 24 октября в Москве и 28 октября в Петербурге.

В Москве обсудят переход от управления отдельными задачами к управлению системой, а в Петербурге — насколько глубоко тимлиду вообще стоит погружаться в бизнес и стратегию компании.

Кроме докладов и дискуссий будет практика на выбор:

— Личная встреча с тимлидом VK, на которой можно разобрать собственные управленческие проблемы.

— Мастер-класс по теории ограничений Голдратта: как отделять факты от интерпретаций и проверять причинно-следственные связи, прежде чем принимать решения.

— «Своя игра» с разбором управленческих ситуаций и обсуждением решений.

В общем, разговор скорее о том, как управлять командой, а не о том, как заставить Jira работать за тебя.

Участие бесплатное, нужна регистрация.
👍2👎2
This media is not supported in your browser
VIEW IN TELEGRAM
#ссылка дня

Мой любимый UI-компонент, пожалуй, вообще за всё время — bottom sheet. Та самая панель, которая выезжает снизу экрана, тянется пальцем и фиксируется на разной высоте. Особенно активно используется в картографических приложениях вроде Google Maps и Apple Maps.

И вот pure-web-bottom-sheet — любопытная реализация для веба, почти полностью построенная на CSS.

Вместо обработки перетаскивания через JavaScript используется обычный браузерный скролл.

Контейнер получает overflow-y: scroll и scroll-snap-type: y mandatory. Внутри создаётся невидимая область прокрутки, а точки остановки задаются элементами с scroll-snap-align и CSS-переменной --snap. В результате панель перемещается вместе с прокруткой, а браузер самостоятельно обрабатывает жесты, инерцию и фиксацию в ближайшей точке. Никаких вычислений координат пальца на каждом pointermove и анимаций через requestAnimationFrame.

Для вложенного скролла применяется CSS Scroll-driven Animations. Через scroll-timeline и animation-timeline высота панели привязывается к положению внешнего скролла, а содержимое может прокручиваться независимо. Правда, анимация height вызывает перерасчёт layout, поэтому предусмотрена экспериментальная оптимизация с transform, при которой JavaScript вычисляет необходимые смещения в начале прокрутки.

Всё упаковано в Web Component, есть обёртки для React и Vue, поддерживаются нативные <dialog>, Popover API и SSR.

Ну и, конечно, не обошлось без Safari. Из-за бага WebKit пришлось добавлять невидимый горизонтальный overflow шириной в один пиксель, чтобы жесты прокрутки вообще нормально обрабатывались. Куда же без этого.

GitHub · Демо · Подробный технический разбор автора

#scroll #widget
❤17🔥3👎1
#молния дня

Срочно в номер! На странице 404 Apple Music находится функционирующий iPod первого поколения!

У меня всё.
❤7🤩4🔥3
Друзья из Tbilisi JS проводят уже девятый митап! 🤟

А если считать спецвыпуски, то и все 14!

24 октября, уже завтра, в Тбилиси соберутся разработчики, дизайнеры и любители веб-технологий. А для тех, кто не в Грузии, будет трансляция на YouTube.

В программе пять докладов:

🟡 Алексей Красиков (Paper, «Веб-стандарты») — «Веб-сайт — это вам не продукт».

🟡 Александр Островский (TradingView) — «Код подешевел, решения — нет. Как мы строим дизайн-систему с помощью AI-агентов».

🟡 Денис Митрофанов (Lightspeed) — «Как привычки людей отражаются в поведении AI-ассистента».

🟡 Макар Главанарь (Solvery, Pulsar Digital) — «Фреймворки для ИИ-агентов: что они делают за свои токены».

⭐️ Специальный гость — Андрей Ситник из Злых Марсиан, автор PostCSS, Nano ID и других опенсорс-проектов. Расскажет об архитектуре приложений, которые не следят за пользователями.

📅 24 октября, суббота
📺 Трансляция на YouTube — с 14:00 мск
📍 Terminal, Абашидзе 34, Тбилиси
🌍 Доклады на русском языке

Вход бесплатный, но нужна регистрация.
❤4🔥4
Проект от подписчика!

Напоминаю, что я выкачу любую статью или проект от вас, не стесняйтесь писать.

Презентация? Выступили на митапе? Хотите поделиться интересной статьёй — добро пожаловать!

votby.ru

Привет! Меня зовут Виктор. На днях мы с командой запустили наш проект и я бы хотел поделиться его историей.

Когда я был студентом, то постоянно пытался придумывать идеи для новых приложений и сервисов. Их были сотни, но каждый раз возникал один и тот же вопрос: нужна ли эта идея кому-то ещё?

Проверить это до начала разработки было практически негде. Так появилась мысль о платформе, на которой можно рассказать о своей идее, показать её другим людям и заранее оценить интерес аудитории.

Много лет эта мысль осталась просто записью на бумаге. Но наступил 2026 год, отрасль IT начала резко сжиматься и на горизонте начало маячить моё сокращение. И тут я решил, что было бы неплохо обеспечить себе хотя бы какой-то запасной вариант.

Я рассказал об идее подписчикам своего канала и предложил вместе создать такую площадку. За один день собралась команда приблизительно из десяти человек. Почти никого из них я не знал лично — большинство просто читали канал. Кто-то пришёл за опытом, кого-то заинтересовала возможность получить часть в будущем бизнесе, но всех объединило желание создать настоящий продукт с нуля.

Мы поставили себе довольно смелую цель — запустить MVP за месяц. Несмотря на сложности с организацией процессов большой команды, мы уложились в срок.

После запуска мнения разделились. Нас много поддерживали, но хватало и критики: кому-то не понравился дизайн, кто-то ожидал от команды из десяти человек гораздо большего. Для нас это тоже стало частью проверки идеи — только теперь проверяли уже не концепцию, а реальный продукт.

Сегодня "Вот бы!" продолжает развиваться. К нам регулярно приходят новые люди, а вокруг платформы постепенно формируется сообщество преданных пользователей. Они делятся своими идеями, предлагают улучшения и помогают определять, куда двигаться дальше.

Наверное, самым ценным результатом для меня стал даже не сам запуск, а поддержка всех тех людей, которые поверили в его идею и помогли превратить его в действительно крутой продукт!
👍10🔥3👎2❤1