Эксперимент разработчика, который переписал фронт для Telegram-ботов на Rust и разобрался, где язык реально выигрывает у JS.
Medium-разбор, почему XSS, CSP и supply-chain атаки всё ещё ломают SPA, и как встроить безопасность в CI/CD.
Автор показывает реальные кейсы, обходные пути и поднимает важный вопрос: имеет ли фреймворк право на полный контроль над DOM?
#read_watch #react #js #ts
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5🔥1
Кажется, простой счётчик — но React со своим batching (см. на картинке).
Ждём
React группирует (batch) обновления состояния внутри одного события. Обе строки читают старое значение count из замыкания, поэтому результат — 1.
Если новое состояние зависит от предыдущего — используйте функциональное обновление
setCount(prev => prev + 1);
setCount(prev => prev + 1);
Теперь результат будет 2.
React работает по снимкам состояния, а не по «живым» переменным — и именно это часто сбивает с толку.
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👍3
Новая директива — "use no memo" — отключает оптимизацию React Compiler.
Полезно, если что-то ломается после включения компилятора или нужно быстро изолировать баг.
function MyComponent() {
"use no memo";
// ...
}
— Полностью исключает функцию из оптимизации.
— Срабатывает даже при режиме all.
— Аналог — "use no forget".
— Должна стоять первой в функции.
— Только одинарные или двойные кавычки (не бэктики).
— Временное решение, не постоянный паттерн.
❤️ — Да, работает быстро
👍 — Пока изучаю
#readme #react
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5😢3🥰2🥱2
Передаём user через Dashboard и Sidebar, хотя они его не используют. Компоненты становятся «курьерами» для чужих данных.
Используйте композицию через children — передавай данные напрямую туда, где они нужны.
Что это даёт:
Когда что использовать:
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍4❤2👏1🌚1
🚀 AbortController — как правильно отменять запросы
➡️ Проблема (1 картинка):
Пользователь быстро переключает вкладки или вводит текст в поиске. Старые запросы продолжают работать и могут перезаписать актуальные данные.
➡️ Решение (2 картинка):
Отменяйте предыдущие запросы через AbortController
Что это даёт:
🟢 Нет race condition — обновляется только последний запрос
🟢 Браузер действительно отменяет запрос на уровне сети
🟢 Код без лишних флагов вроде isCancelled
🟢 Работает с API, которые поддерживают AbortSignal (fetch, Axios ≥0.22, React Query)
Когда применять:
— Автодополнение и live-поиск
— Переключение вкладок и фильтров
— Отмена запросов при размонтировании компонента
— Повторные запросы в useEffect при изменении зависимостей
⚠️ Важные детали:
controller.abort() можно вызывать многократно — это безопасно
Отмена происходит на стороне клиента — запрос может дойти до сервера
После abort() новые запросы с тем же controller не сработают (создавайте новый)
Поддержка:
🟣 Fetch API — нативно
🟣 Axios ≥ 0.22 — через signal
🟣 React Query — через queryFn
🐸 Библиотека фронтендера
#hotfix #react
Пользователь быстро переключает вкладки или вводит текст в поиске. Старые запросы продолжают работать и могут перезаписать актуальные данные.
Отменяйте предыдущие запросы через AbortController
Что это даёт:
Когда применять:
— Автодополнение и live-поиск
— Переключение вкладок и фильтров
— Отмена запросов при размонтировании компонента
— Повторные запросы в useEffect при изменении зависимостей
⚠️ Важные детали:
controller.abort() можно вызывать многократно — это безопасно
Отмена происходит на стороне клиента — запрос может дойти до сервера
После abort() новые запросы с тем же controller не сработают (создавайте новый)
Поддержка:
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🥰4❤3
'use client' + useEffect + fetch — данные загружаются на клиенте. Медленно, нужны loading states вручную, нет кэша.Server Components — просто
async/await в компоненте. Данные на сервере, кэширование через next: { revalidate }.Что это даёт:
revalidate: 60 = обновление раз в минуту Бонус-паттерны:
const [posts, users] = await Promise.all([
fetch('/api/posts'),
fetch('/api/users')
])
export async function createPost(data) {
'use server'
await db.posts.create(data)
revalidatePath('/posts') // Инвалидация кэша
}
<Suspense fallback={<Skeleton />}>
<Posts />
</Suspense>
⚠️ Fetch больше не кэшируется по умолчанию. Явно указывайте
next: { revalidate } или cache: 'force-cache'.#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5🔥3🥱1