#utils #perf
Либа от Рича Харриса.
Tells you whether the JavaScript library you're building is tree-shakeable.
https://github.com/Rich-Harris/agadoo
Либа от Рича Харриса.
Tells you whether the JavaScript library you're building is tree-shakeable.
https://github.com/Rich-Harris/agadoo
GitHub
GitHub - Rich-Harris/agadoo: Check whether a package is tree-shakeable
Check whether a package is tree-shakeable. Contribute to Rich-Harris/agadoo development by creating an account on GitHub.
Нашел отклик своих наблюдений о жизни и жизненной позиции с этой статьей.
> Везение IV — очень персонально, оно приходит именно к Вам (даже если Вы его не ищете) из-за того, *кем* Вы являетесь и *что* Вы делаете. Из-за Ваших хобби, уникальных характеристик вашего характера и т.д. У Навала Равиканта есть классный пример на эту тему. Допустим, что Вы лучший дайвер своего региона и кто-то в Вашей местности нашел сокровище на дне озера. Тогда он придет к Вам за помощью и его удача станет Вашей удачей.
Надо действовать, становиться лучше, и один момент везение случиться.
> Везение IV — очень персонально, оно приходит именно к Вам (даже если Вы его не ищете) из-за того, *кем* Вы являетесь и *что* Вы делаете. Из-за Ваших хобби, уникальных характеристик вашего характера и т.д. У Навала Равиканта есть классный пример на эту тему. Допустим, что Вы лучший дайвер своего региона и кто-то в Вашей местности нашел сокровище на дне озера. Тогда он придет к Вам за помощью и его удача станет Вашей удачей.
Надо действовать, становиться лучше, и один момент везение случиться.
Medium
4 вида везения
Очень понравилась классификация различных видов везения от Джеймса Остина, ученого в области нейробиологии мозга и автора книги “Погоня…
Forwarded from HowProgrammingWorks - JavaScript and Node.js Programming
✨ Нужно всегда разделять прикладной и системный код (это минимум два слоя реальности), как и роли программистов, описал подробнее.
🧑💻 Прикладной программист пишет продуктовый код, занимается моделированием предметной области и автоматизацией процессов в ней. Прикладному программисту нужно знать node.js как инструмент, его возможности, концепции, преимущества и недостатки, но не нужно глубоко погружаться в код платформы, не нужно строить прослойку между node.js и прикладным кодом, не нужно изобретать фреймворки (внутри продукта), изобретать обобщенные инструменты и библиотеки, не имеющие отношение к предметной области. Если это происходит, то он выполняет две роли - системную и прикладную, они должны быть максимально отделены: отдельные репозитории, отдельное рабочее время и должность, отдельные цели и задачи. Чтобы писать системные вещи смотри вопросы в следующем разделе.
👨🔧 Системный (платформенный) программист пишет код, не связанный с предметной областью: фреймворки, сетевые протоколы, транслятор, компиляторы, интерпретаторы, библиотеки, занимается вещами, которые могут быть переиспользованы в сотнях и тысячах разных проектов. Это называется производство средств производства. Систем программисту нужно знать node.js гораздо глубже, не только, его возможности, концепции, преимущества и недостатки, но и недокументированные возможности и даже баги, особенности платформы, которые очень редко используются, потому, что он строит прослойку между node.js и прикладным кодом, а прослойка эта позволяет делать прикладной код более абстрактным и приближенным к предметной области.
🧑💻 Прикладной программист пишет продуктовый код, занимается моделированием предметной области и автоматизацией процессов в ней. Прикладному программисту нужно знать node.js как инструмент, его возможности, концепции, преимущества и недостатки, но не нужно глубоко погружаться в код платформы, не нужно строить прослойку между node.js и прикладным кодом, не нужно изобретать фреймворки (внутри продукта), изобретать обобщенные инструменты и библиотеки, не имеющие отношение к предметной области. Если это происходит, то он выполняет две роли - системную и прикладную, они должны быть максимально отделены: отдельные репозитории, отдельное рабочее время и должность, отдельные цели и задачи. Чтобы писать системные вещи смотри вопросы в следующем разделе.
👨🔧 Системный (платформенный) программист пишет код, не связанный с предметной областью: фреймворки, сетевые протоколы, транслятор, компиляторы, интерпретаторы, библиотеки, занимается вещами, которые могут быть переиспользованы в сотнях и тысячах разных проектов. Это называется производство средств производства. Систем программисту нужно знать node.js гораздо глубже, не только, его возможности, концепции, преимущества и недостатки, но и недокументированные возможности и даже баги, особенности платформы, которые очень редко используются, потому, что он строит прослойку между node.js и прикладным кодом, а прослойка эта позволяет делать прикладной код более абстрактным и приближенным к предметной области.
Maybe algorithms aren’t the best way to interview. And sure, maybe you don’t use a lot of them in the job constantly. But the reality it that, there is a secret handshake to get into a very good paying job. Learn the handshake, right?
By ThePrimeagen https://frontendmasters.com/courses/algorithms/
By ThePrimeagen https://frontendmasters.com/courses/algorithms/
Frontendmasters
Algorithms & Data Structures | Learn Algorithms with TypeScript for Interviews
The last algorithms course you’ll need to pass tough interview questions that use arrays, lists, trees, graphs, maps, and searching and sorting algorithms.
Сегодня, во время беседы, вспомнил про этот выпуск подкаста UfoStation. Мне он откликнулся жизненной позицей гостя. Если сейчас вам сложно понять что же делать в профессии дальше, то рекомандую послушать мнение и историю Николая.
https://ufostation.mave.digital/ep-17
https://ufostation.mave.digital/ep-17
8 выпуск 2 сезона
s02e08 - Clojure и дорога реальных дел — Подкаст «UfoStation podcast»
Гость выпуска — Николай Рыжиков, CTO в компании Health-Samurai (https://www.health-samurai.io/), спикер на конферециях, адепт языка программирования Clojure, активный участник сообществ Clojure, Postgress, FHIR
🔥1
Forwarded from Node.js Ukraine Community
Пруф возможности состояния гонки в асинхронном программировании на JavaScript https://github.com/HowProgrammingWorks/RaceCondition/tree/master/JavaScript
Forwarded from Валя читает ишью
Say Goodbye to dotenv
И вот, начиная с 20.6.0, в ноду встроена поддержка dotenv конфигов.
Конфиг явно передаётся через флаг --env-file:
До этого всегда приходилось использовать motdotla/dotenv.
И вот, начиная с 20.6.0, в ноду встроена поддержка dotenv конфигов.
Конфиг явно передаётся через флаг --env-file:
node --env-file=config.env index.jsДо этого всегда приходилось использовать motdotla/dotenv.
👍3
Forwarded from Flutter Talks
🔥 Flutter Talks #1
42 Meetups и наши друзья из DAR University рады пригласить вас на наш первый митап по направлению Dart/Flutter.
Встречаемся 23-го сентября в 11:00, слушаем доклады, общаемся и кушаем пиццу.
Адрес: Байзакова 280, пространство SmartPoint, зал Freedom.
Список спикеров будет доступен уже в ближайшее время. Темы вас точно заинтересуют.
Участие бесплатное, регистрация доступна по ссылке — Google Forms.
Важно: количество мест ограничено, не откладывайте регистрацию в долгий ящик.
@flutter_talks
42 Meetups и наши друзья из DAR University рады пригласить вас на наш первый митап по направлению Dart/Flutter.
Встречаемся 23-го сентября в 11:00, слушаем доклады, общаемся и кушаем пиццу.
Адрес: Байзакова 280, пространство SmartPoint, зал Freedom.
Список спикеров будет доступен уже в ближайшее время. Темы вас точно заинтересуют.
Участие бесплатное, регистрация доступна по ссылке — Google Forms.
Важно: количество мест ограничено, не откладывайте регистрацию в долгий ящик.
@flutter_talks
🔥1
Forwarded from Node.js Ukraine Community
⭐️ Тут сведены идеи применения AI, точнее LLMок в разработке программного обеспечения. Что они делают хорошо 🟢, что удовлетворительно 🟧, а что вообще плохо 🛑
🟢 Анализ больших объемов данных, которые человеку сложно внимательно обработать
∙ логов и стектрейсов
∙ memory dumps
∙ dependency trees
∙ git blame
🟢 Портирование:
∙ с одной версии фреймворка или библиотеки на другую
∙ с одного языка на другой
∙ с одной СУБД на другую
∙ с одной OS на другую или поддержка нескольких
🟢 Боты и тулинг для автоматизации обработки кодовой базы и репозиториев:
∙ применение стиля
∙ применение чеклиста изменений
∙ поиск уязвимостей в кодовой базе
∙ маркировка commits, pull requests, issues
∙ расстановка тегов по коммитам и т.д.
∙ автоматизация закрытия тасков, майлстоунов
∙ поиск дубликатов кода, тасков, или перелинковка связанных
∙ аудит объемов работы, качества, сбор статистики
∙ предложения для рефакторинга
∙ поддержание консистентности кодовой базы и стиля
∙ создание спеки стиля кода по примерам кода или кодовой базе проекта
∙ предложение метрик для оценки кода и вычисление этих метрик
🟢 Написание текстов:
∙ подготовка CHANGELOG, HOW TO, Q&A
∙ генерация документации по коду
∙ реверс-инжиниринг кода в ТЗ
∙ поиск отличий между ТЗ, кодом, доками
∙ преобразование между форматами данных, например json, csv, pdf, sql, txt
🟢 Управление проектами
∙ оценка трудоемкости разработки, времени и денег
∙ оценка возможности распараллеливания разработки
∙ поиск слабых мест и выявление проблем в сметах, планах, ТЗ
∙ предложения по оптимизации бизнес-процессов
∙ сбор данных для подготовки принятия решений
🟢 Программирование
∙ алгоритмические задачи, подбор и реализация алгоритмов
∙ портирование, перевод и транспиляция между языками программирования
∙ преобразование между class и prototype в JavaScript
∙ оптимизация по заданному критерию: cpu, ram, i/o, lines, читаемость, сложность, etc.
∙ объяснение кода
∙ генерация примеров использования библиотек или абстракций
∙ ревью пул реквестов
∙ генерация юниттестов, системных тестов
∙ генерация конфигураций
∙ настройка CI/CD
∙ генерация SQL запросов
∙ генерация API, CRUD, формочек
∙ генерация моделей, структур, DTO, схем данных, классов, jsdoc
∙ преобразование моделей между разными синтаксисами
∙ синхронизаций структуры базы данных, схем, моделей, форочек
∙ генерация тайпингов и заголовочных файлов как .h, .d.ts
∙ подготовка контрактов и описание интерфейсов для интеграции систем
∙ генерация парсеров, конвертеров, по примерам входных и выходных форматов данных
∙ генерация валидаторов данных и валидаторов контрактов
🟧 Задачи, которые LLMки делают, но не всегда качественно и с проблемами
∙ терпимо конвертирует код между парадигмами: ООП, процедурное и структурное программирование
∙ гораздо хуже конвертирует между ООП и ФП
∙ асинхронное программирование и задачи с доступом к состоянию из разных мест
∙ олимпиадное программирование
∙ подготовка шаблонов и примеров приложений/проектов
∙ выбор зависимостей
∙ выбор СУБД, языков программирования, платформ, тулинга
∙ концептуальный код, демонстрирующий идею и делающий ее понятнее для многих
🛑 Что плохо решается при помощи LLMок
∙ системное программирование
∙ платформенный код, код библиотек, фреймворков
∙ новые и прорывные технологические решения, которые негде подсмотреть
∙ большинство новых нетипичных задач, когда в интернете мало примеров кода
∙ архитектура систем и структура приложений, даже при наличии множества примеров
🟢 Анализ больших объемов данных, которые человеку сложно внимательно обработать
∙ логов и стектрейсов
∙ memory dumps
∙ dependency trees
∙ git blame
🟢 Портирование:
∙ с одной версии фреймворка или библиотеки на другую
∙ с одного языка на другой
∙ с одной СУБД на другую
∙ с одной OS на другую или поддержка нескольких
🟢 Боты и тулинг для автоматизации обработки кодовой базы и репозиториев:
∙ применение стиля
∙ применение чеклиста изменений
∙ поиск уязвимостей в кодовой базе
∙ маркировка commits, pull requests, issues
∙ расстановка тегов по коммитам и т.д.
∙ автоматизация закрытия тасков, майлстоунов
∙ поиск дубликатов кода, тасков, или перелинковка связанных
∙ аудит объемов работы, качества, сбор статистики
∙ предложения для рефакторинга
∙ поддержание консистентности кодовой базы и стиля
∙ создание спеки стиля кода по примерам кода или кодовой базе проекта
∙ предложение метрик для оценки кода и вычисление этих метрик
🟢 Написание текстов:
∙ подготовка CHANGELOG, HOW TO, Q&A
∙ генерация документации по коду
∙ реверс-инжиниринг кода в ТЗ
∙ поиск отличий между ТЗ, кодом, доками
∙ преобразование между форматами данных, например json, csv, pdf, sql, txt
🟢 Управление проектами
∙ оценка трудоемкости разработки, времени и денег
∙ оценка возможности распараллеливания разработки
∙ поиск слабых мест и выявление проблем в сметах, планах, ТЗ
∙ предложения по оптимизации бизнес-процессов
∙ сбор данных для подготовки принятия решений
🟢 Программирование
∙ алгоритмические задачи, подбор и реализация алгоритмов
∙ портирование, перевод и транспиляция между языками программирования
∙ преобразование между class и prototype в JavaScript
∙ оптимизация по заданному критерию: cpu, ram, i/o, lines, читаемость, сложность, etc.
∙ объяснение кода
∙ генерация примеров использования библиотек или абстракций
∙ ревью пул реквестов
∙ генерация юниттестов, системных тестов
∙ генерация конфигураций
∙ настройка CI/CD
∙ генерация SQL запросов
∙ генерация API, CRUD, формочек
∙ генерация моделей, структур, DTO, схем данных, классов, jsdoc
∙ преобразование моделей между разными синтаксисами
∙ синхронизаций структуры базы данных, схем, моделей, форочек
∙ генерация тайпингов и заголовочных файлов как .h, .d.ts
∙ подготовка контрактов и описание интерфейсов для интеграции систем
∙ генерация парсеров, конвертеров, по примерам входных и выходных форматов данных
∙ генерация валидаторов данных и валидаторов контрактов
🟧 Задачи, которые LLMки делают, но не всегда качественно и с проблемами
∙ терпимо конвертирует код между парадигмами: ООП, процедурное и структурное программирование
∙ гораздо хуже конвертирует между ООП и ФП
∙ асинхронное программирование и задачи с доступом к состоянию из разных мест
∙ олимпиадное программирование
∙ подготовка шаблонов и примеров приложений/проектов
∙ выбор зависимостей
∙ выбор СУБД, языков программирования, платформ, тулинга
∙ концептуальный код, демонстрирующий идею и делающий ее понятнее для многих
🛑 Что плохо решается при помощи LLMок
∙ системное программирование
∙ платформенный код, код библиотек, фреймворков
∙ новые и прорывные технологические решения, которые негде подсмотреть
∙ большинство новых нетипичных задач, когда в интернете мало примеров кода
∙ архитектура систем и структура приложений, даже при наличии множества примеров
🚀 Состоялся релиз Lit 3.0.
В посте детали. Интересен тем что из лабс вышла интеграция с реактом. И конечно же сигналы в качестве эксперимента.
В посте детали. Интересен тем что из лабс вышла интеграция с реактом. И конечно же сигналы в качестве эксперимента.
X (formerly Twitter)
Lit on X
It's Lit Launch Day!
Say “Bye bye” to Internet Explorer, and “Ay up 👋” to a new major release of Lit and some brand new toys for you to try 🧸!
We can’t fit everything into a single tweet, so check out the 🧵and release post: https://t.co/psbihMN06d
Say “Bye bye” to Internet Explorer, and “Ay up 👋” to a new major release of Lit and some brand new toys for you to try 🧸!
We can’t fit everything into a single tweet, so check out the 🧵and release post: https://t.co/psbihMN06d
Forwarded from Валя читает ишью
Safari class fields implementation is buggy: part two, Tt edition
Я уже рассказывал о том, как сафари не очень хорошо (мягко говоря) дружит с замыканиями в class fields. И вот, спустя полгода, мы снова здесь. Long time no see как говорится!
В прошлый четверг я закончил миграцю с Jest на Vitest в последнем нашем проекте (про наш опыт можно почитать тут), всё протестил и выкатил в прод. На следующей день пришла жалоба от пользователя «форма поиска исчезает в сафари 15 — ничего не работает». При этом я форму эту не трогал даже близко. Весело!
Для начала пошли в BrowserStack чтобы посмотреть что ж там в 15 сафари происходит (какая же гениальная система обновлений у сафари, боже, я никогда это не пойму). В 15 сафари мы ничего не могли воспроизвести около часа, хотя у тестировщика разок получилось. Решили ради интереса попробовать сафари 14, который мы не поддерживаем — и сразу же воспроизвелось, причём стабильно. Увидели «ReferenceError: Tt is not defined». В этот раз проблемное место нашли сразу же, т.к. такая переменная была одна на весь бандл. Ну в общем всё тоже самое: class field, замыкание, вспомнили что в 15 сафари проблема иногда воспроизводилась, а иногда не особо.
Но как так вышло, что мы чиним ту же проблему, что и полгода назад? А всё просто — проблема та же, но в другом проекте! Понятно, что это чинится использованием babel/plugin-proposal-class-properties, но почему всё сломалось?
Если поменялся результат билда, то очевидно, что обновилась какая-то транизитивная зависимость (зависимость зависимости зависимости зависимости, ну вы знаете). В yarn.lock смотреть было бесполезно, т.к. дифф очень большой.
Решил сравнить мастер с веткой через yarn info.
и т.д.
В дифе помимо кучи других пакетов, я увидел
Начиная с 7.22.6 в @babel/compat-data указано, что class properties поддерживаются в iOS 14.5, а до этого было указано что в iOS 15, т.е. с Safari 15 сдаунгрейдили поддержку до Safari 14.1. Напомню, без багов эта фича работает начиная с Safari/iOS 16.
Что ж, тут вроде всё понятно. А что с caniuse-lite? Его использует browserslist, чтобы получить браузеры, которые мы хотим поддерживать. В конфиге у нас было указано defaults, last 2 years, not ie > 0, not ie_mob > 0, chrome >= 94. Сравнил вывод
Получается, что к проблеме мог привести апдейт babel/compat-data и caniuse-lite в любых комбинациях: по отдельности и вместе.
А кто их обновил? Ну, в общем-то я, когда устанавливал vitest и пару зависимостей к нему. Мы используем yarn dedupe, чтобы в рамках SemVer использовалась только одна библиотека. При установке и babel/compat-data, и caniuse-lite зарезолвились на последнюю версию и всё сломалось! Этой проблемы можно было бы избежать, если yarn dedupe умел бы в другие стратегии, но пока что только latest.
Ну и напоследок: что сделали, чтобы такого больше не случалось?
1. Явно включили babel/plugin-proposal-class-properties.
2. Посмотрели, что пользователи 14 сафари приносят нам 1% деняк и явно указали safari >= 14 в конфиге браузерслиста.
3. Через resolutions явно установили browserslist и caniuse-lite в единственных экземплярах, чтоб прозрачно контролировать процесс обновления.
А что там с ишью? А ишью в бабеле так и висит без изменений…
Я уже рассказывал о том, как сафари не очень хорошо (мягко говоря) дружит с замыканиями в class fields. И вот, спустя полгода, мы снова здесь. Long time no see как говорится!
В прошлый четверг я закончил миграцю с Jest на Vitest в последнем нашем проекте (про наш опыт можно почитать тут), всё протестил и выкатил в прод. На следующей день пришла жалоба от пользователя «форма поиска исчезает в сафари 15 — ничего не работает». При этом я форму эту не трогал даже близко. Весело!
Для начала пошли в BrowserStack чтобы посмотреть что ж там в 15 сафари происходит (какая же гениальная система обновлений у сафари, боже, я никогда это не пойму). В 15 сафари мы ничего не могли воспроизвести около часа, хотя у тестировщика разок получилось. Решили ради интереса попробовать сафари 14, который мы не поддерживаем — и сразу же воспроизвелось, причём стабильно. Увидели «ReferenceError: Tt is not defined». В этот раз проблемное место нашли сразу же, т.к. такая переменная была одна на весь бандл. Ну в общем всё тоже самое: class field, замыкание, вспомнили что в 15 сафари проблема иногда воспроизводилась, а иногда не особо.
Но как так вышло, что мы чиним ту же проблему, что и полгода назад? А всё просто — проблема та же, но в другом проекте! Понятно, что это чинится использованием babel/plugin-proposal-class-properties, но почему всё сломалось?
Если поменялся результат билда, то очевидно, что обновилась какая-то транизитивная зависимость (зависимость зависимости зависимости зависимости, ну вы знаете). В yarn.lock смотреть было бесполезно, т.к. дифф очень большой.
Решил сравнить мастер с веткой через yarn info.
yarn info --recursive --name-only выводит плоский список зависимостей с их версиями:├─ @adobe/css-tools@npm:4.3.1
├─ @ampproject/remapping@npm:2.2.1
├─ @aviasales/analytics@npm:4.0.7и т.д.
В дифе помимо кучи других пакетов, я увидел
caniuse-lite и @babel/compat-data, а именно их использует @babel/preset-env, чтобы решить нужно трансформировать ту или иную фичу.Начиная с 7.22.6 в @babel/compat-data указано, что class properties поддерживаются в iOS 14.5, а до этого было указано что в iOS 15, т.е. с Safari 15 сдаунгрейдили поддержку до Safari 14.1. Напомню, без багов эта фича работает начиная с Safari/iOS 16.
Что ж, тут вроде всё понятно. А что с caniuse-lite? Его использует browserslist, чтобы получить браузеры, которые мы хотим поддерживать. В конфиге у нас было указано defaults, last 2 years, not ie > 0, not ie_mob > 0, chrome >= 94. Сравнил вывод
yarn dlx browserslist и увидел, что из поддерживаемых браузеров исчез сафари 14, т.к. ему исполнилось больше двух лет.Получается, что к проблеме мог привести апдейт babel/compat-data и caniuse-lite в любых комбинациях: по отдельности и вместе.
А кто их обновил? Ну, в общем-то я, когда устанавливал vitest и пару зависимостей к нему. Мы используем yarn dedupe, чтобы в рамках SemVer использовалась только одна библиотека. При установке и babel/compat-data, и caniuse-lite зарезолвились на последнюю версию и всё сломалось! Этой проблемы можно было бы избежать, если yarn dedupe умел бы в другие стратегии, но пока что только latest.
Ну и напоследок: что сделали, чтобы такого больше не случалось?
1. Явно включили babel/plugin-proposal-class-properties.
2. Посмотрели, что пользователи 14 сафари приносят нам 1% деняк и явно указали safari >= 14 в конфиге браузерслиста.
3. Через resolutions явно установили browserslist и caniuse-lite в единственных экземплярах, чтоб прозрачно контролировать процесс обновления.
А что там с ишью? А ишью в бабеле так и висит без изменений…
Forwarded from Валя читает ишью
DefinitelyTyped is a monorepo!
DefinitelyTyped только что стал полноценным монорепозиторием на основое pnpm!
В DefinitelyTyped хранятся все пакеты в
Масштаб впечатляет — 8710 пакетов в одном репозитории!
Это миграции посвящены аж три поста:
1. What is DefinitelyTyped, and is it a monorepo? — как был устроен репозиторий и какие проблемы были до миграции.
2. Speeding up pnpm — название говорит само за себя. Естественно, при таком объёме всплывают не очень эффективные алгоритмы. Особенно круто, что показан процесс профилирования.
3. DefinitelyTyped is a monorepo! — как теперь всё устроено, какие проблемы сохранились (или появились) и что дальше.
Монументальная работа и огромный, в том числе и маркетинговый, успех для pnpm!
DefinitelyTyped только что стал полноценным монорепозиторием на основое pnpm!
В DefinitelyTyped хранятся все пакеты в
@types организации. Если пакет не поставляет типы сам, то всегда можно прислать пул-реквест в этот репозиторий и установить пакет отдельно (так делает, например, react с его @types/react).Масштаб впечатляет — 8710 пакетов в одном репозитории!
Это миграции посвящены аж три поста:
1. What is DefinitelyTyped, and is it a monorepo? — как был устроен репозиторий и какие проблемы были до миграции.
2. Speeding up pnpm — название говорит само за себя. Естественно, при таком объёме всплывают не очень эффективные алгоритмы. Особенно круто, что показан процесс профилирования.
3. DefinitelyTyped is a monorepo! — как теперь всё устроено, какие проблемы сохранились (или появились) и что дальше.
Монументальная работа и огромный, в том числе и маркетинговый, успех для pnpm!
Вышел ReactQuery 5.
Не то чтобы я рад этому, на мой взгляд есть SWR. Просто информация.
https://twitter.com/TkDodo/status/1714262102305632643
Не то чтобы я рад этому, на мой взгляд есть SWR. Просто информация.
https://twitter.com/TkDodo/status/1714262102305632643