Skip to main content

什么是 Babel?

Babel 是一个 JavaScript compiler

Babel 是一个工具链,主要用于在当前和旧的浏览器或环境中,将 ECMAScript 2015+ 代码转换为 JavaScript 向后兼容版本的代码。以下是 Babel 可以做的主要事情:

  • Transform syntax
  • Polyfill features that are missing in your target environment (through a third-party polyfill such as core-js)
  • Source code transformations (codemods)
  • And more! (check out these videos for inspiration)
JavaScript
// Babel Input: ES2015 arrow function
[1, 2, 3].map(n => n + 1);

// Babel 输出:ES5 等价语法
[1, 2, 3].map(function(n) {
return n + 1;
});
tip

For an awesome tutorial on compilers, check out the-super-tiny-compiler, which also explains how Babel itself works on a high level.

ES2015 及其后版本

Babel 通过语法转换(syntax transformer)支持最新版本的 JavaScript。

这些 plugins 允许你现在就使用新语法,而无需等待浏览器的支持。查看我们的 使用指南 以开始使用。

JSX 和 React

Babel 可以转换 JSX 语法!查看 React preset 以开始使用。和 babel-sublime 一起使用,可以把语法高亮显示提升到一个全新的水平。

你可以通过以下这个命令安装此 preset

npm install --save-dev @babel/preset-react

并将 @babel/preset-react 添加到你的 Babel 配置中。

JSX
export default function DiceRoll(){
const getRandomNumber = () => {
return Math.ceil(Math.random() * 6);
};

const [num, setNum] = useState(getRandomNumber());

const handleClick = () => {
const newNum = getRandomNumber();
setNum(newNum);
};

return (
<div>
Your dice roll: {num}.
<button onClick={handleClick}>Click to get a new number</button>
</div>
);
};
tip

Learn more about JSX

类型注释(Flow 和 TypeScript)

Babel 可以删除类型注释!查看 Flow presetTypeScript preset 以开始使用。请注意 Babel 不会进行类型检查;你仍然可以安装 Flow 或者 TypeScript 来使用类型检查。

你可以通过以下这个命令安装 flow preset

npm install --save-dev @babel/preset-flow
JavaScript
// @flow
function square(n: number): number {
return n * n;
}

也可以通过以下这个命令安装 typescript preset

npm install --save-dev @babel/preset-typescript
JavaScript
function Greeter(greeting: string) {
this.greeting = greeting;
}
tip

Learn more about Flow and TypeScript!

可插件化

Babel 是用 plugins 构建的。你可以使用现有 plugins 编写自己的转换管道,或编写自己的 plugins。通过使用或创建一个 preset 轻松使用一组插件。了解更多 →

直接使用 astexplorer.net 创建插件,或者使用 generator-babel-plugin 生成一个插件模板。

example-babel-plugin.js
// A plugin is just a function
export default function({ types: t }) {
return {
visitor: {
Identifier(path) {
let name = path.node.name; // reverse the name: JavaScript -> tpircSavaJ
path.node.name = [...name]
.reverse()
.join("");
},
},
};
}

可调试

支持 Source map,因此你可以轻松调试编译过的代码。

规范性

Babel 试图尽可能地遵循 ECMAScript 标准。作为性能的折衷方案,它可能还具有一些特定的选项,使其更符合规范。

可压缩

Babel 尝试使用尽可能少的代码而不依赖于庞大的运行时环境。

This may be difficult to do in cases, and there are "assumptions" options that tradeoff spec compliancy for readability, file size, and speed.