Polyfills

In order for certain features to work they require certain polyfills. You can satisfy allBabel feature requirements by using @babel/polyfill.

You may alternatively/selectively include what you need:

FeatureRequirements
Async functions, Generatorsregenerator runtime
Array destructuring, For OfSymbol, prototype[Symbol.iterator]
SpreadArray.from

There is also the loose option for some of these plugins.

Classes

Built-in classes such as Date, Array, DOM etc cannot be properly subclasseddue to limitations in ES5 (for the transform-classes plugin).You can try to use babel-plugin-transform-builtin-extend based on Object.setPrototypeOf and Reflect.construct, but it also has some limitations.

ES5

Since Babel assumes that your code will run in an ES5 environment it uses ES5functions. So if you're using an environment that has limited or no support forES5 such as lower versions of IE then using @babel/polyfill will add support for these methods.

Internet Explorer

Classes (10 and below)

If you're inheriting from a class then static properties are inherited from itvia proto,this is widely supported but you may run into problems with much older browsers.

NOTE: proto is not supported on IE <= 10 so static propertieswill not be inherited. See theprotoToAssign for a possible workaround.

For classes that have supers, the super class won't resolve correctly. You canget around this by enabling the loose option in the transform-classes plugin.

Getters/setters (8 and below)

In IE8 Object.defineProperty can only be used on DOM objects. This isunfortunate as it's required to set getters and setters. Due to this ifyou plan on supporting IE8 or below then the usage of getters and settersisn't recommended.

Reference: MDN.

Modules

By default, when using modules with Babel a non-enumerable __esModule propertyis exported. This is done through the use of Object.defineProperty which isunsupported in IE8 and below. A workaround for this is to enable the loose option in your corresponding module plugin.