Forwarded from © Как его там… (Dmitry Remezov)
🚦Роутинг
Или как мы топчемся на месте.
Современная веб разработка приучила нас к тому, что "роут" - компонент на какому-то пути.
Все популярные решения (react-router, Next.js, Angular, Vue и пр.), каждый со своими фичами сбоку, обыгрывают именно этот концепт.
Если попробовать дать им общее определение, то будет что-то вроде "Роутинг - механизм связи URL, данных и интерфейса".
Достаточно ли этого?
Действительно ли роутинг в вебе это просто
Для начала попробую сформулировать общее определение.
Роутинг в клиентских приложениях - механизм управления переходами между узлами пользовательских сценариев, состоянием этих узлов и их связью с внешним миром.
Покрывают ли это мейнстримные решения?
Безусловно, но настолько изолировано, ограничено и с привязкой к конкретному окружению, что мы не можем связать роутинг с остальной логикой без костылей, а всё, что не заложено в решение (а заложено только `.push("/another/path”)`), будет физически невозможно и придется реализовывать это самим.
Что такое роут?
Роутом, или, как я сформулировал выше, "узлом" может быть любой самодостаточный элемент пользовательского пути, например:
- Любая страница/лейаут
- Виджет выбора эмоджи
- Диалоговое окно
- Полноэкранный поиск (популярный нынче `⌘K`)
- Окно с выбором стикеров в телеграме в виде тултипа, открываемого при наведении
В приложенном коде я наметил возможную реализацию последнего примера, тултипа со стикерами в телеграме, на effector и atomic-router.
В тот момент, когда логика "что-то открылось/закрылось" перестает быть неважной деталью реализации и становится явным звеном пользовательского сценария, это "что-то" становится роутом.
Неважно открыт тултип или нет, это просто подсказка в интерфейсе, но, когда в нём целый виджет, "неважная деталь реализации" становится ключевой, у виджета появляется роут и логика работы с ним.
И не имеет значения что это - тултип, страница или модалка, это просто способ связи роута и внешнего мира.
Внешний мир
То, что мы привыкли считать неотъемлемыми частями роутинга, - лишь частные случаи.
В мобильных приложениях и виджетах нет URL.
В тестах не нужны компоненты.
В коде большинства продуктов нет голых путей, все работают через какую-то абстракцию по типу
Люди делают приложения, роутинг которых почти полностью построен на модалках.
В логике нет путей, в логике нет компонентов, всё это - внешний мир.
Расширяемость
В приложенных схемах я попробовал отразить разницу мейнстримных моделей и общей модели, выведу основные тезисы.
Ограниченная модель:
- Прибита к компонентам и к URL/файлам
- Нет явных сущностей роутов, вся работа через строки
- Любая "фича" - частный случай, а не системное решение (react-router тут явно лидирует)
- Реализует под капотом самопальную реактивную систему
Расширяемая модель:
- Строится поверх общей реактивной системы
- Дает базовые примитивы - явные сущности роутов и основные методы для построения логики
- Все "фичи" и сайд-эффекты (URL / компоненты / ...) реализуются поверх базовых примитивов
- Логика роутинга напрямую связана со всей остальной логикой
Ограниченная модель реализуется поверх расширяемой, но не наоборот.
Мораль
А нет её, в мейнстриме всё плохо, второй десяток лет с завидным упорством запрягаем старую клячу, надеюсь, мы всё же увидим прогресс.
А пока можете попробовать atomic-router.
Или как мы топчемся на месте.
Современная веб разработка приучила нас к тому, что "роут" - компонент на какому-то пути.
Все популярные решения (react-router, Next.js, Angular, Vue и пр.), каждый со своими фичами сбоку, обыгрывают именно этот концепт.
Если попробовать дать им общее определение, то будет что-то вроде "Роутинг - механизм связи URL, данных и интерфейса".
Достаточно ли этого?
Действительно ли роутинг в вебе это просто
{path, element, loader, …}?Для начала попробую сформулировать общее определение.
Роутинг в клиентских приложениях - механизм управления переходами между узлами пользовательских сценариев, состоянием этих узлов и их связью с внешним миром.
Покрывают ли это мейнстримные решения?
Безусловно, но настолько изолировано, ограничено и с привязкой к конкретному окружению, что мы не можем связать роутинг с остальной логикой без костылей, а всё, что не заложено в решение (а заложено только `.push("/another/path”)`), будет физически невозможно и придется реализовывать это самим.
Что такое роут?
Роутом, или, как я сформулировал выше, "узлом" может быть любой самодостаточный элемент пользовательского пути, например:
- Любая страница/лейаут
- Виджет выбора эмоджи
- Диалоговое окно
- Полноэкранный поиск (популярный нынче `⌘K`)
- Окно с выбором стикеров в телеграме в виде тултипа, открываемого при наведении
В приложенном коде я наметил возможную реализацию последнего примера, тултипа со стикерами в телеграме, на effector и atomic-router.
В тот момент, когда логика "что-то открылось/закрылось" перестает быть неважной деталью реализации и становится явным звеном пользовательского сценария, это "что-то" становится роутом.
Неважно открыт тултип или нет, это просто подсказка в интерфейсе, но, когда в нём целый виджет, "неважная деталь реализации" становится ключевой, у виджета появляется роут и логика работы с ним.
И не имеет значения что это - тултип, страница или модалка, это просто способ связи роута и внешнего мира.
Внешний мир
То, что мы привыкли считать неотъемлемыми частями роутинга, - лишь частные случаи.
В мобильных приложениях и виджетах нет URL.
В тестах не нужны компоненты.
В коде большинства продуктов нет голых путей, все работают через какую-то абстракцию по типу
.push(routes.product.edit({ id: ... })), ведь строки - неудобный и откровенно дырявый способ идентификации роутов.Люди делают приложения, роутинг которых почти полностью построен на модалках.
В логике нет путей, в логике нет компонентов, всё это - внешний мир.
Расширяемость
В приложенных схемах я попробовал отразить разницу мейнстримных моделей и общей модели, выведу основные тезисы.
Ограниченная модель:
- Прибита к компонентам и к URL/файлам
- Нет явных сущностей роутов, вся работа через строки
- Любая "фича" - частный случай, а не системное решение (react-router тут явно лидирует)
- Реализует под капотом самопальную реактивную систему
Расширяемая модель:
- Строится поверх общей реактивной системы
- Дает базовые примитивы - явные сущности роутов и основные методы для построения логики
- Все "фичи" и сайд-эффекты (URL / компоненты / ...) реализуются поверх базовых примитивов
- Логика роутинга напрямую связана со всей остальной логикой
Ограниченная модель реализуется поверх расширяемой, но не наоборот.
Мораль
А нет её, в мейнстриме всё плохо, второй десяток лет с завидным упорством запрягаем старую клячу, надеюсь, мы всё же увидим прогресс.
А пока можете попробовать atomic-router.
👍25👎7❤5🔥3
Уже через час будет круглый стол по архитектуре на Podlodka React Crew.
https://t.me/sergeysova/955
Увидимся там!
https://t.me/sergeysova/955
Увидимся там!
Telegram
Сова пишет…
Всем привет!
27 мая буду участвовать в круглом столе на конференции Podlodka React Crew. Вместе с Максимом Вишневским и Сергеем Самоховым обсудим архитектуру React-приложений, организацию компонентов и данных, React Compiler, реактивность в React и многое…
27 мая буду участвовать в круглом столе на конференции Podlodka React Crew. Вместе с Максимом Вишневским и Сергеем Самоховым обсудим архитектуру React-приложений, организацию компонентов и данных, React Compiler, реактивность в React и многое…
👎12 7❤5😁3👍2
Если вы присутствовали на круглом столе, напишите свой отзыв, пожалуйста.
Ну и здесь можно продолжить дискуссию, написать свои вопросы/комментарии/мнение.
А ещё, если есть желание увидеться со спикерами.
Я в ближайшее время в Армении.
Ну и здесь можно продолжить дискуссию, написать свои вопросы/комментарии/мнение.
А ещё, если есть желание увидеться со спикерами.
👎16👍12❤5🤩5🤬3
А вот и запись!
https://youtu.be/7p7dJTyz4i4
P.S.
Если вы хотите, чтобы мне было не пофиг на дизлайки, то пишите в комментах, почему их ставите. Критику готов послушать.
https://youtu.be/7p7dJTyz4i4
P.S.
YouTube
Круглый стол: Архитектурные вопросы в разрезе React. Максим Вишневский, Сергей Самохов, Сергей Сова
Программируешь на React, используешь хуки и популярные инструменты из npm? А что если мы скажем, что ко всему этому можно относиться более ответственно?
Поговорим об архитектуре в целом, о реакте как о рендер-движке, организации компонентов и данных, подумаем…
Поговорим об архитектуре в целом, о реакте как о рендер-движке, организации компонентов и данных, подумаем…
👎23🔥17👍16🤯8😱8🤬6
Вместо Next.js я использую vike.dev для SSR проектов.
Один из громадных плюсов это глубокая кастомизация (при необходимости), а также удобства для разработчика.
Столкнулся с проблемой: при клиентских переходах не запускается логика effector. При перезагрузке страницы, а именно запуске логики на сервере, всё ОК, но на клиенте при
Пошел смотреть в репу:
https://github.com/vikejs/vike/blob/main/vike/client/client-routing-runtime/getPageContextFromHooks.ts
А там куча комментов от разработчиков. В итоге, за пару минут чтения, а потом и исправления всё пофиксил.
Оказалось, что запуск логики нужно размещать в
Документация пока что не покрывает вопросы глубокой интеграции с СТМ. Хотя комментарии во внутреннем коде многое объясняют, за что спасибо разработчикам.
Один из громадных плюсов это глубокая кастомизация (при необходимости), а также удобства для разработчика.
Столкнулся с проблемой: при клиентских переходах не запускается логика effector. При перезагрузке страницы, а именно запуске логики на сервере, всё ОК, но на клиенте при
navigate(), пустота. Лишь в логах видно getPageContextFromHooks.Пошел смотреть в репу:
https://github.com/vikejs/vike/blob/main/vike/client/client-routing-runtime/getPageContextFromHooks.ts
А там куча комментов от разработчиков. В итоге, за пару минут чтения, а потом и исправления всё пофиксил.
Оказалось, что запуск логики нужно размещать в
+onBeforeRender.ts, а не в +onRenderHtml.tsx.Документация пока что не покрывает вопросы глубокой интеграции с СТМ. Хотя комментарии во внутреннем коде многое объясняют, за что спасибо разработчикам.
👎137👍35😁9😱7🤯6😢6
Как еще можно использовать patronum
Продолжаем разбираться зачем использовать patronum, если можно всё описать через
Такие шортхенды как
Для начала разберемся, что за кусочек логики тут описан,
Когда пользователь нажал Продолжить,
Взять email и OTP,
Если email И OTP валидны
И этап логина НЕ initial,
Начать верификацию OTP.
Без шортхендов фильтр выглядел бы так:
Продолжаем разбираться зачем использовать patronum, если можно всё описать через
combine().Такие шортхенды как
and, or, not, и т.д. позволяют сократить количество кода и повысить наглядность.Для начала разберемся, что за кусочек логики тут описан,
sample описывает один шаг в сценарии:clock: когда что-то случилось,source: взять данные отсюда,filter: если выполняется условие,target: передать сюда данные из source.Когда пользователь нажал Продолжить,
Взять email и OTP,
Если email И OTP валидны
И этап логина НЕ initial,
Начать верификацию OTP.
Без шортхендов фильтр выглядел бы так:
combine(
$emailValid,
$otpValid,
$stageInitial,
(email, otp, stageInitial) =>
email && otp && !stageInitial
),
😁194🤬25😱17🤔15👍14🤯13
Год назад я писал о том, что запускаю образовательную программу "Разработка по-взрослому". Ее цель — погрузить участников в разработку фронтенд-приложений, рассказать, зачем таким проектам нужна архитектура, как проще использовать React, в каких случаях полезен Effector и т.д.
Изначально в программе рассказывалось, как разработать приложение, но сами по себе знания в формате видео не дают практических навыков. Хоть рассказываемые практики остаются проверенными и работающими, в ряде случаев оказалось сложно донести их в видеоформате. Поэтому мы меняем формат: участники будут писать свой продукт, а мы выступим в роли менторов.
Помимо этого, мы улучшили формат программы: продолжительность видео уменьшили до 30 минут, переехали из Telegram на веб-платформу для более удобного просмотра материалов, дополнили видео статьями, а также добавили тесты для самопроверки.
Этот пост – начало открытого рассказа о нашем опыте создания образовательной программы на основе готового проекта. Наша задача в этой программе — научить писать и запускать веб-приложения в продакшен, используя лучшие практики, планирования разработки, деплоя в продакшен с резервными копиями и отслеживанием метрик.
#react #typescript #architecture #effector
В комментариях я напишу еще детали…
Изначально в программе рассказывалось, как разработать приложение, но сами по себе знания в формате видео не дают практических навыков. Хоть рассказываемые практики остаются проверенными и работающими, в ряде случаев оказалось сложно донести их в видеоформате. Поэтому мы меняем формат: участники будут писать свой продукт, а мы выступим в роли менторов.
Помимо этого, мы улучшили формат программы: продолжительность видео уменьшили до 30 минут, переехали из Telegram на веб-платформу для более удобного просмотра материалов, дополнили видео статьями, а также добавили тесты для самопроверки.
Этот пост – начало открытого рассказа о нашем опыте создания образовательной программы на основе готового проекта. Наша задача в этой программе — научить писать и запускать веб-приложения в продакшен, используя лучшие практики, планирования разработки, деплоя в продакшен с резервными копиями и отслеживанием метрик.
#react #typescript #architecture #effector
В комментариях я напишу еще детали…
🤬451👍32🔥13 9👎7 6
Мне нравится, что декларативный подход effector не так сильно раздувает API, которое необходимо, чтобы писать приложения практически любой сложности.
P.S.
Справедливости ради, сюда вполне можно докинуть patronum, atomic-router, farfetched, effector-*, и это всё будет раздувать необходимое для работы API.
Насколько мне известно, такая же ситуация обстоит и с другими стейт-менеджерами, поэтому приводить её не стал.
Решить проблему конечно можно, так как образовалась пачка устойчивых регулярных пакетов, можно сделать мета-пакет типа
P.S.
Справедливости ради, сюда вполне можно докинуть patronum, atomic-router, farfetched, effector-*, и это всё будет раздувать необходимое для работы API.
Насколько мне известно, такая же ситуация обстоит и с другими стейт-менеджерами, поэтому приводить её не стал.
Решить проблему конечно можно, так как образовалась пачка устойчивых регулярных пакетов, можно сделать мета-пакет типа
npm install framework-react, внутрь которого засунуть все необходимые обычно пакеты.👎66👍21❤5🤔4🔥3🗿1
SpaceX приводнили свой огромный корабль.
За 4 запуска им удалось достичь настолько амбициозной цели.
Я все это к чему, мы наглядно видим, как огромный проект разрабатывается итеративно.
Обязательно запускайте свои проекты на ранних стадиях, не ждите пока будут готовы все фичи.
Именно такие запуски дают возможность сделать фичи действительно полезными
За 4 запуска им удалось достичь настолько амбициозной цели.
Я все это к чему, мы наглядно видим, как огромный проект разрабатывается итеративно.
Обязательно запускайте свои проекты на ранних стадиях, не ждите пока будут готовы все фичи.
Именно такие запуски дают возможность сделать фичи действительно полезными
😁43👍26🤩4👎2🔥2
Если вам нужны Server Actions в vike.dev или другом серверном фреймворке, то рекомендую обратить внимание на telefunc.com
Конечно, не стоит прям писать запросы к бд в экшенах на SQL.
Есть более очевидный кейс, когда серверные экшены идеально подходят — обращение к внешним сервисам по API.
Если мы не хотим, чтобы в бандл попадал API Key, и чтобы этот ключ отображался во вкладке Network, то есть пользователь его вообще не мог увидеть.
Telefunc позволяет превратить обращение к файлу
При этом, если писать на typescript, типы описывающие функцию будут автоматически превращены в рантайм валидацию, то есть устранена дырища серверных экшенов в next.js
Проект от создателя vike.dev, то есть вы можете рассчитывать на хороший API и расширяемость. Автор при этом довольно активно рассматривает новые варианты использования, просто посмотрите issues (закрытые тоже).
А вот в issue по ссылке ниже, вы можете увидеть как я использую vike с effector (ну немного), а также подписаться на обновления.
https://github.com/brillout/telefunc/issues/109
Конечно, не стоит прям писать запросы к бд в экшенах на SQL.
Есть более очевидный кейс, когда серверные экшены идеально подходят — обращение к внешним сервисам по API.
Если мы не хотим, чтобы в бандл попадал API Key, и чтобы этот ключ отображался во вкладке Network, то есть пользователь его вообще не мог увидеть.
Telefunc позволяет превратить обращение к файлу
.telefunc.ts в fetch() запрос в клиентском бандле.При этом, если писать на typescript, типы описывающие функцию будут автоматически превращены в рантайм валидацию, то есть устранена дырища серверных экшенов в next.js
Проект от создателя vike.dev, то есть вы можете рассчитывать на хороший API и расширяемость. Автор при этом довольно активно рассматривает новые варианты использования, просто посмотрите issues (закрытые тоже).
А вот в issue по ссылке ниже, вы можете увидеть как я использую vike с effector (ну немного), а также подписаться на обновления.
https://github.com/brillout/telefunc/issues/109
👍19🔥2❤1
Доброе утро.
Через час начнется GitHub Galaxy!
Я присутствовать не смогу, хотя очень хотел. Буду стримить про effector
https://galaxy.github.com/
Через час начнется GitHub Galaxy!
Я присутствовать не смогу, хотя очень хотел. Буду стримить про effector
https://galaxy.github.com/
GitHub Galaxy
Unlock the power of AI-native development for your organization. Explore GitHub’s roadmap, see secure workflows in action, and get practical tips to boost team collaboration and address vulnerabilities at scale.
👍15🔥6👎3
Forwarded from 🧊 siberiacancode x IT-ХОЗЯЕВА
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
☄️ effector в действие, что изменилось за год, feat Сергей Сова (effector 22-24)
☄️ effector - https://effector.dev/
☄️ effector ru telegram - https://t.me/effector_ru
☄️ канал создателя effector - https://t.me/lines_of_code_diagrams
github repo - https://github.com/debabin/effector-power
Таймкоды ⌛️
00:00 Старт стрима
01:30 Вступление…
☄️ effector ru telegram - https://t.me/effector_ru
☄️ канал создателя effector - https://t.me/lines_of_code_diagrams
github repo - https://github.com/debabin/effector-power
Таймкоды ⌛️
00:00 Старт стрима
01:30 Вступление…
❤21🔥8👍5👎3🌚2 2
🧊 siberiacancode x IT-ХОЗЯЕВА
Мы готовы начинать.
Вы готовы подключаться?
Вы готовы подключаться?
🔥17👎15 5💯4❤2🤔2
Forwarded from Монада Кедавра (Дима Zerꙫbias)
Блокировка cookies замедляет веб, к радости Google
Многие наверняка уже слышали о скорой всеобщей блокировке third party cookies, на которой строится заработок рекламных и партнерских программ и заметной части веба в целом. В safari и firefox трекинг пользователя через куки на сторонних сайтах выключен уже довольно давно, но Chromium, разрабатываемый бизнесом построенным на рекламе, бан кукис всё откладывает и откладывает, хотя британские законодатели давят на них и в конце концов вынудят полностью отказаться от такого трекинга.
Казалось бы, замечательно, улучшение приватности, одни плюсы? Оказалось, что у этой медали есть вторая сторона: отсутствие нормальных альтернатив. Недавно, я в свой практике увидел несколько новых заходов на то, как вскоре будут работать все: жесткий кастомный фингерпринтинг. Бизнес, построенный на рекламе то умирать не планирует, а раз нельзя трекать через куки, но можно вставлять свои скрипты партнерам, то каждая сеть лично для себя начнёт собирать свой собственный слепок пользователя для идентификации.
Фингерпринт скрипт — это код, который пытается собрать как можно больше информации о системе и юзере, проверяя на расхождения в реализациях различных браузеров и девайсов. Вы вот например знали, что в V8 есть console.context чтобы вылезти мимо оберток типа роллбара и писать в консоль напрямую? А скрипт знает, и запишет, что у юзера движок V8 в таком-то диапазоне версий. Создаст невидимый canvas чтобы проверить нюансы работы gpu. Проверит все плагины браузера. Попробует написать в почивший WebSQL. Заглянет к typeof document.all. Короче задействует как можно больше дырок чтобы создать уникальную комбинацию параметров, чтобы отличить одного юзера от другого. Можете себе представить, насколько медленно это работает?
А теперь представьте, что вскоре у каждой партнерки будет свой скрипт фингерпринта, потому что практики переиспользования кода в этой части индустрии нет, каждый скрипт уникальный и независимый.
В итоге, количество скриптов будет ограничено только количеством партнерок у сайта. Ну, к примеру, штук 15. Каждый скрипт в 80-400 кб веса и по 200 мс работы.
Кажется, я представлял себе будущее с запретом на трекинг слегка иначе
И тут возникает вопрос, а как планирует жить гугл, почему он не торопится сделать альтернативу? А у него оказывается всё хорошо. Спасибо недавнему сливу документации к движку гугла, теперь мы знаем, что для себя любимых в гугл оставили возможность собирать данные напрямую с пользователей Chrome и для них этот запрет уже роли не играет, это пройденный этап. Этап на пути к процветанию в технологической монополии: для нас есть метрики прямо в браузере, для вас — 5 метров фингерпринтов.
К счастью, движущая сила всей этой истории, британские законодатели, явно не в восторге от таких раскладов и предлагают гуглу подумать ещё
Гугл пробует что-то сделать, но пока это выглядит довольно странно, технология Related Website Sets для работы требует открытия PR на гитхабе, мержить который будут сотрудники гугла. Очень удобно, спасибо, это точно поможет снизить уровень монополизации.
И тут возникает интересный вопрос — а куда мы в итоге движемся?
Я вижу столкновение двух непреодолимых сил: желания рекламных бизнесов выжить и стремление европейских регуляторов снизить уровеньчужой слежки за своими гражданами. Отказ от кукис не обсуждается, это явно проблема с приватностью, но ведь и фингерпринты же по прежнему работают? Если ввести аналоги кукис но урезанный на пол шишечки, то что мешает новой Cambridge analytica вновь слить все наработанные данные на сторону? Зачем всё это противостояние, если конечная проблема не техническая реализация cookies а сама модель рекламного бизнеса? Зачем это всё, если всё останется как есть, но с фингерпринт-скриптами?
Много вопросов, мало ответов
Многие наверняка уже слышали о скорой всеобщей блокировке third party cookies, на которой строится заработок рекламных и партнерских программ и заметной части веба в целом. В safari и firefox трекинг пользователя через куки на сторонних сайтах выключен уже довольно давно, но Chromium, разрабатываемый бизнесом построенным на рекламе, бан кукис всё откладывает и откладывает, хотя британские законодатели давят на них и в конце концов вынудят полностью отказаться от такого трекинга.
Казалось бы, замечательно, улучшение приватности, одни плюсы? Оказалось, что у этой медали есть вторая сторона: отсутствие нормальных альтернатив. Недавно, я в свой практике увидел несколько новых заходов на то, как вскоре будут работать все: жесткий кастомный фингерпринтинг. Бизнес, построенный на рекламе то умирать не планирует, а раз нельзя трекать через куки, но можно вставлять свои скрипты партнерам, то каждая сеть лично для себя начнёт собирать свой собственный слепок пользователя для идентификации.
Фингерпринт скрипт — это код, который пытается собрать как можно больше информации о системе и юзере, проверяя на расхождения в реализациях различных браузеров и девайсов. Вы вот например знали, что в V8 есть console.context чтобы вылезти мимо оберток типа роллбара и писать в консоль напрямую? А скрипт знает, и запишет, что у юзера движок V8 в таком-то диапазоне версий. Создаст невидимый canvas чтобы проверить нюансы работы gpu. Проверит все плагины браузера. Попробует написать в почивший WebSQL. Заглянет к typeof document.all. Короче задействует как можно больше дырок чтобы создать уникальную комбинацию параметров, чтобы отличить одного юзера от другого. Можете себе представить, насколько медленно это работает?
А теперь представьте, что вскоре у каждой партнерки будет свой скрипт фингерпринта, потому что практики переиспользования кода в этой части индустрии нет, каждый скрипт уникальный и независимый.
В итоге, количество скриптов будет ограничено только количеством партнерок у сайта. Ну, к примеру, штук 15. Каждый скрипт в 80-400 кб веса и по 200 мс работы.
Кажется, я представлял себе будущее с запретом на трекинг слегка иначе
И тут возникает вопрос, а как планирует жить гугл, почему он не торопится сделать альтернативу? А у него оказывается всё хорошо. Спасибо недавнему сливу документации к движку гугла, теперь мы знаем, что для себя любимых в гугл оставили возможность собирать данные напрямую с пользователей Chrome и для них этот запрет уже роли не играет, это пройденный этап. Этап на пути к процветанию в технологической монополии: для нас есть метрики прямо в браузере, для вас — 5 метров фингерпринтов.
К счастью, движущая сила всей этой истории, британские законодатели, явно не в восторге от таких раскладов и предлагают гуглу подумать ещё
The UK wants to make sure that Google isn't making changes to Chrome to prop up its advertising business at the expense of competitors.
Гугл пробует что-то сделать, но пока это выглядит довольно странно, технология Related Website Sets для работы требует открытия PR на гитхабе, мержить который будут сотрудники гугла. Очень удобно, спасибо, это точно поможет снизить уровень монополизации.
И тут возникает интересный вопрос — а куда мы в итоге движемся?
Я вижу столкновение двух непреодолимых сил: желания рекламных бизнесов выжить и стремление европейских регуляторов снизить уровень
Много вопросов, мало ответов
Ars Technica
Google can’t quit third-party cookies—delays shut down for a third time
Google says UK regulator testing means the advertising tech will last until 2025.
😢11👍5❤3👎3🙈2
Сова пишет…
Если вы пользуетесь Godaddy, лучше мигрировать настолько быстро насколько возможно
История получила продолжение
😁9💔5👍3😡3🤯2✍1
Ещё через 18 версий наконец-то все поймут, чем JSX был лучше всех птичьих синтаксисов.
https://dev.to/oler/introduction-to-let-in-angular-18-cm6
https://dev.to/oler/introduction-to-let-in-angular-18-cm6
🙈41😁12👎7💯5😱3🌚3
О, столько лет понадобилось, чтобы понять очевидные с самого начала вещи?
https://bobaekang.com/blog/component-colocation-composition/
What most stood out to me from the discussion, however, was the core team’s early response to the community feedback: initiating data fetching in individual components under a suspense boundary, a pattern known as fetch-on-render, is a bad practice. The recommended alternative was to prefetch data outside the components that read the data. But wait, isn’t React all about composing components? Components that contain everything they need—state, logic, and view—all nicely colocated? Are components not sufficient?
https://bobaekang.com/blog/component-colocation-composition/
😁14👎2
Сова пишет…
А вот тут есть и другие полезные каналы про фронтенд. https://t.me/addlist/Z6Efi4jXwe9lODcy Я подписан как минимум на половину каналов из папки.
Продолжаю делиться полезными каналами.
В этот раз интересных тем больше.
https://t.me/addlist/3gJJbGAm4oBiN2Uy
В этот раз интересных тем больше.
https://t.me/addlist/3gJJbGAm4oBiN2Uy
Раз уж начал постить в канал, то расскажу свою недавнюю боль.
Поднимал SSR проект на fastify, очень хотелось запустить его на serverless платформе. Чуть-чуть поресерчил и решил снова воспользоваться Cloudflare Workers.
Во первых, документация Cloudflare конечно не плоха, но её очень не хватает, а в некоторых случаях было прям больно. Часть гайдов лежит в блоге, где 2 версия wrangler, а поэтому несовместимы с 3 версией.
Во вторых, если погуглить
fastify-edge не получилось завести, все время вываливались ошибки из кишков.
А в гайде есть все платформы, кроме cloudflare, видимо не просто так.
Потом еще подкинул проблем telefunc, о котором я уже писал, от автора vike. Он использует динамический
В общем, грусть печаль.
По итогу запустил на fly.dev, пока ищу альтернативу.
Поднимал SSR проект на fastify, очень хотелось запустить его на serverless платформе. Чуть-чуть поресерчил и решил снова воспользоваться Cloudflare Workers.
Во первых, документация Cloudflare конечно не плоха, но её очень не хватает, а в некоторых случаях было прям больно. Часть гайдов лежит в блоге, где 2 версия wrangler, а поэтому несовместимы с 3 версией.
Во вторых, если погуглить
fastify on cloudflare workers, то вывалится fastify-edge, который experimental, а также гайд fastify serverless.fastify-edge не получилось завести, все время вываливались ошибки из кишков.
А в гайде есть все платформы, кроме cloudflare, видимо не просто так.
Потом еще подкинул проблем telefunc, о котором я уже писал, от автора vike. Он использует динамический
import('node:path'), который не поддерживается Cloudflare Workers.В общем, грусть печаль.
По итогу запустил на fly.dev, пока ищу альтернативу.
👍4👎3🤔3
Одним из кандидатов в универсальные серверные javascript-фреймворки стал Hono.dev.
Запускается на всех платформах: serverless, deno, bun, nodejs.
Имеет весьма неплохую систему композиции роутов.
В комплекте куча миддлвар разной степени полезности.
Даже есть простой jsx renderer, чтобы React не тащить.
В качестве renderer я хочу использовать vike.dev.
И hono продолжит мне помогать, так как предлагает RPC клиент взамен fetch/axios/...
Из браузера можно делать запросы к API-роутам hono через hono/client, с проверкой типов в рантайме.
Типы для typescript выводятся автоматически, да еще и соответствуют структуре серверного роутинга.
Выглядит очень интересно.
Запускается на всех платформах: serverless, deno, bun, nodejs.
Имеет весьма неплохую систему композиции роутов.
В комплекте куча миддлвар разной степени полезности.
Даже есть простой jsx renderer, чтобы React не тащить.
В качестве renderer я хочу использовать vike.dev.
И hono продолжит мне помогать, так как предлагает RPC клиент взамен fetch/axios/...
Из браузера можно делать запросы к API-роутам hono через hono/client, с проверкой типов в рантайме.
// Server Side
import { Hono } from 'hono'
import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'
const app = new Hono()
app.get(
'/hello',
zValidator(
'query',
z.object({ name: z.string() })
),
(c) => {
const { name } = c.req.valid('query')
return c.json({
message: `Hello! ${name}`,
})
}
)
// Browser Side
import type { AppType } from './server'
import { hc } from 'hono/client'
const client = hc<AppType>('/api')
const res = await client.hello.$get({
query: {
name: 'Hono',
},
})
Типы для typescript выводятся автоматически, да еще и соответствуют структуре серверного роутинга.
Выглядит очень интересно.
✍19👍11🔥5❤1