Что перестать делать в JavaScript в 2025 году
JavaScript развивается быстро. Паттерны кода, которые казались современными три года назад, теперь добавляют лишние байты, игнорируют улучшения платформы или полагаются на устаревшие API. Если вы разрабатываете production веб-приложения в 2025 году, вот JavaScript-антипаттерны, которых следует избегать, — и что использовать вместо них.
Ключевые выводы
- Устаревшие возможности, такие как операторы
with,__proto__иString.prototype.substr, следует заменить современными альтернативами. - Устаревшие библиотеки, такие как jQuery, Moment.js и Lodash, часто можно заменить нативными браузерными API и возможностями ES2023–ES2025.
- Современный CSS теперь справляется со многими задачами, которые ранее требовали JavaScript, включая container queries, селектор
:has()и анимации, привязанные к прокрутке. - Нативные ESM и легковесные бандлеры, такие как Vite, сделали CommonJS и RequireJS устаревшими для новых frontend-проектов.
Перестаньте использовать устаревшие возможности языка
Некоторые возможности JavaScript были объявлены устаревшими или заменены много лет назад, но они продолжают существовать в кодовых базах через копирование и привычку.
Исключите из своего арсенала:
- Операторы
with— Запрещены в строгом режиме с ES5. Они создают неоднозначную область видимости и нарушают оптимизации. __proto__— Используйте вместо этогоObject.getPrototypeOf()иObject.setPrototypeOf().String.prototype.substr— Устарел. Используйтеslice()илиsubstring().- Устаревшие статические свойства RegExp, такие как
RegExp.$1— Они нестандартны и ненадёжны в разных движках.
Это не крайние случаи. Линтеры помечают их не зря. Современные паттерны JavaScript предполагают, что вы уже от них отказались.
Перестаньте по умолчанию обращаться к устаревшим библиотекам
jQuery, Moment.js, Lodash и RequireJS решали реальные проблемы — в 2015 году. Сегодня платформа покрывает большинство их сценариев использования нативно.
Что делать вместо этого:
- Манипуляции с DOM —
querySelector,querySelectorAllи современные DOM API справляются с тем, что раньше делал jQuery. - Работа с датами — Temporal API на подходе. До полной поддержки используйте date-fns или нативный
Intl.DateTimeFormat. - Вспомогательные функции — Возможности ES2023–ES2025, такие как
Object.groupBy(), новые методы Set (.union(),.intersection()) и хелперы итераторов (.map(),.filter()на итераторах), заменяют большинство импортов Lodash. - Загрузка модулей — Нативные ESM и
import()делают RequireJS и AMD устаревшими.
Поставка библиотеки на 30 КБ для функциональности, которую браузер предоставляет бесплатно, — это frontend-ошибка, от которой нужно отказаться в 2025 году.
Перестаньте игнорировать возможности ES2023–ES2025
Язык значительно эволюционировал. Эти возможности стабильны или почти стабильны:
Object.groupBy()иMap.groupBy()— Группируйте массивы без внешних библиотек.- Хелперы итераторов — Объединяйте в цепочки
.map(),.filter(),.take()непосредственно на итераторах. - Новые методы Set —
.union(),.intersection(),.difference(),.isSubsetOf(). RegExp.escape()— Безопасно экранируйте строки для регулярных выражений.- Атрибуты импорта и JSON-модули —
import data from './config.json' with { type: 'json' }. awaitна верхнем уровне — Используйте его в модулях без оборачивания всего в async IIFE.
Проверяйте caniuse.com и ваши целевые браузеры, но не используйте по умолчанию полифиллы для возможностей, которые появились два года назад.
Discover how at OpenReplay.com.
Перестаньте использовать JavaScript для того, что теперь делает CSS
Современный CSS поглотил функциональность, которая раньше требовала JavaScript. Использование JS для этого создаёт ненужную сложность и ухудшает производительность.
Позвольте CSS обрабатывать:
- Container queries — Адаптивные компоненты без хаков с
ResizeObserver. - Селектор
:has()— Выбор родительских элементов без обхода DOM. - Анимации, привязанные к прокрутке —
animation-timeline: scroll()заменяет обработчики событий прокрутки. - View transitions — Нативные эффекты переходов между страницами.
Каждый удалённый обработчик прокрутки — это победа для основного потока.
Перестаньте использовать Mutation Events и полагаться на сторонние cookie
Mutation Events (DOMSubtreeModified, DOMNodeInserted) устарели и работают плохо. Используйте вместо них MutationObserver — он стабилен уже более десяти лет.
Сторонние cookie фактически мертвы для отслеживания и кросс-сайтовых потоков аутентификации. График отказа Chrome сдвинулся, но Safari и Firefox заблокировали их много лет назад. Создавайте потоки аутентификации с использованием first-party cookie, токенов или федеративной идентификации. Не проектируйте архитектуру на основе предположений, которые не работают в половине браузеров ваших пользователей.
Перестаньте начинать новые проекты с CommonJS
Если вы пишете браузерный код в 2025 году и обращаетесь к require() или тяжёлым конфигурациям webpack, остановитесь. Нативные ESM работают везде, где это важно. Более лёгкие бандлеры, такие как Vite и esbuild, обрабатывают оставшиеся крайние случаи с минимальной конфигурацией.
CommonJS всё ещё имеет своё место в Node.js-библиотеках, нацеленных на старые окружения. Для нового frontend-кода это устаревший багаж.
Заключение
Лучшие практики JavaScript в 2025 году — это не погоня за трендами, а признание того, что платформа догнала ваши зависимости. Каждая удалённая устаревшая возможность, каждая отброшенная ненужная библиотека и каждое CSS-нативное решение, которое вы принимаете, делает ваш код меньше, быстрее и проще в поддержке.
Проведите аудит ваших текущих проектов. Проверьте ваши импорты. Задайтесь вопросом, действительно ли этой вспомогательной функции нужна библиотека или просто нативный метод, который вы ещё не изучили. Современные паттерны JavaScript уже здесь — вам просто нужно их использовать.
Часто задаваемые вопросы
Да, но действуйте осторожно. Современные браузеры поддерживают querySelector, fetch и другие API, которые заменяют основную функциональность jQuery. Для существующих проектов сначала проведите аудит использования jQuery и заменяйте вызовы постепенно. Новые проекты должны полностью избегать jQuery, поскольку нативные альтернативы теперь хорошо поддерживаются и более производительны.
Temporal API находится на стадии Stage 3 в процессе TC39 и доступен за флагами в некоторых браузерах. Полная кросс-браузерная поддержка ожидается в ближайшее время, но для production-кода сегодня используйте date-fns или нативный Intl.DateTimeFormat. Следите за обновлениями на caniuse.com перед внедрением Temporal без полифиллов.
Для большинства случаев использования — нет. Нативный JavaScript теперь включает Object.groupBy, новые методы Set и хелперы итераторов, которые покрывают распространённые функции Lodash. Однако Lodash остаётся полезным для глубокого клонирования, сложных манипуляций с объектами или при таргетинге на старые окружения. Импортируйте только конкретные функции, которые вам нужны, а не всю библиотеку целиком.
Начните с обновления вашего package.json, установив type в module. Замените операторы require на синтаксис import, а module.exports на export. При необходимости обновите расширения файлов на .mjs или настройте ваш бандлер соответствующим образом. Инструменты, такие как Vite и esbuild, значительно упрощают этот переход для frontend-проектов.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.