Babel 6.0.0 正式发布

Posted Oct 30, 2015 by James Kyle

NOTE: Not all integrations have been updated yet. This is a very disruptive major so please bear with us as we smooth out the edges.

很难相信,从 Babel 项目启动到现在已经过去整整一年了,并且真的是一年了!非常值得庆祝!

![images/blog/babel-cake.jpg]

在过去的一年中发生了很多的事。我们到世界各地为 Babel 布道,同时,我们也认识了很多非常出色的朋友。

在过去的一年,Babel 一直在探索自己在 JavaScript 社区的定位。因此在二月份的时候,我们做出了一个决定, 认为 Babel 不应该仅仅只是个 ES6 语法转化器,相反,它应该成为一个平台。它应该包括一组精心设计的工具用于创建下一代的 JavaScript 工具集。

当我们发布 Babel 5 的时候,它开放了一组新的插件 API,允许任何人利用 Babel 的全部功能来创建能直接插入转化过程的工具。 仅仅几个月的时间,它就形成了一个完整的工具生态体系

从调试工具、框架优化、代码压缩到实验性的新语法和机制,开发者能够构建一切工具用于强化它们的代码库。 而这些扩展也已经被证明是非常有创造力并且极其有效的。

有的开发者也利用了 Babel 的内置组件(internals)来构建复杂的工具,例如 documentationjs,它利用了 Babel 的 Babylon 解析器用于替代已有的工具,达到了一个更加智能的版本。

但是我们认为 Babel 可以走的更远。Babel 有能力驱动代码压缩、代码规范(Linter)、代码格式化、语法高亮、代码补全工具、 类型检查、codemod 工具等一系列功能,并且任何基于这个同样基础平台的工具都能够变得比以前更好。

因此,今天,我们发布了 Babel 6。

这应该有史以来 Babel 最重要的一次更新,因为它能让 Babel 更坚实的迈向平台化。

模块化

最大的变化就是 Babel 6 进行了全部重构,使其尽可能地模块化,并且,利用公共 API 将所有转化器全部重写了,而且全部以插件的形式存在。

所有的内部组件都被抽取出来重构为单独的包,每个包都定义了一个轻量级的公共 API,从而可以被其他组件所独立依赖。

如果你想使用某些 Babel 内部组件执行某种构建任务,现在,你只需要单独的去安装这个包,然后就能完成任务。 在包目录中你可以找到现存的所有的包和插件。

可选插件

由于 Babel 的目标是成为构建 JavaScript 工具的平台,而不是一个 ES2015 的转化器,我们决定让所有插件都是都是可选择的。这就意味着,当你安装 Babel 后,默认情况下它并不能帮你转化你的 ES2015 代码。

为了尽可能地简化 Babel 的公共 API,现在,我们将每个转化器都完全独立开来。这就意味着 ‘blacklist’、‘whitelist’、‘optional’、‘nonStandard’ 和 ‘modules’ 选项都被删除了,不过,这并不意味着你需要做更多额外工作来让 Babel 转化你的代码。

预设插件

因为在配置文件中指定和维护大量的转化器信息可能会导致大量的工作,因此 Babel 6 引入了预设插件的概念,为的是能够将一组类似的插件打包在一起并快速使用。

$ npm install --save-dev babel-preset-es2015
{
  presets: [es2015]
}

目前,官方支持的预设插件包括 babel-preset-es2015babel-preset-react,但是,我们希望未来能够有更多的预设插件。

我们也为不同的阶段提供了预设,例如 babel-preset-stage-0(这和在 Babel 5.x 中在 .babelrc 中指定 stage: 0 的效果是一样的)。

性能改进

性能依然是 Babel 最为核心的指标之一。Babel 5 彻底的革新了转化和遍历管道,用于提升和改进 Babel 的性能,这在 Babel 6 中依然被使用。

在 Babel 管道中,遍历过程是时间花费最多的部分之一。使用任何的基于 AST 的工具你都希望能够尽可能快的完成对语法树的遍历。 Babel 的插件也是按照这个方向进行设计的,因此它能够非常快的完成遍历工作。

Babel 6 实现了一个新的优化方案,用于将所有的插件合并在一次遍历操作中。然后管理完整的遍历过程,因此插件无需再担忧这个过程了。 作为一个插件开发者,你只需要关注业务逻辑,Babel 会帮你处理其余的问题。

插件 API

我们收到很多的反馈说插件 API 让人迷惑,因此在 Babel 6 中,它变得更加简单了。注意这是个非常大的不兼容的变化,但是它应该能够减少困惑。

Babel 5

export default function({ Plugin, types: t }) {
  return new Plugin(ast-transform, {
    visitor: {  }
  });
}

Babel 6

export default function({ types: t }) {
  return {
    visitor: {  }
  };
}

插件作者注意: 当更新你的插件时,务必记得更新你的插件的主版本号,因为这表示 Babel 5 和 6 版本不兼容。语义版本号(Semver)很重要!

New/Updated Proposals

There are a couple of updated TC39 proposals that have come out. Babel 6 updates to the latest revisions of decorators, class properties, and others.

最后

这对我们而言是个非常令人激动的发布版本。

任何参与过开源项目的人都会体会到,这是一个非常艰巨的任务,涉及到非常多的工作,但最终到发布的时候,需要非常的感谢整个社区的力量。

Sebastian has been up literally all night to finish all the last minute things needed to launch Babel 6 during his EmberCamp keynote. It's currently 1am for me in San Francisco and I'm writing this blog post as quickly as possible, listening to EDM music to stay awake.

I want to thank everyone who has ever helped out even the littlest bit with Babel. A huge shoutout to Logan Smyth (@loganfsmyth), Henry Zhu (@hzoo), Jesse McCarthy (@jmm), and Denis Pushkarev (@zloirock) for all their hard work managing issues and contributing to Babel.

我们非常激动的向全世界发布了 Babel 6。像以前一样,我们一直在努力让 Babel 变得更好,所以赶紧来尝试最新的版本吧。