CoffeeScript 2 の発表 CoffeeScript 2

CoffeeScript 2を発表できることを嬉しく思います!CoffeeScript言語とコンパイラのこの新しいリリースは、CoffeeScriptを最新のJavaScriptの時代に導入し、JavaScriptとの互換性のギャップを解消しながら、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とBabelBublé、または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をお楽しみいただければ幸いです!