Create React App – всё! Проект помечен как deprecated на официальном сайте и были добавлены соответствующие сообщения при установке.
В самом начале Create React App был самым популярным решением, которое позволяло создать приложение очень быстро и оно работало. Для большинства проектов такого было достаточно – не нужно было копаться в конфигах, что-то настраивать и проверять работоспособность. В этом же и был минус Create React App - невозможность гибкой настройки, потом появлялись различные решения, которые могли “подлезть” в CRA, или вариант с eject’ом всех настроек – разобраться потом было нелегко.
Время доказало – разработчикам нужно уметь гибко настраивать их приложения, выбирать что оптимизировать, а что нет, настраивать несколько вариантов сборки, писать свои плагины и т.д. И тогда начали появляться различные современные решения - Rollup, Vite, RSBuild, Farm и нет им конца, причём они постоянно соревнуются в скорости сборки приложений.
Современным подходом создания React-приложений теперь считаются фреймворки: Next.js, Remix (ныне React Router 7) и Expo. Для более классического вида есть различные шаблоны и современные сборщики: Vite, Parcel RSBuild и т.д., которые позволяют создать SPA.
Команда TanStack тоже не осталась в стороне и очень оперативно представила новый Create TSRouter App, полностью построенный на своих решениях.
Create React App умер, да здравствует Create TSRouter App!
Вышел Prettier 3.5 и добавил несколько приятных фич: objectWrap – правила форматирования объектов, и experimentalOperatorPosition – экспериментальная опция для переноса операторов, которая полезна при форматировании длинных выражений.
Для форматирования объектов появился новый параметр – objectWrap, теперь можно принудительно “свернуть” объект, если он помещается на одну строку.
Форматирование объектов
До версии 3.5 форматирование объектов происходило либо по длине строки – если не помещался в одну строку, то он “раскрывался” на несколько строк; либо по первому символу после литерала – если перенос, то тоже будет “раскрыт”.
const person = { firstName: 'John', lastName: 'Doe' };const name = { name: 'Effective TypeScript', type: 'book' };
Prettier нередко добавляет фичи в виде экспериментов, так и был добавлен experimentalOperatorPosition, который позволяет объяснить форматтеру, в каком месте расставлять переносы строк в математических операциях: в в конце или в начале.
Дополнительными плюшками релиз не обделили: и конфиги на TypeScript’е писать разрешили, и переносы строк в JSX и CSS улучшили и дотюнили форматирование для Vue, Angular и Markdown.
Таски. Они везде, мы постоянно пишем код, который можно назвать тасками. Разделить их тоже можем — на макротаски и микротаски, хоть это и не всегда верное утверждение1. Для простоты назовем весь синхронный код, где бы он не вызвался - макротасками. Использование макротасок заставляет и браузер выполнять определенные процессы внутри них, например reflow2 и repaint3. Такое поведение может стать бутылочным горлышком в некоторых сценариях, например расчет размеров элементов, особенно если их много. Решением может быть разделение макротаски на несколько макротасок.
Как много вы можете придумать способов разбиения долгих макротасок? Я смог придумать только 3 — setTimeout, requestAnimationFrame, requestIdleCallback, и оказалось, что не все способы хороши. А вот Алекс МакАртур, автор статьи “Способы разбиения длинных задач в JavaScript” рассказал больше способов:
setTimeout;
async/await & setTimeout;
scheduler.postTask();
scheduler.yield();
requestAnimationFrame();
MessageChannel();
и использование Web Workers.
А вот использование requestIdleCallback автор исключает, т.к. он не гарантирует исполнение кода.
[! tip] Не стоит забывать про requestIdleCallback
Данная функция является очень важной для оптимизации приложений, например тех же часто вызывающихся reflow. Функция попросит браузер найти “окошко” для его исполнения, хоть оно может и найтись сильно позже.
Как отмечает автор, лучшим вариантом является scheduler.yield(), но пока Scheduler есть только в Хроме мы можем использовать подход с async/await & setTimeout:
await new Promise((resolve) => setTimeout(resolve, 0));
Сноски
В спецификации ECMAScript нет прямого упоминания “макрозадач” и “микрозадач”, данные термины удобны в рамках описания работы Event Loop. ↩
Процесс, при котором браузер пересчитывает позиции и размеры элементов. Может вызвано обращением к clientHeight, clientWidth и т.д., подробнее описано в What forces layout / reflow. ↩
Процесс, при котором браузер перерисовывает изменения, затронутые reflow. ↩
TypeScript 5.8 – учимся использовать стираемый синтаксис
TypeScript имеет некоторые фичи, которые после компиляции добавляют код – enum’ы, алиасы импортов, модификаторы параметров классов. С Node версии 22.6 была добавлена экспериментальная фича, которая позволяет опускать типизацию и запускать код на TypeScript’е в JavaScript-движке, а с версии 23.6 фича включена по умолчанию.
Некоторые решения добавили возможность использовать сразу TypeScript с ограничениями для написания кода и конфигов, например как Prettier 3.5, и для этого был добавлен специальный флаг для TypeScript: --erasableSyntaxOnly. Наряду с этой фичей есть proposal для браузеров, который также бы позволил просто вставлять код на TypeScript в консоль и исполнять, но пока он находится в Stage 1.
Новый режим позволяет писать, к примеру, CLI, которые не нужно будет дополнительно конвертировать в .js-файлы, а можно будет сразу исполнять, или писать серверные приложения на Node.js без установки дополнительных зависимостей (напр. vite-node) для запуска TypeScript-файлов.
Релиз TypeScript 5.8 принесёт ещё несколько полезных фич: улучшили проверки ветвления типов в return’ах и улучшение генерации файлов деклараций.
В конце 2024 было ясно, что в будущем CSS будет много перемен – кастомные функции и миксины1, и новые псевдоклассы2, всё это было запланировано. Однако, не ожидалось, что работы по ним, их прототипирование начнёт так скоро.
Bramus (Bram Van Damme) анонсит нам функции в CSS, и это действительно “изменит правила игры”. На данном этапе кастомные функции рассматриваются как расширение синтаксиса CSS-переменных и они уже потрясающие:
Кастомные CSS-функции поддерживают ветвление, но не поддерживают early-return, а это значит, что сначала описать media query или container query и после него стандартное значение функции не выйдет:
CSS Values and Units Module Level 5 – спецификация описывает работу со стандартными единицами измерения, манипуляции со значениями, синтаксис свойств CSS. ↩