Как один человек поддерживает весь современный интернет и почему вам стоит об этом знать
Представьте, что вы пишете [1, 2, 3].flat() или используете Promise.any(). Вы ожидаете, что это просто сработает в браузере или в Node.js. Но за этой простотой скрывается титанический труд одного разработчика из России, чей код скачивают миллиарды раз в месяц. Речь идет о Денисе Пушкареве (zloirock) и его проекте core-js.
Если вы занимаетесь фронтендом, вы точно используете core-js, даже если не устанавливали его вручную. Он спрятан внутри Babel, сидит в зависимостях у React, Vue, Angular и тысяч других библиотек. Это модульная стандартная библиотека JavaScript, которая приносит фичи будущего в текущие реалии.
Что это на самом деле такое
Простыми словами, core-js — это набор полифиллов. Если в спецификации ECMAScript появляется новый метод, а браузеры еще не успели его внедрить (или вы вынуждены поддерживать старые версии), эта библиотека «достраивает» недостающие кирпичики.
Она охватывает все: от древних костылей для IE9 до самых свежих предложений Stage 3, которые только обсуждаются в комитете TC39. При этом проект не просто «затыкает дыры», а делает это максимально модульно.
Главные фишки, которые упрощают жизнь
В отличие от старых монолитных решений, core-js позволяет не тащить за собой мегабайты кода.
Тонкая настройка импортов
Вы можете подключить только то, что нужно. Например, если вам внезапно понадобился structuredClone (глубокое копирование объектов без боли), не нужно импортировать всю библиотеку:
import 'core-js/actual/structured-clone';
const original = { a: 1, b: { c: 2 } };
const clone = structuredClone(original);
Работа без загрязнения глобальной области
Обычно полифиллы меняют прототипы встроенных объектов вроде Array.prototype. Но если вы пишете библиотеку и не хотите ломать окружение пользователя, у проекта есть версия core-js-pure. Она позволяет использовать современные фичи как обычные функции:
import Promise from 'core-js-pure/actual/promise';
import from from 'core-js-pure/actual/array/from';
// Array.from превращается в обычную функцию,
// не трогая глобальный Array
const list = from(new Set([1, 2, 3]));
Поддержка итераторов и предложений TC39
Проект часто идет впереди паровоза. Методы вроде Iterator.range или новые хелперы для итераторов (map, filter, take) доступны в core-js задолго до того, как они станут стандартом в браузерах.
import 'core-js/actual/iterator';
Iterator.range(1, 5)
.map(it => it ** 2)
.toArray(); // [1, 4, 9, 16]
Почему это работает почти везде
Архитектура core-js опирается на глубокое понимание спецификаций. Автор не просто копирует поведение, а учитывает тонкие нюансы: поддержку символов, правильную работу с this, корректные дескрипторы свойств.
Благодаря пакету core-js-compat, библиотека знает, в какой версии Chrome или Firefox появилась поддержка той или иной фичи. Инструменты вроде babel-preset-env используют эти данные, чтобы автоматически добавлять нужные импорты, основываясь на вашем списке поддерживаемых браузеров (browserslist).
Как это использовать по-умному
Большинство разработчиков привыкли, что всё «просто работает» через Babel или SWC. Но есть пара приемов, которые делают разработку приятнее:
- Эксперименты с новыми предложениями. Если вы хотите попробовать фичи со стадии Stage 2 или 3, просто импортируйте их из
core-js/proposals. Это отличный способ проверить, как новые методы изменят ваш код в будущем. - Оптимизация бандла. Вместо
import 'core-js', который раздует билд, посмотрите, какие методы вы реально используете. Иногда достаточно пяти точечных импортов. - Использование в Node.js. Часто в серверной разработке забывают про полифиллы, считая, что версия ноды фиксирована. Но если вам нужно запустить современный код на старой LTS-версии, core-js спасет ситуацию.
Немного о ситуации вокруг проекта
Нельзя писать про core-js и не упомянуть, что автор поддерживает проект практически в одиночку. Это классическая история об «Open Source выгорании». Проект критически важен для индустрии, но его финансирование несопоставимо с объемом работы. Денис часто пишет об этом в логах установки (тот самый postinstall текст, который вы наверняка видели в терминале).
Если ваша компания зарабатывает миллионы на продуктах, которые в конечном счете зависят от работоспособности стандартной библиотеки JS, возможно, стоит заглянуть на Open Collective проекта.
Стоит ли его внедрять
Если вы используете современные фреймворки, он у вас уже есть. Вопрос в том, насколько осознанно вы им пользуетесь.
Core-js идеально подходит для:
- Разработчиков библиотек, которым важна чистота глобального пространства.
- Проектов с жесткими требованиями к поддержке старых платформ (да, кто-то все еще живет с IE).
- Энтузиастов, которые хотят использовать синтаксис завтрашнего дня уже сегодня.
Это не просто полифилл, это живая реализация того, каким будет JavaScript через год или два. Изучите README, посмотрите на список поддерживаемых фич — там можно найти много интересного, что упростит ваш повседневный код без подключения тяжелых утилит вроде lodash.
