DevTools

Cheatsheet Babel

Compilador de JavaScript para compatibilidade com browsers antigos

Back to languages
Babel
19 cards found
Categories:
Versions:

Setup


3 cards
Install
npm i -D @babel/core @babel/cli
npm i -D @babel/preset-env

# With webpack:
npm i -D babel-loader

Essential packages.

Minimal Config
// babel.config.json
{
  "presets": [
    ["@babel/preset-env", {
      "targets": "defaults"
    }]
  ]
}

Basic configuration.

With webpack
// webpack.config.js
module: {
  rules: [{
    test: /\.js$/,
    exclude: /node_modules/,
    use: 'babel-loader',
  }]
}

Integrate with webpack.

Presets


4 cards
@babel/preset-env
{
  "presets": [[
    "@babel/preset-env", {
      "targets": "> 0.25%, not dead",
      "useBuiltIns": "usage",
      "corejs": 3
    }
  ]]
}

Main preset (recommended).

@babel/preset-react
npm i -D @babel/preset-react

{
  "presets": [
    ["@babel/preset-react", {
      "runtime": "automatic"
    }]
  ]
}

JSX support.

@babel/preset-typescript
npm i -D @babel/preset-typescript

{
  "presets": [
    "@babel/preset-typescript"
  ]
}

Strip TypeScript types.

Targets (browserslist)
"targets": "defaults"
"targets": "> 1%, last 2 versions"
"targets": { "node": "18" }
"targets": { "chrome": "90" }

// or .browserslistrc:
> 0.5%
last 2 versions
not dead

Define target browsers.

Plugins


3 cards
Proposal Plugins
@babel/plugin-proposal-decorators
@babel/plugin-proposal-pipeline-operator
@babel/plugin-transform-runtime

{
  "plugins": [
    "@babel/plugin-transform-runtime"
  ]
}

Experimental features.

transform-runtime
npm i -D @babel/plugin-transform-runtime
npm i @babel/runtime

{
  "plugins": [[
    "@babel/plugin-transform-runtime",
    { "corejs": 3 }
  ]]
}

Avoid helper duplication.

Syntax Plugins
@babel/plugin-syntax-dynamic-import
@babel/plugin-syntax-import-meta
@babel/plugin-proposal-class-properties

// Most already included in preset-env

Specific syntax.

Settings


3 cards
babel.config.js vs .babelrc
# babel.config.js → whole project
# .babelrc → only the package/directory

# Monorepo: use babel.config.js
# Library: use .babelrc

Scope differences.

Config Options
{
  "presets": [],
  "plugins": [],
  "sourceMaps": true,
  "env": {
    "test": {
      "presets": [["preset-env",
        { "targets": { "node": "current" }}]]
    }
  }
}

Per-environment config.

Overrides
{
  "overrides": [{
    "test": ["./src/legacy/**/*.js"],
    "presets": [[
      "@babel/preset-env",
      { "targets": "ie 11" }
    ]]
  }]
}

Per-file rules.

CLI


3 cards
Commands
npx babel src --out-dir lib
npx babel src -d lib --watch
npx babel file.js -o output.js
npx babel src -d lib --source-maps

Compile with the CLI.

Flags
--out-dir, -d  # output directory
--out-file, -o # output file
--watch, -w   # watch mode
--source-maps # generate source maps
--extensions  # .js,.jsx,.ts
--ignore     # patterns to ignore

CLI options.

npm Scripts
"scripts": {
  "build": "babel src -d lib",
  "dev": "babel src -d lib -w",
  "clean": "rm -rf lib && babel src -d lib"
}

Build scripts.

Advanced


3 cards
Polyfills (core-js)
npm i core-js@3

// useBuiltIns options:
"usage"  # imports only what is needed
"entry"  # imports everything at the entry
false    # no polyfills (default)

Automatic polyfills.

With Jest
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env',
      { targets: { node: 'current' }}],
  ],
};

Config for tests.

Debug and Verbose
{
  "presets": [[
    "@babel/preset-env", {
      "debug": true
    }
  ]]
}
// Shows plugins and polyfills used

See applied transformations.