FAQ

Why is the output of for...of so verbose and ugly?

In order to comply with the specification, the iterator’s return method must be called on errors. An alternative is to use assumptions introduced in Babel 7.13, such as ArrayLikeIsIterable and IterableIsArray, but please note that there are many caveats to be aware of if you use assumptions and that you’re willingly choosing not to comply with the spec.

Please see babel/rfcs#5, google/traceur-compiler#1773 and babel/babel#838 for more information.

Why are 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:

JavaScript

  1. const user = {
  2. firstName: "Sebastian",
  3. lastName: "McKenzie",
  4. getFullName: () => {
  5. // whoops! `this` doesn't actually reference `user` here
  6. return this.firstName + " " + this.lastName;
  7. },
  8. // use the method shorthand in objects
  9. getFullName2() {
  10. return this.firstName + " " + this.lastName;
  11. },
  12. };

Please see babel/babel#842, babel/babel#814, babel/babel#733 and babel/babel#730 for more information.

Why is 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 strict in the plugin-transform-modules-commonjs.

PLEASE NOTE: If you do this you’re willingly deviating from the spec and this may cause future interop issues.

Help?! I just want to use Babel like it was in 5.x! Everything is too complicated now!

We hear you! Babel 6 requires a tiny bit of configuration in order to get going. We think this is for the best and have added presets to ease this transition.

Upgrading from Babel 5.x to Babel 6

At the heart of Babel 6 are plugins. What plugins you need completely depends on your specific configuration but just add the following config file to get all the same transforms that were in Babel 5:

babel.config.json

  1. {
  2. "presets": ["env", "react", "stage-2"]
  3. }
  • npm
  • Yarn
  • pnpm
  1. npm install babel-preset-env babel-preset-react babel-preset-stage-2 --save-dev
  1. yarn add babel-preset-env babel-preset-react babel-preset-stage-2 --dev
  1. pnpm add babel-preset-env babel-preset-react babel-preset-stage-2 --save-dev

Also check out our Setting up Babel 6 blog post.

Where did all the docs go?!

Babel 6 removes a lot of the options in favor of plugins so a lot of the docs are no longer applicable.

For every removed option there should be a plugin for it. It’s possible we may have missed something, if you think this is the case, please open an issue!

Babel is an open source project and we appreciate any and all contributions we can get. Please help out with documentation if you can by submitting a pull request to the babel.github.io repo.

How do I build babel from source?

See build instructions.

How do I contribute to Babel?

See contributing.

Why am I getting a Syntax Error/Unexpected Token?

It’s most likely the case that you didn’t include a plugin/preset that supports that feature. (It’s also possible it’s a bug in the parser, or that it actually is a syntax error).

Why isn’t a certain babel-x package updated?

We currently use Lerna’s fixed versioning system.

We have a global version for all packages. When we do a release, the only packages that get updated are the packages that actually had changes (we do a git diff on that folder).

If we only update babel-plugin-transform-exponentiation-operator to 6.x.x, currently we don’t publish a new version for all packages since the other dependencies are using ^.

For example, the Babel v6.6.0 release doesn’t mean all packages are now 6.6.0.

FAQ - 图1tip

To make sure you are using the latest package versions, you may need to remove node_modules and npm install again.