«Я фронтендер, зачем мне матрицы?»
Пока AI-инструменты пишут код за нас, ценность разработчика смещается. Теперь круто не просто сверстать интерфейс, а понимать, как работает ML-модель, которую вы подключаете по API.
Математика — это универсальный язык, который не устаревает, в отличие от JS-фреймворков.
Мы обновили курс по математике для AI. Это ваш шанс выйти за рамки браузера.
Что будем делать (на Python, но логика важнее):
🔹 Разбирать линейную алгебру для работы с данными;
🔹 Строить линейную регрессию с нуля;
🔹 Создавать простые рекомендательные системы через SVD-разложение.
Живые вебинары уже начались, но вы успеваете догнать группу.
Регистрация открыта до 9 декабря:
https://clc.to/LojFzw
Пока AI-инструменты пишут код за нас, ценность разработчика смещается. Теперь круто не просто сверстать интерфейс, а понимать, как работает ML-модель, которую вы подключаете по API.
Математика — это универсальный язык, который не устаревает, в отличие от JS-фреймворков.
Мы обновили курс по математике для AI. Это ваш шанс выйти за рамки браузера.
Что будем делать (на Python, но логика важнее):
🔹 Разбирать линейную алгебру для работы с данными;
🔹 Строить линейную регрессию с нуля;
🔹 Создавать простые рекомендательные системы через SVD-разложение.
Живые вебинары уже начались, но вы успеваете догнать группу.
Регистрация открыта до 9 декабря:
https://clc.to/LojFzw
🥰5👍2🥱1
This media is not supported in your browser
VIEW IN TELEGRAM
Восемь способов выбрать нужный элемент без лишних классов. От базовых :first-child и :last-child до продвинутых формул с :nth-child(3n+1). Один селектор вместо десятка классов.
#readme #css
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🥰3🔥1
Всё началось невинно. Нужен debounce для поиска — поставил Lodash. Нужно форматировать даты — Moment.js. Иконки? React Icons, конечно.
Через три месяца разработки делаю
npm run build и вижу:⚠️ 2.8 MB main.js
Решил разобраться. Установил webpack-bundle-analyzer и офигел от того, что увидел.
Оказалось, я тащил в проект кучу лишнего:
Lodash (70 KB)
Импортировал всю библиотеку ради двух функций. Остальные 200+ методов просто висят мёртвым грузом.
Moment.js (70 KB)
Мне нужен был толькоformat('DD.MM.YYYY'), а получил все локали мира, парсеры timezone и calendar-системы.
React Icons
По проекту набралось 50+ импортов разных иконок. Bundle незаметно разросся.
Картинки в bundle
Webpack превращал изображения в base64 и пихал прямо в JavaScript. Hero-картинка на 200 KB стала частью main.js.
Начал с простого — заменил импорты на точечные:
// Было: тащит 70 KB
import _ from 'lodash'
// Стало: всего 1-2 KB
import debounce from 'lodash/debounce'
Дальше пошёл по библиотекам и нашёл более лёгкие альтернативы:
Moment.js (70 KB) → date-fns (11 KB)
Axios (13 KB) → fetch API (нативно)
Для роутинга включил code splitting. Теперь страницы грузятся только когда пользователь на них переходит:
const Dashboard = lazy(() => import('./Dashboard'))
const Settings = lazy(() => import('./Settings'))
<Suspense fallback={<Loader />}>
<Dashboard />
</Suspense>
С картинками разобрался так: большие файлы переложил в
/public, конвертнул в WebP (экономия 30-50%), добавил loading="lazy".И последнее — настроил size-limit в CI/CD. Теперь если кто-то попытается влить PR с раздутым bundle, пайплайн упадёт:
"size-limit": [{
"path": "build/static/js/*.js",
"limit": "500 KB"
}]
Было:
• Bundle: 2.8 MB
• Загрузка на 3G: 8.5 секунд
• Lighthouse: 45/100
Стало:
• Main bundle: 380 KB
• Остальное в lazy chunks по 50-150 KB
• Загрузка на 3G: 1.2 секунды
• Lighthouse: 92/100
Сайт стал грузиться в 7 раз быстрее. Пользователи перестали жаловаться. Менеджер доволен.
Главная ошибка была в подходе. Я думал: «npm install — и готово, пакеты же для этого и есть!»
Но каждый килобайт в bundle — это реальное время загрузки. Особенно для людей не на оптоволокне.
У меня на MacBook сайт грузился моментально. А у пользователя с iPhone 8 в метро на 3G — 10 секунд чёрного экрана. Это разные миры.
Теперь перед каждым
npm install спрашиваю себя: мне правда нужна вся библиотека? Или хватит одной функции? Может, это вообще можно сделать нативно?И раз в спринт запускаю
npm run build && npm run analyze. Лучше увидеть проблему сейчас, чем в жалобах пользователей потом.#code_battle
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🥱4🥰2🔥1
Что обычно раздувает bundle в твоих проектах ❓
Anonymous Poll
36%
Тяжёлые библиотеки (Moment.js, Lodash целиком)
22%
UI-киты (Material-UI, Ant Design)
13%
Картинки и медиа (неоптимизированные изображения, видео, шрифты)
25%
Избыточные зависимости (неиспользуемый код, дубликаты пакетов, старые версии)
4%
State management и утилиты (Redux + middleware, форм-библиотеки, анимации)
🥰5
Каждый раз одно и то же: нужна модалка → гуглите библиотеку → тащите зависимости → настраиваете accessibility → фиксите баги с фокусом → плачете над z-index.
А что если браузер уже умеет всё это нативно?
Галерея с модалкой на чистом <dialog>: ноль библиотек, ноль кастомного JS для accessibility.
<dialog>
<form method="dialog">
<!-- Браузер сам управляет фокусом, Esc, backdrop -->
</form>
</dialog>
Из коробки:
#read_watch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🥰2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37❤2
Примеры кода для создания интерактивной доски задач в стиле Trello.
— HTML-разметка колонок и карточек задач
— CSS-стилизация с кастомными цветовыми тегами
— Drag & Drop через библиотеку SortableJS
— Профили задач с аватарами и датами
Готовый код для изучения и использования в проектах.
🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#readme #css #html #js
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🥰2👏2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1
👏4
В статье по ссылке разбирается, как новые примитивы — use(), <Suspense>, useTransition() и View Transitions — полностью заменяют старую связку useEffect + fetch и убирают большую часть ручной логики загрузки.
Выше — краткие карточки с ключевыми изменениями и примерами кода. Полный разбор и детали — в статье
#under_hood
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤🔥3😁2
Scrum_Guide.pdf
398.8 KB
Гайд от Кена Швабера и Джеффа Сазерленда — 17 страниц, которые задают единственный корректный способ понимать Scrum.
#readme #scrum
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1
Никаких больше “Cannot read property of undefined”!
// Опасно
const city = user.address.city;
// Ошибка, если address === undefined
// Многословно
const city = user && user.address && user.address.city;
// Безопасно и элегантно
const city = user?.address?.city ?? 'Не указан’;
Возвращает undefined, если слева null или undefined, и не пытается читать свойство дальше.
Возвращает правую часть только если слева null или undefined.
const volume = settings.volume ?? 0.5;
// Если volume = 0, вернёт 0 — корректно
const volume = settings.volume || 0.5;
// Если volume = 0, вернёт 0.5 — нежелательное поведение
— ответы API
— вложенные объекты конфигурации
— поля форм, которые могут отсутствовать
— опциональные коллбэки
// Массивы
const first = users?.[0]?.name ?? 'Гость';
// Функции
onClick?.();
// Сложные цепочки
const price = product?.variants?.[0]?.price?.amount ?? 0;
#hotfix #ts
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6❤3
Типы
any и unknown часто путают, но они работают совершенно по-разному!any — «отключает» TypeScript
let value1: any = "hello";
value1.toUpperCase(); // TS не проверяет
value1.someMethod(); // TS разрешает всё
value1.foo.bar.baz; // Никаких проверок
unknown — «безопасный any»
let value2: unknown = "hello";
value2.toUpperCase(); // Ошибка компиляции!
// Нужна проверка типа:
if (typeof value2 === 'string') {
value2.toUpperCase(); // Теперь работает
}
any — когда:
— Мигрируете JS → TS постепенно
— Работаете с legacy-кодом
— Но помните: это технический долг!
unknown — когда:
— Парсите JSON с бэкенда
— Работаете с пользовательским вводом
— Получаете данные из внешних API
— Обрабатываете ошибки в catch
// Плохо
function parseResponse(response: any) {
return response.data.user.name;
}
// Хорошо
function parseResponse(response: unknown) {
if (
response &&
typeof response === 'object' &&
'data' in response
) {
// Type guard для безопасной работы
return (response as {data: {user: {name: string}}}).data.user.name;
}
throw new Error('Invalid response');
}
unknown заставляет вас думать о безопасности типов, any — отключает эту защиту.#career_merge #ts #middle
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤🔥4🥰4