Announcing 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 的許多創新輸出為新的 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
  • 物件 rest/spread 屬性:{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 功能,並以現代 JS 語法輸出舊的 CoffeeScript 功能之外,CoffeeScript 2 還新增了對下列項目的支援

  • JSX
  • 行註解 現在會輸出(在 CoffeeScript 1 中會捨棄)
  • 區塊註解現在可以在任何地方使用,這可以使用 Flow 的基於註解的語法來啟用靜態類型註解

也有許多較小的改進,例如 coffee 命令列工具。您可以在 2.0.0 beta 版的變更日誌中閱讀所有詳細資料。

「關於 …?」

CoffeeScript 故意省略了幾項 JavaScript 功能。這些功能包括 letconst(以及 var)、已命名函數以及 getset 關鍵字。這些功能被詢問的頻率非常高,因此我們在文件當中新增了一個名為 不支援的 ECMAScript 功能 的區段。CoffeeScript 缺少這些功能的等效功能,並不會影響與 JavaScript 模組或函式庫的相容性或互通性。

未來的相容性

在 CoffeeScript 1 建立時,ES2015 JavaScript 和 BabelBubléTraceur Compiler 等轉譯器還需要好幾年的時間才會問世。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 語法輸出的箭頭函式、函式預設參數和函式 rest 參數;列註解輸出和區塊註解輸出在任何地方;透過三個反引號區塊嵌入 JavaScript;改進識別 CoffeeScript 文學;以及新的文件網站。
  • @connec:類別;解構;陣列和函式呼叫中的 splats/rest 語法;以及使用 ES2015 語法輸出的運算屬性。
  • @GabrielRatener:非同步函式。
  • @xixixao:JSX。
  • @zdenko:物件 rest/spread 屬性(物件解構)。
  • @greghuc:標記範本文字,插補字串輸出為 ES2015 語法。
  • @atg:ES2015 for…of,支援為 CoffeeScript 的 for…from
  • @lydell@jashkenas:指導、程式碼檢閱和回饋。

請參閱完整的 榮譽榜

感謝您,我們希望您會喜歡 CoffeeScript 2!