Announcing CoffeeScript 2
我們很榮幸地宣布 CoffeeScript 2!CoffeeScript 語言和編譯器的這個新版本旨在將 CoffeeScript 帶入現代 JavaScript 時代,縮小與 JavaScript 的相容性差距,同時保留 CoffeeScript 的標誌性簡潔語法。簡而言之
- CoffeeScript 2 編譯器現在將 CoffeeScript 代碼轉換為現代 JavaScript 語法。因此,CoffeeScript
=>
現在輸出為=>
,CoffeeScriptclass
現在使用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 的許多創新輸出為新的 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 中的 undefined
或 null
;而 類別 有其自身的差異。請參閱 重大變更 以了解詳細資訊。
根據我們的經驗,大多數重大變更都是極少數人會遇到的邊緣案例,例如 JavaScript 的 箭頭函式中缺少 arguments
物件。似乎有兩個重大變更會影響大量專案
- 在 CoffeeScript 2 中,“裸”
super
(呼叫沒有引數的super
)現在不再被允許,必須改用super()
或super arguments...
。 - 根據 JS 規格,在呼叫
super
之前不能有對this
/@
的參照。
請參閱完整詳細資料。CoffeeScript 編譯器或您的轉譯器會針對這兩種情況擲回錯誤,因此更新您的程式碼就是修正編譯器錯誤中的每個執行個體,直到您的程式碼編譯成功為止。
其他功能
除了支援新的 JavaScript 功能,並以現代 JS 語法輸出舊的 CoffeeScript 功能之外,CoffeeScript 2 還新增了對下列項目的支援
也有許多較小的改進,例如 coffee
命令列工具。您可以在 2.0.0 beta 版的變更日誌中閱讀所有詳細資料。
「關於 …?」
CoffeeScript 故意省略了幾項 JavaScript 功能。這些功能包括 let
和 const
(以及 var
)、已命名函數以及 get
和 set
關鍵字。這些功能被詢問的頻率非常高,因此我們在文件當中新增了一個名為 不支援的 ECMAScript 功能 的區段。CoffeeScript 缺少這些功能的等效功能,並不會影響與 JavaScript 模組或函式庫的相容性或互通性。
未來的相容性
在 CoffeeScript 1 建立時,ES2015 JavaScript 和 Babel、Bublé 或 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!