Frequently Asked Questions and Answers
As a rule of thumb, IE9+. You can support IE8 by limiting yourself to a subset of ES6 features. The Caveats page goes into the details of supporting legacy browsers.
{ ...props }
and async function foo() {}
?You need to enable the experimental option.
for...of
so verbose and ugly?This is necessary in order to comply with the spec as an iterators return
method must be called on
errors. An alternative is to enable loose mode but please note
that there are many caveats to be aware of if you enable loose mode and that you're willingly choosing
to be spec incompliant.
Please see google/traceur-compiler#1773 and babel/babel/#838 for more information.
this
and arguments
being remapped in arrow functions?Arrow functions are not synonymous with normal functions. arguments
and this
inside arrow functions
reference their outer function for example:
var user = {
firstName: "Sebastian",
lastName: "McKenzie",
getFullName: () => {
// whoops! `this` doesn't actually reference `user` here
return this.firstName + " " + this.lastName;
}
};
Please see #842, #814, #733 and #730 for more information.
this
being remapped to undefined
?Babel assumes that all input code is an ES2015 module. ES2015 modules are implicitly strict mode so this means
that top-level this
is not window
in the browser nor is it exports
in node.
If you don't want this behaviour then you have the option of disabling the strict
transformer:
$ babel --blacklist strict script.js
require("babel").transform("code", { blacklist: ["strict"] });
PLEASE NOTE: If you do this you're willingly deviating from the spec and this may cause future interop issues.
See the strict transformer docs for more info.
Many issues plague current transpilers, Babel takes a unique approach to many aspects.
Many transpilers require a globally polluting polyfill and runtime. Babel has various ways to avoid this, including concise code that utilises minimal inline helpers as well as features such as runtime that enable library authors to utilise ES2015 methods without the aforementioned polyfill.
Babel cares immensely about your output code. Not only should it not be bound to a bulky runtime but it should always retain as much of the source formatting as possible (newlines and comments).
Source maps are critical in the context of transpiled languages. This enables you to seamlessly write and debug your code without worrying about what it turns into.
With support for ES2015 being implemented into engines at a rapid rate it's critical that certain transformations have the ability to be turned off. With Babel every single transformation can be turned off. Classes get supported in your target environment? Simply disable it and reap the benefits of all the other transformers.
The Babel feature set is very comprehensive, supporting every ES2015 syntactic feature. With built-in support for emerging standards such as Flow and JSX/React it makes it extremely easy to integrate.
Babel is very flexible in its usage, it has support for an extensive range of build systems as well as for the browser, node and more!.
A module formatter is a transformer that turns exports and imports into their equivalent
target format. For example, the common
module formatter transforms
import { foo } from "bar";
into the CommonJS var foo = require("bar").foo;