Babel 基础使用 #

命令行使用 #

基本命令 #

bash
# 编译单个文件
npx babel src/index.js

# 编译并输出到文件
npx babel src/index.js --out-file dist/index.js
npx babel src/index.js -o dist/index.js

# 编译整个目录
npx babel src --out-dir dist
npx babel src -d dist

# 编译并生成 source map
npx babel src -d dist --source-maps
npx babel src -d dist -s

# 监听文件变化
npx babel src -d dist --watch
npx babel src -d dist -w

常用命令选项 #

选项 简写 描述 示例
--out-file -o 输出文件 babel src.js -o dist.js
--out-dir -d 输出目录 babel src -d dist
--watch -w 监听模式 babel src -d dist -w
--source-maps -s 生成 source map babel src -d dist -s
--copy-files 复制非 JS 文件 babel src -d dist --copy-files
--ignore 忽略文件 babel src -d dist --ignore "*.test.js"
--only 仅编译指定文件 babel src -d dist --only "*.js"
--extensions -x 文件扩展名 babel src -d dist -x .ts,.tsx
--verbose -V 详细输出 babel src -d dist -V
--config-file 指定配置文件 babel src -d dist --config-file ./babel.config.js

使用配置文件 #

bash
# 使用默认配置文件 babel.config.js
npx babel src -d dist

# 指定配置文件
npx babel src -d dist --config-file ./custom-babel.config.js

# 显示当前配置
npx babel --show-config

使用预设和插件 #

bash
# 使用预设
npx babel src -d dist --presets @babel/preset-env

# 使用多个预设
npx babel src -d dist --presets @babel/preset-env,@babel/preset-react

# 使用插件
npx babel src -d dist --plugins @babel/plugin-transform-arrow-functions

Node.js API 使用 #

基本编译 #

javascript
const babel = require('@babel/core');

const code = 'const fn = () => 42;';

const result = babel.transformSync(code, {
  presets: ['@babel/preset-env']
});

console.log(result.code);
// "var fn = function fn() { return 42; };"

异步编译 #

javascript
const babel = require('@babel/core');

async function compile() {
  const code = 'const fn = () => 42;';

  const result = await babel.transformAsync(code, {
    presets: ['@babel/preset-env']
  });

  console.log(result.code);
}

compile();

编译文件 #

javascript
const babel = require('@babel/core');

// 同步编译文件
const result = babel.transformFileSync('./src/index.js', {
  presets: ['@babel/preset-env']
});

console.log(result.code);

// 异步编译文件
babel.transformFile('./src/index.js', {
  presets: ['@babel/preset-env']
}, (err, result) => {
  if (err) throw err;
  console.log(result.code);
});

编译 AST #

javascript
const babel = require('@babel/core');
const parser = require('@babel/parser');

const code = 'const fn = () => 42;';

// 解析为 AST
const ast = parser.parse(code);

// 从 AST 编译
const result = babel.transformFromAstSync(ast, code, {
  presets: ['@babel/preset-env']
});

console.log(result.code);

获取 AST #

javascript
const babel = require('@babel/core');

const code = 'const fn = () => 42;';

const result = babel.parseSync(code, {
  sourceType: 'module'
});

console.log(result.program.body);

常见语法转换 #

箭头函数 #

javascript
// 输入
const add = (a, b) => a + b;
const greet = name => `Hello, ${name}!`;
const obj = {
  method: () => this.value
};

// 输出
var add = function add(a, b) {
  return a + b;
};
var greet = function greet(name) {
  return "Hello, ".concat(name, "!");
};
var obj = {
  method: function method() {
    return this.value;
  }
};

let 和 const #

javascript
// 输入
let x = 1;
const y = 2;
if (true) {
  let x = 3;
}

// 输出
var x = 1;
var y = 2;
if (true) {
  var _x = 3;
}

模板字符串 #

javascript
// 输入
const name = 'World';
const greeting = `Hello, ${name}!`;
const multi = `
  Line 1
  Line 2
`;

// 输出
var name = 'World';
var greeting = "Hello, ".concat(name, "!");
var multi = "\n  Line 1\n  Line 2\n";

解构赋值 #

javascript
// 输入
const { a, b } = obj;
const [x, y] = arr;
const { name: userName, age = 18 } = person;

// 输出
var a = obj.a,
    b = obj.b;
var x = arr[0],
    y = arr[1];
var userName = person.name,
    _person$age = person.age,
    age = _person$age === void 0 ? 18 : _person$age;

展开运算符 #

javascript
// 输入
const arr = [...items, 4, 5];
const obj = { ...defaults, name: 'custom' };

// 输出
var arr = [].concat(items, [4, 5]);
var obj = Object.assign({}, defaults, { name: 'custom' });

默认参数 #

javascript
// 输入
function greet(name = 'World') {
  return `Hello, ${name}!`;
}

// 输出
function greet() {
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'World';
  return "Hello, ".concat(name, "!");
}

#

javascript
// 输入
class Person {
  constructor(name) {
    this.name = name;
  }

  greet() {
    return `Hello, ${this.name}!`;
  }

  static create(name) {
    return new Person(name);
  }
}

// 输出
function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

var Person = function () {
  function Person(name) {
    _classCallCheck(this, Person);
    this.name = name;
  }

  var _proto = Person.prototype;
  _proto.greet = function greet() {
    return "Hello, ".concat(this.name, "!");
  };

  Person.create = function create(name) {
    return new Person(name);
  };

  return Person;
}();

类字段 #

javascript
// 输入
class Counter {
  count = 0;
  #privateField = 42;

  increment = () => {
    this.count++;
  }
}

// 输出
var _privateField = new WeakMap();

var Counter = function Counter() {
  _classCallCheck(this, Counter);

  this.count = 0;

  _privateField.set(this, {
    writable: true,
    value: 42
  });

  this.increment = () => {
    this.count++;
  };
};

模块 #

javascript
// 输入
import { foo, bar } from './module';
import * as utils from './utils';
export const name = 'Babel';
export default function() {}

// 输出 (CommonJS)
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.name = void 0;

var _module = require("./module");
var utils = _interopRequireWildcard(require("./utils"));

function _getRequireWildcardCache() { ... }

function _interopRequireWildcard(obj) { ... }

var name = 'Babel';
exports.name = name;

function _default() {}
exports.default = _default;

async/await #

javascript
// 输入
async function fetchData() {
  const response = await fetch('/api');
  const data = await response.json();
  return data;
}

// 输出
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { ... }

function _asyncToGenerator(fn) { ... }

function fetchData() {
  return _fetchData.apply(this, arguments);
}

function _fetchData() {
  _fetchData = _asyncToGenerator(function* () {
    var response = yield fetch('/api');
    var data = yield response.json();
    return data;
  });
  return _fetchData.apply(this, arguments);
}

可选链 #

javascript
// 输入
const name = user?.profile?.name;
const result = obj.method?.();

// 输出
var _user$profile, _obj$method;

var name = user === null || user === void 0 ? void 0 : (_user$profile = user.profile) === null || _user$profile === void 0 ? void 0 : _user$profile.name;
var result = obj === null || obj === void 0 ? void 0 : (_obj$method = obj.method) === null || _obj$method === void 0 ? void 0 : _obj$method.call(obj);

空值合并 #

javascript
// 输入
const value = input ?? 'default';
const result = a ?? b ?? c;

// 输出
var _input;

var value = (_input = input) !== null && _input !== void 0 ? _input : 'default';
var result = (_ref = (_ref2 = a !== null && a !== void 0 ? a : b) !== null && _ref2 !== void 0 ? _ref2 : c) !== null && _ref !== void 0 ? _ref : void 0;

JSX 转换 #

经典转换 #

javascript
// 配置
{
  presets: [
    ['@babel/preset-react', { runtime: 'classic' }]
  ]
}

// 输入
const element = <div className="app">Hello</div>;

// 输出
var element = React.createElement('div', { className: 'app' }, 'Hello');

自动转换 #

javascript
// 配置
{
  presets: [
    ['@babel/preset-react', { runtime: 'automatic' }]
  ]
}

// 输入
const element = <div className="app">Hello</div>;

// 输出
import { jsx as _jsx } from 'react/jsx-runtime';
var element = _jsx('div', { className: 'app', children: 'Hello' });

JSX 表达式 #

javascript
// 输入
const name = 'World';
const element = (
  <div className="container">
    <h1>Hello, {name}!</h1>
    {showMessage && <p>Welcome!</p>}
  </div>
);

// 输出
var name = 'World';
var element = React.createElement('div', {
  className: "container"
}, React.createElement('h1', null, "Hello, ", name, "!"), showMessage && React.createElement('p', null, "Welcome!"));

TypeScript 转换 #

基本类型 #

javascript
// 输入
interface User {
  name: string;
  age: number;
}

const user: User = {
  name: 'Babel',
  age: 10
};

function greet(name: string): string {
  return `Hello, ${name}!`;
}

// 输出
var user = {
  name: 'Babel',
  age: 10
};

function greet(name) {
  return "Hello, ".concat(name, "!");
}

泛型 #

javascript
// 输入
function identity<T>(arg: T): T {
  return arg;
}

const result = identity<string>('hello');

// 输出
function identity(arg) {
  return arg;
}

var result = identity('hello');

枚举 #

javascript
// 输入
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT'
}

// 输出
var Direction;

(function (Direction) {
  Direction["Up"] = "UP";
  Direction["Down"] = "DOWN";
  Direction["Left"] = "LEFT";
  Direction["Right"] = "RIGHT";
})(Direction || (Direction = {}));

Polyfill 使用 #

自动注入(推荐) #

javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', {
      useBuiltIns: 'usage',
      corejs: 3
    }]
  ]
};

// 源代码
const arr = [1, 2, 3].includes(2);
const promise = Promise.resolve();
Object.assign({}, { a: 1 });

// 编译后
import "core-js/modules/es.array.includes.js";
import "core-js/modules/es.object.assign.js";
import "core-js/modules/es.promise.js";

var arr = [1, 2, 3].includes(2);
var promise = Promise.resolve();
Object.assign({}, { a: 1 });

入口注入 #

javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', {
      useBuiltIns: 'entry',
      corejs: 3
    }]
  ]
};

// 入口文件
import 'core-js/stable';
import 'regenerator-runtime/runtime';

// Babel 会根据目标环境替换为具体的 polyfill

手动引入 #

javascript
// 按需引入
import 'core-js/modules/es.promise';
import 'core-js/modules/es.array.includes';

const arr = [1, 2, 3].includes(2);
const promise = Promise.resolve();

运行时辅助函数 #

安装运行时 #

bash
npm install @babel/runtime
npm install --save-dev @babel/plugin-transform-runtime

配置使用 #

javascript
// babel.config.js
module.exports = {
  presets: ['@babel/preset-env'],
  plugins: [
    ['@babel/plugin-transform-runtime', {
      corejs: 3,        // 使用 core-js@3
      helpers: true,    // 使用辅助函数
      regenerator: true // 使用 regenerator
    }]
  ]
};

效果对比 #

javascript
// 不使用 runtime 插件
// 每个文件都会内联辅助函数
function _classCallCheck(instance, Constructor) { ... }

class Person { ... }

// 使用 runtime 插件
// 辅助函数从 @babel/runtime 引入
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';

class Person { ... }

实战示例 #

示例一:编译单个文件 #

bash
# 项目结构
project/
├── src/
│   └── index.js
├── dist/
├── babel.config.js
└── package.json

# 编译
npx babel src/index.js -o dist/index.js

示例二:编译整个目录 #

bash
# 项目结构
project/
├── src/
│   ├── index.js
│   ├── utils.js
│   └── components/
│       └── Button.js
├── dist/
└── babel.config.js

# 编译
npx babel src -d dist

示例三:带 Source Map #

bash
npx babel src -d dist --source-maps

示例四:监听模式 #

bash
# 开发时使用
npx babel src -d dist --watch

示例五:复制非 JS 文件 #

bash
# 同时复制 CSS、图片等文件
npx babel src -d dist --copy-files

示例六:编译 TypeScript #

bash
# 支持编译 .ts 和 .tsx 文件
npx babel src -d dist --extensions .ts,.tsx

package.json 脚本 #

json
{
  "scripts": {
    "build": "babel src -d dist",
    "build:prod": "BABEL_ENV=production babel src -d dist",
    "dev": "babel src -d dist --watch",
    "build:source-map": "babel src -d dist --source-maps",
    "build:copy": "babel src -d dist --copy-files"
  }
}

调试技巧 #

查看编译结果 #

bash
# 输出到控制台
npx babel src/index.js

# 显示详细信息
npx babel src -d dist --verbose

查看配置 #

bash
# 显示当前配置
npx babel --show-config

# 显示特定环境配置
BABEL_ENV=production npx babel --show-config

AST 调试 #

javascript
const babel = require('@babel/core');

const code = 'const x = 1;';

const ast = babel.parseSync(code);
console.log(JSON.stringify(ast, null, 2));

常见问题 #

问题一:没有转换 #

javascript
// 检查是否安装了预设
npm install --save-dev @babel/preset-env

// 检查配置文件
module.exports = {
  presets: ['@babel/preset-env']
};

问题二:Polyfill 未注入 #

javascript
// 确保 corejs 配置正确
module.exports = {
  presets: [
    ['@babel/preset-env', {
      useBuiltIns: 'usage',
      corejs: 3
    }]
  ]
};

问题三:类属性不支持 #

javascript
// 安装插件
npm install --save-dev @babel/plugin-proposal-class-properties

// 配置
module.exports = {
  presets: ['@babel/preset-env'],
  plugins: ['@babel/plugin-proposal-class-properties']
};

下一步 #

现在你已经掌握了 Babel 的基础使用方法,接下来学习 预设详解 深入了解各种预设配置!

最后更新:2026-03-28