宣布 CoffeeScript 2

我们很高兴地宣布 CoffeeScript 2 的发布!这个 CoffeeScript 语言和编译器的全新版本旨在将 CoffeeScript 带入现代 JavaScript 时代,弥合与 JavaScript 的兼容性差距,同时保留 CoffeeScript 的标志性简洁语法。简而言之

  • CoffeeScript 2 编译器现在将 CoffeeScript 代码转换为现代 JavaScript 语法。因此,CoffeeScript 的 => 现在输出为 =>,CoffeeScript 的 class 现在使用 class 关键字输出,等等。这意味着您可能需要 转译 CoffeeScript 编译器的输出
  • CoffeeScript 2 添加了对 异步函数 语法的支持,对未来 对象解构 语法的支持,以及对 JSX 的支持。一些特性,例如 模块 (importexport 语句)、for…of 以及 带标签的模板字面量,已回溯移植到 CoffeeScript 1.11 和 1.12 版本中。
  • 以上所有内容都是在 与 1.x 版本相比几乎没有重大变更 的情况下实现的。大多数现有的 CoffeeScript 项目应该能够轻松升级,几乎不需要重构。

CoffeeScript 2 的开发有两个主要目标:消除与现代 JavaScript 的任何不兼容性,这些不兼容性可能会阻止 CoffeeScript 在项目中使用;并尽可能保留向后兼容性。 立即安装npm install -g coffeescript@2

现代 JavaScript 输出

从一开始,CoffeeScript 就被描述为“只是 JavaScript”。而如今,JavaScript 是 ES2015(好吧,是 ES2017;也通常称为 ES6)。CoffeeScript 欢迎 JavaScript 世界的变化,我们很高兴不再为现代特性输出 1999 年左右的语法。

许多新的 JavaScript 特性,例如 =>,都是从 CoffeeScript 中获得启发的,并且与 CoffeeScript 一对一兼容,或者几乎完全兼容。这使得将 CoffeeScript 的许多创新输出到新的 JS 语法变得非常直接:不仅 => 变成了 =>,而且 { a } = obj 变成了 { a } = obj"a#{b}c" 变成了 `a${b}c`,等等。

以下 CoffeeScript 特性在 2.0 中进行了更新,以使用现代 JavaScript 语法输出(或在 CoffeeScript 1.11 到 2.0 中添加,使用现代语法输出)

  • 模块:import/export
  • 类:class Animal
  • 异步函数:await someFunction()
  • 绑定/箭头函数:=>
  • 函数默认参数:(options = {}) ->
  • 函数展开/剩余参数:(items...) ->
  • 解构,适用于数组和对象:[first, second] = items{length} = items
  • 对象剩余/展开属性:{options..., force: yes}{force, otherOptions...} = options
  • 插值字符串/模板字面量(JS 反引号字符串):"Hello, #{user}!"
  • 带标签的模板字面量:html"<strong>coffee</strong>"
  • JavaScript 的 for…of 现在可以作为 CoffeeScript 的 for…from 使用(我们已经有了 for…of):for n from generatorFunction()

并非所有 CoffeeScript 特性都以 100% 相同的方式被 JavaScript 采用;最值得注意的是,默认值 在 JavaScript(以及 CoffeeScript 2)中仅在变量为 undefined 时才应用,而不是像 CoffeeScript 1 中那样为 undefinednull;以及 有其自身的差异。请参阅 重大变更 以了解详细信息。

根据我们的经验,大多数重大变更都是边缘情况,应该影响的人很少,例如 JavaScript 的 箭头函数中缺少 arguments 对象。似乎有两个重大变更会影响大量项目

  • 在 CoffeeScript 2 中,不再允许使用“裸”super(在没有参数的情况下调用 super),必须使用 super()super arguments... 代替。
  • 根据 JS 规范,在调用 super 之前,不能出现对 this/@ 的引用。

请参阅 完整细节。无论是 CoffeeScript 编译器还是您的转译器,都会针对这两种情况抛出错误,因此更新您的代码只是在编译器针对每个情况抛出错误时修复它们,直到您的代码成功编译。

其他特性

除了支持新的 JavaScript 特性并将旧的 CoffeeScript 特性以现代 JS 语法输出之外,CoffeeScript 2 还添加了对以下内容的支持

  • JSX
  • 行注释 现在将被输出(在 CoffeeScript 1 中,它们会被丢弃)
  • 块注释现在可以在任何地方使用,从而可以使用 Flow 的基于注释的语法进行 静态类型标注

还有许多较小的改进,例如对 coffee 命令行工具的改进。您可以在 变更日志 中阅读 2.0.0 测试版的全部详细信息。

“关于……?”

CoffeeScript 有意省略了一些 JavaScript 特性。这些特性包括 letconst(以及 var)、命名函数以及 getset 关键字。这些特性经常被问到,因此我们在文档中添加了一个名为 不支持的 ECMAScript 特性 的部分。CoffeeScript 缺少对这些特性的等效项不会影响与 JavaScript 模块或库的兼容性或互操作性。

未来兼容性

在 CoffeeScript 1 创建之初,ES2015 JavaScript 和像 BabelBubléTraceur 编译器 这样的转译器还处于几年后的未来。CoffeeScript 编译器本身必须做如今的转译器所做的事情,将解构和箭头函数等现代特性转换为等效的最低公分母 JavaScript。

但转译器现在已经存在,并且它们做得很好。有了它们,CoffeeScript 编译器就没有必要重复此功能。CoffeeScript 编译器现在只需要担心将 CoffeeScript 版本的新语法转换为 JS 版本的该语法,例如将 "Hello, #{name}!" 转换为 `Hello, ${name}!`。这使得添加对新 JavaScript 特性的支持比以前容易得多。

ECMA 在最近几年添加的大多数特性在 CoffeeScript 中根本不需要任何更新。新的全局对象或全局对象上的新方法不需要 CoffeeScript 做任何更新就可以工作。一些提议的未来 JS 特性确实涉及新的语法,例如 类字段。我们已经采用了一项政策,即仅在语法达到 ECMA 过程中的第 4 阶段时才支持新的语法,这意味着语法是最终的,并且将在下一个 ES 版本中发布。有时,我们可能会在特性达到第 4 阶段之前就支持它,但使用等效的非实验性语法输出它,而不是使用新提议的语法;这就是 2.0.0 中对 对象解构 的做法,我们的输出使用与 Babel 相同的 polyfill。当新的语法最终确定后,我们将更新我们的输出以使用最终的语法。

致谢

如果没有以下人员,2.0.0 的主要特性将不可能实现

  • @GeoffreyBooth:CoffeeScript 2 工作的组织者,模块的开发者;使用 ES2015 语法输出箭头函数、函数默认参数和函数剩余参数;行注释输出和块注释在任何地方输出;通过三重反引号嵌入块级 JavaScript;改进的 Literate CoffeeScript 解析;以及新的文档网站。
  • @connec:类;解构;数组和函数调用中的展开/剩余语法;以及使用 ES2015 语法输出的计算属性。
  • @GabrielRatener:异步函数。
  • @xixixao:JSX。
  • @zdenko:对象剩余/展开属性(对象解构)。
  • @greghuc:带标签的模板字面量,使用 ES2015 语法输出插值字符串。
  • @atg:ES2015 for…of,支持作为 CoffeeScript 的 for…from
  • @lydell@jashkenas:指导、代码审查和反馈。

请参阅完整的 荣誉榜

感谢您,我们希望您喜欢 CoffeeScript 2!