Search code examples
javascriptpolyfills

Is there any use in importing both ES6 and ES7 core-js polyfills?


Is it useful or redundant to import the ES6 polyfill for Object

import 'core-js/es6/object';

and also the ES7 polyfill for Object?

import 'core-js/es7/object';

Does the ES7 polyfill cover all of the ES6 features and can I leave the ES6 polyfill out, or does the ES6 polyfill add features not present in the ES7 polyfill?


Solution

  • This answer concerns core-js@2. Starting from core-js@3, there are no longer separate ES6 and ES7 prefixes. This is due to how ECMAScript developed. You can find more details in the core-js@3, babel and a look into the future post.

    Yes, there is a use. Simply compare core-js/es6/object.js to core-js/es7/object.js.

    The ES6 object polyfill provides:
    •  Symbol
    •  Object.create
    •  Object.defineProperty
    •  Object.defineProperties
    •  Object.getOwnPropertyDescriptor
    •  Object.getPrototypeOf
    •  Object.keys
    •  Object.getOwnPropertyNames
    •  Object.freeze
    •  Object.seal
    •  Object.preventExtensions
    •  Object.isFrozen
    •  Object.isSealed
    •  Object.isExtensible
    •  Object.assign
    •  Object.is
    •  Object.setPrototypeOf
    •  Object.prototype.toString

    On the other hand, the ES7 object polyfill provides:
    •  Object.getOwnPropertyDescriptors
    •  Object.values
    •  Object.entries
    •  Object.prototype.__defineGetter__
    •  Object.prototype.__defineSetter__
    •  Object.prototype.__lookupGetter__
    •  Object.prototype.__lookupSetter__

    Thus, the ES6 polyfill indeed adds only methods introduced in ES6 and this is not covered by the ES7 polyfill. That one only adds methods introduced in ES7.

    core-js appears to be structured the same way for other classes.