CoffeeScript 2 の発表 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は、主に2つの目標を掲げて開発されました。1つは、CoffeeScriptがプロジェクトで使用されるのを妨げる可能性のある最新のJavaScriptとの非互換性をすべて排除すること、もう1つは可能な限り多くの後方互換性を維持することです。今すぐインストール:`npm install -g coffeescript@2`
最新のJavaScript出力
当初から、CoffeeScriptは「単なるJavaScript」と表現されてきました。そして今日、JavaScriptはES2015(ES2017、一般的にES6としても知られています)。CoffeeScriptはJavaScriptの世界の変化を歓迎し、最新の機能について1999年頃の構文の出力を停止できることを嬉しく思っています。
=>
などの多くの新しいJavaScript機能は、CoffeeScriptによって考案され、1対1で互換性があります(または非常に近い)。これにより、CoffeeScriptの多くの革新的な機能を新しいJS構文に出力することが容易になりました。=>
は=>
になり、{ a } = obj
は{ a } = obj
になり、"a#{b}c"
は`a${b}c`
になるなどです。
次のCoffeeScript機能は、最新のJavaScript構文を使用して出力するように2.0で更新されました(または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)のデフォルト値は、CoffeeScript 1のように変数が`undefined`または`null`の場合ではなく、`undefined`の場合にのみ適用されます。また、クラスには独自の相違点があります。破壊的変更で詳細を確認してください。
私たちの経験では、ほとんどの破壊的変更は、JavaScriptのアロー関数内の`arguments`オブジェクトの欠如など、ごく一部の人々にしか影響を与えないエッジケースです。多くのプロジェクトに影響を与える破壊的変更が2つあるようです。
- CoffeeScript 2では、引数なしで`super`を呼び出す「ベアナ」`super`は、もはや許可されておらず、代わりに`super()`または`super arguments...`を使用する必要があります。
- JS仕様に従って、`super`の呼び出しの前に`this`/`@`への参照は発生できません。
詳細はこちらをご覧ください。どちらの場合も、CoffeeScriptコンパイラまたはトランスパイラがエラーをスローするため、コードの更新は、コードが正常にコンパイルされるまで、コンパイラがエラーをスローするたびに発生するのを修正するだけです。
その他の機能
新しいJavaScript機能をサポートし、古いCoffeeScript機能を最新のJS構文で出力することに加えて、CoffeeScript 2は次の機能をサポートするようになりました。
- JSX
- 行コメントが出力されるようになりました(CoffeeScript 1では破棄されました)
- ブロックコメントは任意の場所に許可されるようになりました。これにより、Flowのコメントベースの構文を使用して静的型注釈を使用できます。
`coffee`コマンドラインツールなど、多くの小さな改善も行われています。2.0.0ベータ版の変更ログで詳細を確認できます。
「…はどうなりますか?」
いくつかのJavaScript機能は、意図的にCoffeeScriptから省略されています。これらには、`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機能の中には、新しい構文を含むものもあります。私たちは、構文が最終的で次のESリリースに含まれることを意味する、ECMAのプロセスでステージ4に達したときにのみ、新しい構文をサポートするというポリシーを採用しています。場合によっては、ステージ4に達する前に*機能*をサポートする場合がありますが、新しく提案された構文ではなく、同等の非実験的な構文を使用して出力します。それが、オブジェクトのデストラクチャリングの2.0.0で起こっていることです。Babelが使用するのと同じポリフィルを使用しています。新しい構文が最終化されると、最終的な構文を使用するように出力を更新します。
クレジット
2.0.0の主要な機能は、次の皆様がいなければ実現しなかったでしょう。
- @GeoffreyBooth:CoffeeScript 2の取り組みのオーガナイザー、モジュールの開発者。ES2015構文を使用したアロー関数、関数のデフォルトパラメータ、関数のレストパラメータの出力。行コメントの出力とブロックコメントの任意の場所での出力。トリプルバックティックによるブロック埋め込みJavaScript。リテラルCoffeeScriptの構文解析の改善。新しいドキュメントWebサイト。
- @connec:ES2015構文を使用したクラス、デストラクチャリング、配列と関数呼び出しのスプラット/レスト構文、および計算プロパティの出力。
- @GabrielRatener:非同期関数。
- @xixixao:JSX。
- @zdenko:オブジェクトレスト/スプレッドプロパティ(オブジェクトのデストラクチャリング)。
- @greghuc:タグ付きテンプレートリテラル、ES2015構文で出力される補間文字列。
- @atg:CoffeeScriptの`for…from`としてサポートされているES2015 `for…of`。
- @lydellと@jashkenas:ガイダンス、コードレビュー、フィードバック。
名誉の殿堂の全文をご覧ください。
ありがとうございました。CoffeeScript 2をお楽しみいただければ幸いです!