Please open Telegram to view this post
VIEW IN TELEGRAM
😁8🥰5
useEffect(() => {
initAnalytics();
}, []);
На вид — инициализация один раз.
— React в StrictMode выполняет дополнительный цикл
setup → cleanup → setup
— аналитика / подписки / запросы могут выполняться повторно
— баг выглядит как «только у меня локально»
Это dev-only проверка в React 18+, чтобы находить неидемпотентные сайд-эффекты и отсутствие cleanup.
useEffect(() => {
const dispose = initAnalytics(); // возвращает отписку
return () => {
dispose?.();
};
}, []);
Cleanup должен полностью зеркалить всё, что было создано в effect.
// analytics.ts
let inited = false;
export function initAnalyticsOnce() {
if (inited) return;
inited = true;
initAnalytics();
}
useEffect(() => {
initAnalyticsOnce();
}, []);
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1🥰1
Один из ключевых механизмов, влияющих на память, производительность и стабильность приложения.
— как движок решает, что можно удалить;
— что такое достижимость и утечки памяти;
— сильные и слабые ссылки;
— Mark & Sweep и поколения памяти;
— зачем нужны WeakMap, WeakSet, WeakRef.
#under_hood
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥1
Явное управление ресурсами в JavaScript — про using и Symbol.dispose/asyncDispose: способ «гарантированно прибраться» при выходе из области видимости (как try/finally, но более декларативно). Полезно для стримов, подписок, блокировок и любых API, где легко забыть сделать cleanup.
Как ограничивать скорость отдельного сетевого запроса в Chrome — полезная техника, когда надо проверить, как ведёт себя приложение при «очень медленной» загрузке конкретной зависимости, а не всего трафика сразу.
#read_watch
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4
Когда вы вешаете сразу несколько анимаций на один элемент, они обычно дерутся.
Свойство animation-composition решает это:
.element {
animation: fade 2s, slide 2s;
animation-composition: add;
}
Чтобы не объединять всё в один @keyframes, не городить JS, и не терять голову от конфликтов.
Работает в Chrome, Firefox, и постепенно внедряется в остальное.
#readme
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🥰3👾2
Область видимости (scope) — это правила, по которым переменные «видны» в разных частях кода.
Основные виды:
function test() {
let msg = "Hi!";
}
console.log(msg); // Ошибка: msg не существует вне функции
Почему так:
msg создана внутри функции и доступна только там. Вне — она как будто не существует.
— Избегаешь конфликтов между переменными.
— Пишешь чистый и предсказуемый код.
— Не ловишь ошибки из-за «невидимых» переменных.
#read_watch
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6❤3
Frontend Developer — от 4 500 €, помощь с переездом (Лимассол)
Middle Frontend Developer — from 3 200 $ gross, fully remote
Junior JS-developer — удаленно
Please open Telegram to view this post
VIEW IN TELEGRAM
👏3😁3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥰3🌚3
🚦 Быстрый аудит сайта через CLI
Одна команда — и вы видите:
🔵 Когда использовать:
— После деплоя
— Если сайт «ощущается» медленным
— Для сравнения staging / prod
— Перед оптимизацией
🔢 Сохранить отчёт:
Подходит для тикета или демонстрации заказчику.
📍 Навигация: [Вакансии]
🐸 Библиотека фронтендера
#readme
lighthouse https://site.com --view
Одна команда — и вы видите:
• LCP
• CLS
• TTFB
• Вес страницы
• Unused JS/CSS
— После деплоя
— Если сайт «ощущается» медленным
— Для сравнения staging / prod
— Перед оптимизацией
lighthouse https://site.com --output html --output-path ./report.html
Подходит для тикета или демонстрации заказчику.
#readme
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🥰2
This media is not supported in your browser
VIEW IN TELEGRAM
Sortable позволяет перетаскивать элементы внутри одного списка и между разными контейнерами. Основана на нативном Drag & Drop API браузера.
API лаконичный и понятный, без сторонних зависимостей. Есть плавная анимация при перемещении, корректно работает как на десктопах, так и на тач-устройствах. Без проблем интегрируется с популярными фронтенд-фреймворками.
#stack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2🥰2
Исправлен лаг при работе с тяжёлыми трейсами. Flame chart теперь листается и масштабируется заметно плавнее.
В Performance появились маркеры soft navigation и soft LCP — проще анализировать переходы без перезагрузки страницы.
Теперь корректно работает с pretty-print и source maps. Можно реально увидеть, какая строка кода грузит CPU.
В Network появилась отдельная колонка, показывающая ресурсы, блокирующие рендер (JS, CSS, шрифты). Удобно для оптимизации First Paint.
Можно замедлять конкретные ресурсы, а не всю сеть — полезно для тестирования медленных зависимостей.
Теперь можно вставлять изображения из буфера обмена прямо в чат для разбора визуальных проблем.
Плюс десятки мелких фиксов, улучшения доступности и доработки MCP Server для автоматизации.
#release_digest
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4🔥3
🧵 10 приёмов работы со строками в JavaScript
Строки в JavaScript — это не просто текст. Это полноценный инструмент для трансформации, валидации и подготовки данных.
1️⃣ Развернуть строку в одну строку кода
2️⃣ Проверить наличие подстроки
Быстро и читаемо — без indexOf.
3️⃣ Сделать каждое слово с заглавной буквы
4️⃣ Убрать пробелы по краям
Полезно при работе с формами и вводом пользователя.
5️⃣ Повторить строку несколько раз
6️⃣ Посчитать количество вхождений подстроки
7️⃣ Дополнить строку до нужной длины
Удобно для форматирования ID и чисел.
8️⃣ Заменить все вхождения
9️⃣ Оставить только буквы или только цифры
Регулярки решают 80% задач по очистке данных.
🔟 Разбить строку в массив символов
Работает быстрее и аккуратнее, чем split('').
💡 Эти приёмы закрывают большинство повседневных задач: форматирование, валидацию, очистку, трансформацию. Чем лучше вы владеете строками — тем меньше лишней логики пишете.
📍 Навигация: [Вакансии]
🐸 Библиотека фронтендера
#readme #js
Строки в JavaScript — это не просто текст. Это полноценный инструмент для трансформации, валидации и подготовки данных.
const reverse = str => str.split('').reverse().join('');
reverse("hello"); // "olleh»
"hello world".includes("world"); // true
Быстро и читаемо — без indexOf.
const toTitleCase = str =>
str.split(' ')
.map(w => w[0].toUpperCase() + w.slice(1).toLowerCase())
.join(' ');
toTitleCase("javascript string tricks");
// "Javascript String Tricks»
" hello world ".trim(); // "hello world»
Полезно при работе с формами и вводом пользователя.
"hello ".repeat(3);
// "hello hello hello «
const count = (str, sub) => str.split(sub).length - 1;
count("hello world, hello JS", "hello"); // 2
"42".padStart(5, "0"); // "00042»
Удобно для форматирования ID и чисел.
"banana".replaceAll("a", "o"); // "bonono"
Если replaceAll недоступен:
"banana".replace(/a/g, «o»);
const onlyLetters = str => str.replace(/[^a-zA-Z]/g, '');
onlyLetters("a1b2c3"); // "abc»
Регулярки решают 80% задач по очистке данных.
[..."hello"];
// ['h', 'e', 'l', 'l', ‘o’]
Работает быстрее и аккуратнее, чем split('').
#readme #js
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍5🥰2
В CSS тестируется новая возможность — scroll-triggered animations. Теперь скролл может быть не «двигателем кадров», а сигналом запуска анимации. Это решает проблему «растянутых» reveal-эффектов и делает UI-переходы естественными.
— разницу между scroll-driven и scroll-triggered
— timeline-trigger и animation-trigger
— enter/exit range и сценарии действий
— комбинацию с scroll-driven
— масштабирование через attr()
Работает пока только в Chrome Canary (с флагом Experimental Web Platform features). В стабильных браузерах — ещё нет поддержки.
#blueprint
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🥰3