Модульная стандартная библиотека для JavaScript. Включает полифилы для ECMAScript до 2024 года: промисы, символы, коллекции, итераторы, типизированные массивы, многие другие функции, предложения ECMAScript, некоторые кроссплатформенные функции WHATWG/W3C и предложения, такие как
URL
. Вы можете загружать только необходимые функции или использовать их без загрязнения глобального пространства имен.
Если вы ищете документацию по устаревшему core-js@2
, пожалуйста, проверьте эту ветку.
core-js
не поддерживается компанией, поэтому будущее этого проекта зависит от вас. Станьте спонсором или сторонником, если вас интересует core-js
: Open Collective , Patreon , Boosty , Bitcoin (bc1qlea7544qtsmj2rayg0lthvza9fau63ux0fstcz) , Alipay .
Пример использования :
import 'core-js/actual' ;
Promise . resolve ( 42 ) . then ( it => console . log ( it ) ) ; // => 42
Array . from ( new Set ( [ 1 , 2 , 3 ] ) . union ( new Set ( [ 3 , 4 , 5 ] ) ) ) ; // => [1, 2, 3, 4, 5]
[ 1 , 2 ] . flatMap ( it => [ it , it ] ) ; // => [1, 1, 2, 2]
( function * ( i ) { while ( true ) yield i ++ ; } ) ( 1 )
. drop ( 1 ) . take ( 5 )
. filter ( it => it % 2 )
. map ( it => it ** 2 )
. toArray ( ) ; // => [9, 25]
structuredClone ( new Set ( [ 1 , 2 , 3 ] ) ) ; // => new Set([1, 2, 3])
Вы можете загрузить только необходимые функции :
import 'core-js/actual/promise' ;
import 'core-js/actual/set' ;
import 'core-js/actual/iterator' ;
import 'core-js/actual/array/from' ;
import 'core-js/actual/array/flat-map' ;
import 'core-js/actual/structured-clone' ;
Promise . resolve ( 42 ) . then ( it => console . log ( it ) ) ; // => 42
Array . from ( new Set ( [ 1 , 2 , 3 ] ) . union ( new Set ( [ 3 , 4 , 5 ] ) ) ) ; // => [1, 2, 3, 4, 5]
[ 1 , 2 ] . flatMap ( it => [ it , it ] ) ; // => [1, 1, 2, 2]
( function * ( i ) { while ( true ) yield i ++ ; } ) ( 1 )
. drop ( 1 ) . take ( 5 )
. filter ( it => it % 2 )
. map ( it => it ** 2 )
. toArray ( ) ; // => [9, 25]
structuredClone ( new Set ( [ 1 , 2 , 3 ] ) ) ; // => new Set([1, 2, 3])
Или используйте его без загрязнения глобального пространства имен :
import Promise from 'core-js-pure/actual/promise' ;
import Set from 'core-js-pure/actual/set' ;
import Iterator from 'core-js-pure/actual/iterator' ;
import from from 'core-js-pure/actual/array/from' ;
import flatMap from 'core-js-pure/actual/array/flat-map' ;
import structuredClone from 'core-js-pure/actual/structured-clone' ;
Promise . resolve ( 42 ) . then ( it => console . log ( it ) ) ; // => 42
from ( new Set ( [ 1 , 2 , 3 ] ) . union ( new Set ( [ 3 , 4 , 5 ] ) ) ) ; // => [1, 2, 3, 4, 5]
flatMap ( [ 1 , 2 ] , it => [ it , it ] ) ; // => [1, 1, 2, 2]
Iterator . from ( function * ( i ) { while ( true ) yield i ++ ; } ( 1 ) )
. drop ( 1 ) . take ( 5 )
. filter ( it => it % 2 )
. map ( it => it ** 2 )
. toArray ( ) ; // => [9, 25]
structuredClone ( new Set ( [ 1 , 2 , 3 ] ) ) ; // => new Set([1, 2, 3])
postinstall
@babel/polyfill
@babel/preset-env
@babel/runtime
globalThis
Array.prototype.includes
Array.prototype.flat
/ Array.prototype.flatMap
Array
от последнегоArray
копиейArray
ArrayBuffer.prototype.transfer
и друзьяIterator
Object.values
/ Object.entries
Object.fromEntries
Object.getOwnPropertyDescriptors
Object.prototype.hasOwnProperty
String
String.prototype.matchAll
String.prototype.replaceAll
String.prototype.trimStart
/ String.prototype.trimEnd
s
RegExp
( dotAll
)RegExp
Promise.allSettled
Promise.any
Promise.prototype.finally
Promise.try
Promise.withResolvers
Symbol.asyncIterator
для асинхронной итерацииSymbol.prototype.description
JSON.stringify
Set
Array.fromAsync
JSON.parse
Float16
Uint8Array
в/из base64 и hexRegExp
выраженийMath.sumPrecise
Symbol.metadata
для предложения метаданных декораторовIterator
AsyncIterator
Iterator.range
Map
Array.isTemplateObject
String.dedent
Symbol
Symbol.customMatcher
для экстракторовObservable
.of
и .from
в конструкторах коллекцийcompositeKey
и compositeSymbol
Array
Array
DataView
получить/установить методы Uint8Clamped
Number.fromString
String.cooked
String.prototype.codePoints
Symbol.customMatcher
для сопоставления с образцомFunction.prototype.demethodize
Function.{ isCallable, isConstructor }
Reflect
метаданныхself
structuredClone
setTimeout
и setInterval
setImmediate
queueMicrotask
URL
и URLSearchParams
DOMException
// global version
npm install --save [email protected]
// version without global namespace pollution
npm install --save [email protected]
// bundled global version
npm install --save [email protected]
Или вы можете использовать core-js
из CDN.
postinstall
Проекту core-js
нужна ваша помощь, поэтому пакет показывает сообщение об этом после установки. Если это вызывает у вас проблемы, вы можете отключить его:
ADBLOCK=true npm install
// or
DISABLE_OPENCOLLECTIVE=true npm install
// or
npm install --loglevel silent
Вы можете импортировать только те полифилы, которые вам необходимы, как в примерах вверху README.md
. Доступные точки входа CommonJS для всех заполненных полифилами методов/конструкторов и пространств имен. Просто несколько примеров:
// polyfill all `core-js` features, including early-stage proposals:
import "core-js" ;
// or:
import "core-js/full" ;
// polyfill all actual features - stable ES, web standards and stage 3 ES proposals:
import "core-js/actual" ;
// polyfill only stable features - ES and web standards:
import "core-js/stable" ;
// polyfill only stable ES features:
import "core-js/es" ;
// if you want to polyfill `Set`:
// all `Set`-related features, with early-stage ES proposals:
import "core-js/full/set" ;
// stable required for `Set` ES features, features from web standards and stage 3 ES proposals:
import "core-js/actual/set" ;
// stable required for `Set` ES features and features from web standards
// (DOM collections iterator in this case):
import "core-js/stable/set" ;
// only stable ES features required for `Set`:
import "core-js/es/set" ;
// the same without global namespace pollution:
import Set from "core-js-pure/full/set" ;
import Set from "core-js-pure/actual/set" ;
import Set from "core-js-pure/stable/set" ;
import Set from "core-js-pure/es/set" ;
// if you want to polyfill just the required methods:
import "core-js/full/set/intersection" ;
import "core-js/actual/array/find-last" ;
import "core-js/stable/queue-microtask" ;
import "core-js/es/array/from" ;
// polyfill iterator helpers proposal:
import "core-js/proposals/iterator-helpers" ;
// polyfill all stage 2+ proposals:
import "core-js/stage/2" ;
Кончик
Рекомендуется использовать пространство имен /actual/
, поскольку оно включает в себя все актуальные функции JavaScript и не включает нестабильные предложения на ранней стадии, доступные в основном для экспериментов.
Предупреждение
modules
представляет собой внутренний API, не внедряет все необходимые зависимости и может быть изменен в минорных выпусках или выпусках исправлений. Используйте его только для индивидуальной сборки и/или если вы знаете, что делаете.core-js
с расширением собственных объектов, рекомендуется загружать все модули core-js
в верхней части точки входа вашего приложения, иначе могут возникнуть конфликты.Symbol.iterator
, конфликтующий с Array.from
, URLSearchParams
и/или чем-то ещё из core-js
, см. связанные проблемы.core-js
.core-js
чрезвычайно модульный и использует множество очень маленьких модулей, поэтому для использования в браузерах собирайте core-js
вместо загрузчика использования для каждого файла, иначе у вас будут сотни запросов. В pure
версии мы не можем загрязнять прототипы собственных конструкторов. Из-за этого методы-прототипы превратились в статические методы, как в примерах выше. Но с транспилерами мы можем использовать еще один трюк — оператор связывания и виртуальные методы. Специально для этого доступны /virtual/
точки входа. Пример:
import fill from 'core-js-pure/actual/array/virtual/fill' ;
import findIndex from 'core-js-pure/actual/array/virtual/find-index' ;
Array ( 10 ) :: fill ( 0 ) . map ( ( a , b ) => b * b ) :: findIndex ( it => it && ! ( it % 8 ) ) ; // => 4
Предупреждение
Оператор связывания — это предложение ECMAScript на ранней стадии, и использование этого синтаксиса может быть опасным.
core-js
интегрирован с babel
и является основой для функций babel
связанных с полифиллингом:
@babel/polyfill
⬆ @babel/polyfill
— это всего лишь импорт стабильных функций core-js
и regenerator-runtime
для генераторов и асинхронных функций, поэтому если вы загружаете @babel/polyfill
— вы загружаете глобальную версию core-js
без предложений ES.
Теперь он устарел в пользу отдельного включения необходимых частей core-js
и regenerator-runtime
и, чтобы предотвратить критические изменения, остался на core-js@2
.
В качестве полного эквивалента @babel/polyfill
вы можете использовать это:
import 'core-js/stable' ;
import 'regenerator-runtime/runtime' ;
@babel/preset-env
⬆ @babel/preset-env
есть опция useBuiltIns
, которая оптимизирует работу с глобальной версией core-js
. С опцией useBuiltIns
вам также следует установить опцию corejs
для используемой версии core-js
, например corejs: '3.39'
.
Важный
Рекомендуется указывать используемую второстепенную версию core-js
, например corejs: '3.39'
, вместо corejs: 3
, поскольку с помощью corejs: 3
не будут внедряться модули, которые были добавлены в второстепенные версии core-js
.
useBuiltIns: 'entry'
заменяет импорт core-js
на импорт только необходимых для целевой среды модулей. Так, например, import 'core-js/stable' ;
с целью chrome 71
будет заменено только для:
import 'core-js/modules/es.array.unscopables.flat' ;
import 'core-js/modules/es.array.unscopables.flat-map' ;
import 'core-js/modules/es.object.from-entries' ;
import 'core-js/modules/web.immediate' ;
Он работает для всех точек входа глобальной версии core-js
и их комбинаций, например для
import 'core-js/es' ;
import 'core-js/proposals/set-methods' ;
import 'core-js/full/set/map' ;
с целью chrome 71
вы получите в результате:
import 'core-js/modules/es.array.unscopables.flat' ;
import 'core-js/modules/es.array.unscopables.flat-map' ;
import 'core-js/modules/es.object.from-entries' ;
import 'core-js/modules/esnext.set.difference' ;
import 'core-js/modules/esnext.set.intersection' ;
import 'core-js/modules/esnext.set.is-disjoint-from' ;
import 'core-js/modules/esnext.set.is-subset-of' ;
import 'core-js/modules/esnext.set.is-superset-of' ;
import 'core-js/modules/esnext.set.map' ;
import 'core-js/modules/esnext.set.symmetric-difference' ;
import 'core-js/modules/esnext.set.union' ;
useBuiltIns: 'usage'
добавляет в начало каждого файла импорт полифилов для функций, используемых в этом файле и не поддерживаемых целевыми средами, поэтому для: // first file:
let set = new Set ( [ 1 , 2 , 3 ] ) ;
// second file:
let array = Array . of ( 1 , 2 , 3 ) ;
если цель содержит старую среду, например IE 11
у нас будет что-то вроде:
// first file:
import 'core-js/modules/es.array.iterator' ;
import 'core-js/modules/es.object.to-string' ;
import 'core-js/modules/es.set' ;
var set = new Set ( [ 1 , 2 , 3 ] ) ;
// second file:
import 'core-js/modules/es.array.of' ;
var array = Array . of ( 1 , 2 , 3 ) ;
По умолчанию @babel/preset-env
с опцией useBuiltIns: 'usage'
выполняет полизаполнение только для стабильных функций, но вы можете включить полизаполнение предложений с помощью опции proposals
, например corejs: { version: '3.39', proposals: true }
.
Важный
В случае useBuiltIns: 'usage'
вам не следует добавлять импорт core-js
самостоятельно, они будут добавлены автоматически.
@babel/runtime
⬆ Опция @babel/runtime
с corejs: 3
упрощает работу с core-js-pure
. Он автоматически заменяет использование современных функций стандартной библиотеки JS импортом из версии core-js
без загрязнения глобального пространства имен, поэтому вместо:
import from from 'core-js-pure/stable/array/from' ;
import flat from 'core-js-pure/stable/array/flat' ;
import Set from 'core-js-pure/stable/set' ;
import Promise from 'core-js-pure/stable/promise' ;
from ( new Set ( [ 1 , 2 , 3 , 2 , 1 ] ) ) ;
flat ( [ 1 , [ 2 , 3 ] , [ 4 , [ 5 ] ] ] , 2 ) ;
Promise . resolve ( 32 ) . then ( x => console . log ( x ) ) ;
вы можете написать просто:
Array . from ( new Set ( [ 1 , 2 , 3 , 2 , 1 ] ) ) ;
[ 1 , [ 2 , 3 ] , [ 4 , [ 5 ] ] ] . flat ( 2 ) ;
Promise . resolve ( 32 ) . then ( x => console . log ( x ) ) ;
По умолчанию @babel/runtime
заполняет только стабильные функции, но, как и в @babel/preset-env
, вы можете включить полизаполнение предложений по опции proposals
, как corejs: { version: 3, proposals: true }
.
Предупреждение
Если вы используете @babel/preset-env
и @babel/runtime
вместе, используйте опцию corejs
только в одном месте, поскольку она дублирует функциональность и может вызвать конфликты.
Быстрый транспилятор JavaScript swc
содержит интеграцию с core-js
, что оптимизирует работу с глобальной версией core-js
. Как и @babel/preset-env
, он имеет 2 режима: usage
и entry
, но режим usage
все равно работает не так хорошо, как в babel
. Пример конфигурации в .swcrc
:
{
"env" : {
"targets" : " > 0.25%, not dead " ,
"mode" : " entry " ,
"coreJs" : " 3.39 "
}
}
По умолчанию core-js
устанавливает полифилы только тогда, когда они необходимы. Это означает, что core-js
проверяет, доступна ли функция и работает ли она правильно или нет, и если с ней нет проблем, core-js
использует собственную реализацию.
Но иногда определение функций core-js
может быть слишком строгим для вашего случая. Например, конструктор Promise
требует поддержки отслеживания необработанных отклонений и @@species
.
Иногда у нас может возникнуть обратная проблема — заведомо сломанная среда с проблемами, не охваченными обнаружением функций core-js
.
В таких случаях мы могли бы переопределить это поведение для определенных полифилов:
const configurator = require ( 'core-js/configurator' ) ;
configurator ( {
useNative : [ 'Promise' ] , // polyfills will be used only if natives are completely unavailable
usePolyfill : [ 'Array.from' , 'String.prototype.padEnd' ] , // polyfills will be used anyway
useFeatureDetection : [ 'Map' , 'Set' ] , // default behavior
} ) ;
require ( 'core-js/actual' ) ;
Не работают некоторые функции. Кроме того, если вы измените поведение по умолчанию, даже внутренние компоненты core-js
могут работать некорректно.
В некоторых случаях может быть полезно исключить некоторые функции core-js
или создать полифилл для целевых движков. Для этого вы можете использовать пакет core-js-builder
.
core-js
пытается поддерживать все возможные механизмы и среды JS с поддержкой ES3. Некоторые фичи имеют более высокую нижнюю планку — например, некоторые аксессоры могут корректно работать только из ES5, промисы требуют способа установки микрозадачи или задачи и т. д.
Однако у меня нет возможности протестировать core-js
абсолютно везде — например, тестирование в IE7 — и некоторых других древних было остановлено. Список определенно поддерживаемых двигателей вы можете посмотреть в таблице совместимости по ссылке ниже. Пишите, если у вас возникнут проблемы или вопросы с поддержкой какого-либо движка.
Проект core-js
предоставляет (в виде пакета core-js-compat
) все необходимые данные о необходимости модулей core-js
, точек входа и инструментов для работы с ним — это полезно для интеграции с такими инструментами, как babel
или swc
. Если вы хотите помочь, вы можете заглянуть в соответствующий раздел CONTRIBUTING.md
. Визуализация данных о совместимости и бегун браузерных тестов доступна здесь, пример:
Точки входа CommonJS:
core-js(-pure)
Точки входа CommonJS:
core-js(-pure)/es
Модули es.object.assign
, es.object.create
, es.object.define-getter
, es.object.define-property
, es.object.define-properties
, es.object.define-setter
, es.object.entries
, es.object.freeze
, es.object.from-entries
, es.object.get-own-property-descriptor
, es.object.get-own-property-descriptors
, es.object.get-own-property-names
, es.object.get-prototype-of
, es.object.group-by
, es.object.has-own
, es.object.is
, es.object.is-extensible
, es.object.is-frozen
, es.object.is-sealed
, es.object.keys
, es.object.lookup-setter
, es.object.lookup-getter
, es.object.prevent-extensions
, es.object.proto
, es.object.to-string
, es.object.seal
, es.object.set-prototype-of
, es.object.values
.
class Object {
toString ( ) : string ; // ES2015+ fix: @@toStringTag support
__defineGetter__ ( property : PropertyKey , getter : Function ) : void ;
__defineSetter__ ( property : PropertyKey , setter : Function ) : void ;
__lookupGetter__ ( property : PropertyKey ) : Function | void ;
__lookupSetter__ ( property : PropertyKey ) : Function | void ;
__proto__ : Object | null ; // required a way setting of prototype - will not in IE10-, it's for modern engines like Deno
static assign ( target : Object , ... sources : Array < Object > ) : Object ;
static create ( prototype : Object | null , properties ?: { [ property : PropertyKey ] : PropertyDescriptor } ) : Object ;
static defineProperties ( object : Object , properties : { [ property : PropertyKey ] : PropertyDescriptor } ) ) :