宣布 CoffeeScript 2
我们很高兴地宣布 CoffeeScript 2 的发布!这个 CoffeeScript 语言和编译器的全新版本旨在将 CoffeeScript 带入现代 JavaScript 时代,弥合与 JavaScript 的兼容性差距,同时保留 CoffeeScript 的标志性简洁语法。简而言之
- CoffeeScript 2 编译器现在将 CoffeeScript 代码转换为现代 JavaScript 语法。因此,CoffeeScript 的
=>
现在输出为=>
,CoffeeScript 的class
现在使用class
关键字输出,等等。这意味着您可能需要 转译 CoffeeScript 编译器的输出。 - CoffeeScript 2 添加了对 异步函数 语法的支持,对未来 对象解构 语法的支持,以及对 JSX 的支持。一些特性,例如 模块 (
import
和export
语句)、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 中那样为 undefined
或 null
;以及 类 有其自身的差异。请参阅 重大变更 以了解详细信息。
根据我们的经验,大多数重大变更都是边缘情况,应该影响的人很少,例如 JavaScript 的 箭头函数中缺少 arguments
对象。似乎有两个重大变更会影响大量项目
- 在 CoffeeScript 2 中,不再允许使用“裸”
super
(在没有参数的情况下调用super
),必须使用super()
或super arguments...
代替。 - 根据 JS 规范,在调用
super
之前,不能出现对this
/@
的引用。
请参阅 完整细节。无论是 CoffeeScript 编译器还是您的转译器,都会针对这两种情况抛出错误,因此更新您的代码只是在编译器针对每个情况抛出错误时修复它们,直到您的代码成功编译。
其他特性
除了支持新的 JavaScript 特性并将旧的 CoffeeScript 特性以现代 JS 语法输出之外,CoffeeScript 2 还添加了对以下内容的支持
还有许多较小的改进,例如对 coffee
命令行工具的改进。您可以在 变更日志 中阅读 2.0.0 测试版的全部详细信息。
“关于……?”
CoffeeScript 有意省略了一些 JavaScript 特性。这些特性包括 let
和 const
(以及 var
)、命名函数以及 get
和 set
关键字。这些特性经常被问到,因此我们在文档中添加了一个名为 不支持的 ECMAScript 特性 的部分。CoffeeScript 缺少对这些特性的等效项不会影响与 JavaScript 模块或库的兼容性或互操作性。
未来兼容性
在 CoffeeScript 1 创建之初,ES2015 JavaScript 和像 Babel、Bublé 或 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!