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