CoffeeScriptはJavaScriptにコンパイルされる小さな言語です。ぎこちないJava風の皮の下で、JavaScriptは常にゴージャスな心を持っていました。CoffeeScriptは、JavaScriptの優れた部分を単純な方法で公開しようとする試みです。
CoffeeScriptの黄金律は、「これはただのJavaScript」です。コードは1対1で同等のJSにコンパイルされ、実行時に解釈されることはありません。既存のJavaScriptライブラリは、CoffeeScript(およびその逆)からシームレスに使用できます。コンパイルされた出力は読みやすく、きれいに整形されており、同等の手書きJavaScriptと同等以上の速度で実行される傾向があります。
最新バージョン: 2.7.0
# Install locally for a project: npm install --save-dev coffeescript # Install globally to execute .coffee files anywhere: npm install --global coffeescript
概要
CoffeeScriptは上左、コンパイルされたJavaScriptの出力は下右。CoffeeScriptは編集可能です!
CoffeeScript 2
CoffeeScript 2の新機能
CoffeeScript 2の最大の変更点は、CoffeeScriptコンパイラーが最新のJavaScript構文(ES6、またはES2015以降)を生成するようになったことです。CoffeeScriptの=>はJSの=>になり、CoffeeScriptのclassはJSのclassになるなどです。CoffeeScript 2の主な新機能には、非同期関数とJSXが含まれます。発表で詳細を読むことができます。
CoffeeScript 1.xから2への破壊的な変更は非常に少ないです。ほとんどのプロジェクトでアップグレードプロセスがスムーズであることを願っています。
互換性
CoffeeScriptがサポートする最新のJavaScript機能のほとんどは、Node 7.6+でネイティブに実行できるため、Nodeは追加の処理を必要とせずにCoffeeScriptの出力を実行できます。注目すべき例外を次に示します
- JSXは常にトランスパイルが必要です。
- オブジェクトのスプラット、別名オブジェクトのレスト/スプレッド構文は、Node 8.6+でサポートされています。
- 正規表現の
s(ドットオール)フラグは、Node 9+でサポートされています。 - 非同期ジェネレーター関数は、Node 10+でサポートされています。
- モジュールは、プロジェクトの
package.jsonで"type": "module"を使用すると、Node 12+でサポートされます。
このリストは不完全な可能性があり、フラグの背後にある新しい機能をサポートするNodeのバージョンは除外されています。詳細については、node.greenを参照してください。ブラウザでテストを実行すると、ブラウザがサポートする内容を確認できます。ランタイムが使用する最新の機能をサポートしていること、またはコードをトランスパイルすることを確認するのはあなたの責任です。迷った場合は、トランスパイルしてください。
他のJavaScriptフレームワークおよびツールとの互換性については、統合を参照してください。
インストール
coffeeのコマンドラインバージョンは、Node.jsユーティリティとして利用でき、Node 6以降が必要です。コアコンパイラーはNodeに依存せず、任意のJavaScript環境またはブラウザーで実行できます(CoffeeScriptを試すを参照)。
インストールするには、まずNode.jsの最新の安定バージョンの作業コピーがあることを確認してください。次に、npmを使用してCoffeeScriptをグローバルにインストールできます。
npm install --global coffeescript
これにより、coffeeおよびcakeコマンドがグローバルに利用可能になります。
プロジェクトでCoffeeScriptを使用している場合は、CoffeeScriptのバージョンがプロジェクトの依存関係の1つとして追跡されるように、そのプロジェクト用にローカルにインストールする必要があります。そのプロジェクトのフォルダー内
npm install --save-dev coffeescript
coffeeおよびcakeコマンドは、まず現在のフォルダーでCoffeeScriptがローカルにインストールされているかどうかを確認し、インストールされている場合はそのバージョンを使用します。これにより、CoffeeScriptの異なるバージョンをグローバルおよびローカルにインストールできます。
--transpileオプション(トランスパイルを参照)を使用する場合は、CoffeeScriptのグローバルインストールバージョンまたはローカルインストールバージョンのどちらを実行しているかに応じて、@babel/coreもグローバルまたはローカルにインストールする必要があります。
使い方
コマンドライン
インストールしたら、スクリプトを実行し、.coffeeファイルを.jsにコンパイルし、インタラクティブなREPLを提供するcoffeeコマンドにアクセスできるはずです。coffeeコマンドは、次のオプションを受け取ります
| オプション | 説明 |
|---|---|
-c, --compile |
.coffeeスクリプトを同じ名前の.jsJavaScriptファイルにコンパイルします。 |
-t, --transpile |
生成されたJavaScriptを保存または実行する前に、CoffeeScriptコンパイラーの出力をBabelにパイプします。@babel/coreをインストールする必要があり、コンパイルするファイルまたはフォルダーのパスにある.babelrcファイルまたはbabelキーを持つpackage.jsonでBabelに渡すオプションが必要です。トランスパイルを参照してください。 |
-m, --map |
コンパイルされたJavaScriptファイルと一緒にソースマップを生成します。JavaScriptにsourceMappingURLディレクティブも追加します。 |
-M, --inline-map |
--mapと同様ですが、ソースマップを別のファイルではなく、コンパイルされたJavaScriptファイルに直接含めます。 |
-i, --interactive |
短いコードスニペットを試すためのインタラクティブなCoffeeScriptセッションを起動します。引数なしでcoffeeを呼び出すのと同一です。 |
-o, --output [DIR] |
指定されたディレクトリに、コンパイルされたすべてのJavaScriptファイルを出力します。--compileまたは--watchと組み合わせて使用します。 |
-w, --watch |
ファイルの変更を監視し、ファイルが更新されるたびに指定されたコマンドを再実行します。 |
-p, --print |
JavaScriptをファイルとして書き出す代わりに、直接stdoutに出力します。 |
-s, --stdio |
CoffeeScriptをSTDINにパイプし、JavaScriptをSTDOUTで受け取ります。他の言語で書かれたプロセスでの使用に適しています。例:cat src/cake.coffee | coffee -sc |
-l, --literate |
コードをリテラルCoffeeScriptとして解析します。stdio経由でコードを直接渡す場合や、拡張子のないファイル名を使用する場合にのみ、これを指定する必要があります。 |
-e, --eval |
コマンドラインから直接、短いCoffeeScriptスニペットをコンパイルして出力します。例:coffee -e "console.log num for num in [10..1]" |
-r, --require [MODULE] |
REPLを開始する前、または--evalフラグで指定されたコードを評価する前に、指定されたモジュールをrequire()します。 |
-b, --bare |
トップレベルの関数セーフティラッパーなしでJavaScriptをコンパイルします。 |
--no-header |
「Generated by CoffeeScript」ヘッダーを抑制します。 |
--nodejs |
node実行可能ファイルには、--debug、--debug-brk、--max-stack-size、--expose-gcなど、設定できる便利なオプションがあります。このフラグを使用して、オプションをNode.jsに直接転送します。複数のフラグを渡すには、--nodejsを複数回使用します。 |
--ast |
CoffeeScriptのノードの抽象構文木を生成します。JavaScriptビルドツールとの統合に使用されます。 |
--tokens |
CoffeeScriptを解析する代わりに、字句解析のみを行い、トークンストリームを出力します。コンパイラのデバッグに使用されます。 |
-n, --nodes |
CoffeeScriptをコンパイルする代わりに、字句解析と構文解析のみを行い、解析ツリーを出力します。コンパイラのデバッグに使用されます。 |
例
srcにある.coffeeファイルのディレクトリツリーを、libにある.jsファイルの並列ツリーにコンパイルします。
coffee --compile --output lib/ src/- ファイルの変更を監視し、ファイルが保存されるたびに再コンパイルします。
coffee --watch --compile experimental.coffee - ファイルのリストを単一のスクリプトに連結します。
coffee --join project.js --compile src/*.coffee - ワンライナーからコンパイルされたJSを出力します。
coffee -bpe "alert i for i in [0..10]" - すべてを合わせて、作業中にプロジェクト全体を監視および再コンパイルします。
coffee -o lib/ -cw src/ - CoffeeScript REPLを開始します(終了するには
Ctrl-D、複数行の場合はCtrl-V)。
coffee
--transpileを使用するには、トランスパイルを参照してください。
Node.js
Node.jsのCommonJSを使用してCoffeeScriptファイルをrequireしたい場合、たとえばrequire './app.coffee'のように、最初にCoffeeScriptを拡張機能として「登録」する必要があります。
require 'coffeescript/register' App = require './app' # The .coffee extension is optional
コンパイラのAPIを使用して、たとえばCoffeeScriptの文字列をその場でコンパイルするアプリを作成する場合は、完全なモジュールをrequireできます。
CoffeeScript = require 'coffeescript' eval CoffeeScript.compile 'console.log "Mmmmm, I could really go for some #{Math.pi}"'
compileメソッドのシグネチャはcompile(code, options)です。ここでcodeはCoffeeScriptコードの文字列であり、オプションのoptionsは次のプロパティの一部またはすべてを含むオブジェクトです。
options.sourceMap、boolean:trueの場合、ソースマップが生成されます。また、文字列を返す代わりに、compileは{js, v3SourceMap, sourceMap}の形式のオブジェクトを返します。options.inlineMap、boolean:trueの場合、ソースマップをbase64エンコードされた文字列として下部のコメントに出力します。options.filename、string:ソースマップに使用するファイル名。(相対パスまたは絶対パスを含めることができます)。options.bare、boolean:trueの場合、トップレベルの関数セーフティラッパーなしで出力します。options.header、boolean:trueの場合、Generated by CoffeeScriptヘッダーを出力します。options.transpile、オブジェクト:設定されている場合、これはBabelに渡すオプションを含むオブジェクトである必要があります。トランスパイルを参照してください。options.ast、boolean:trueの場合、入力CoffeeScriptソースコードの抽象構文木を返します。
トランスパイル
CoffeeScript 2は、最新のモダンな構文を使用するJavaScriptを生成します。コードを実行したいランタイムまたはブラウザは、その構文のすべてをサポートしていない可能性があります。その場合、最新のJavaScriptを古いバージョンのNodeや古いブラウザで実行される古いJavaScriptに変換する必要があります。たとえば、{ a } = objをa = obj.aに変換します。これは、Babel、Bublé、またはTraceur Compilerのようなトランスパイラを介して行われます。ビルドツールを参照してください。
クイックスタート
プロジェクトのルートから
npm install --save-dev @babel/core @babel/preset-env echo '{ "presets": ["@babel/env"] }' > .babelrc coffee --compile --transpile --inline-map some-file.coffee
CoffeeScriptコンパイラでトランスパイルする
簡単にするために、CoffeeScriptには人気の高いBabelトランスパイラの組み込みサポートがあります。これは、--transpileコマンドラインオプションまたはtranspileNode APIオプションを介して使用できます。どちらかを使用するには、プロジェクトに@babel/coreをインストールする必要があります。
npm install --save-dev @babel/core
または、グローバルにインストールされたcoffeescriptモジュールを使用して、プロジェクトフォルダーの外でcoffeeコマンドを実行する場合は、@babel/coreをグローバルにインストールする必要があります。
npm install --global @babel/core
デフォルトでは、Babelは何も行いません。何をトランスパイルしたいかについての前提はありません。何をするかを知るための構成を提供する必要があります。これを行う1つの方法は、コンパイルするファイルを含むフォルダー、またはそれらのファイルよりも上のパスにある親フォルダーに.babelrcファイルを作成することです。(Babelは他の方法もサポートしています。)最小限の.babelrcファイルは{ "presets": ["@babel/env"] }だけです。これは、@babel/preset-envをインストールしたことを意味します。
npm install --save-dev @babel/preset-env # Or --global for non-project-based usage
プリセットとプラグイン、および多数のオプションについては、BabelのWebサイトを参照してください。ReactでJSXを使用している場合は、@babel/plugin-transform-react-jsxも必要になる場合があります(JSXは他のフレームワークでも使用できます)。
@babel/coreと@babel/preset-env(またはその他のプリセットまたはプラグイン)をインストールし、.babelrcファイル(またはその他の同等のファイル)を用意したら、coffee --transpileを使用して、保存したオプションを使用してCoffeeScriptの出力をBabelにパイプできます。
Node APIを介してCoffeeScriptを使用している場合、コンパイルする文字列とoptionsオブジェクトを指定してCoffeeScript.compileを呼び出す場合、optionsオブジェクトのtranspileキーはBabelオプションである必要があります。
CoffeeScript.compile(code, {transpile: {presets: ['@babel/env']}})
たとえば、ビルドチェーンの一部として、transpileオプションを使用せずにCoffeeScriptの出力をトランスパイルすることもできます。これにより、Babel以外のトランスパイラを使用でき、プロセスをより詳細に制御できます。JavaScriptビルドチェーンを設定するための優れたタスクランナーは多数あります。たとえば、Gulp、Webpack、Grunt、Broccoliなどです。
ポリフィル
トランスパイルでは、コードのポリフィルが自動的に提供されるわけではないことに注意してください。CoffeeScript自体は、in演算子、または分割代入やスプレッド/レスト構文を使用した場合、Array.indexOfを出力します。また、クラス内でバインド(=>)メソッドを使用する場合は、Function.bindを出力します。どちらもInternet Explorer 9以降およびより最近のすべてのブラウザでサポートされていますが、Internet Explorer 8以前をサポートする必要があり、これらのメソッドが出力されるような機能を使用している場合は、ポリフィルを提供する必要があります。また、独自のコードでこれらのメソッド、または最近のバージョンのJavaScriptで追加された別のメソッドを使用する場合も、ポリフィルを提供する必要があります。1つのポリフィルオプションは@babel/polyfillですが、他にも多数の戦略があります。
言語リファレンス
このリファレンスは、必要に応じて上から下まで読めるように構成されています。後のセクションでは、以前に紹介されたアイデアと構文を使用します。JavaScriptの知識があることを前提としています。以下のすべての例では、ソースCoffeeScriptが左側に、JavaScriptへの直接コンパイルが右側に提供されます。
例の多くは、右側の ▶ ボタンを押すことで、(意味がある場合)実行できます。左側のCoffeeScriptは編集可能で、編集するとJavaScriptが更新されます。
最初に基本事項:CoffeeScriptは、コードのブロックを区切るために有意な空白を使用します。式を終了するためにセミコロン;を使用する必要はありません。行の終わりが同じように機能します(ただし、セミコロンを使用して複数の式を1行に収めることはできます)。関数、ifステートメント、switch、try/catchのコードブロックを囲むために中括弧{ }を使用する代わりに、インデントを使用します。
引数を渡す場合は、関数を呼び出すために括弧を使用する必要はありません。暗黙的な呼び出しは、行またはブロック式の終わりまでラップします。
console.log sys.inspect object → console.log(sys.inspect(object));
関数
関数は、括弧で囲まれたオプションのパラメータリスト、矢印、および関数本体によって定義されます。空の関数は次のようになります:->
関数は、引数のデフォルト値を持つこともでき、その場合、渡された引数が欠落している(undefinedの場合)ときに使用されます。
文字列
JavaScriptや他の多くの言語と同様に、CoffeeScriptは"または'文字で区切られた文字列をサポートしています。CoffeeScriptは、"で囲まれた文字列内での文字列補間も、#{ … }を使用してサポートします。シングルクォートで囲まれた文字列はリテラルです。オブジェクトキーでも補間を使用できます。
複数行の文字列はCoffeeScriptで許可されています。行はバックスラッシュで終わらない限り、単一のスペースで結合されます。インデントは無視されます。
"""または'''で区切られたブロックスタイル文字列は、整形済みまたはインデントに依存するテキストを保持するために使用できます(または、単に引用符とアポストロフィをエスケープしたくない場合)。ブロックを開始するインデントレベルは全体で維持されるため、コードの本体とすべてを揃えておくことができます。
他の二重引用符付き文字列と同様に、二重引用符付きブロックスタイル文字列は補間を許可します。
オブジェクトと配列
オブジェクトと配列のCoffeeScriptリテラルは、JavaScriptのものとよく似ています。各プロパティが独自の行にリストされている場合、コンマはオプションです。オブジェクトは、YAMLと同様に、明示的な中括弧の代わりにインデントを使用して作成できます。
CoffeeScriptには、キーを同じ名前の変数で設定する場合にオブジェクトを作成するためのショートカットがあります。この省略形には{と}が必要であることに注意してください。
レキシカルスコープと変数の安全性
CoffeeScriptコンパイラは、すべての変数がレキシカルスコープ内で適切に宣言されるように注意します。自分でvarを記述する必要はありません。
変数宣言が、最初に現れる最も近いスコープの先頭にすべてプッシュされていることに注目してください。outerは、すでにスコープ内にあるため、内部関数内で再宣言されていません。一方、関数内のinnerは、同じ名前の外部変数の値を変更できないはずであるため、独自の宣言があります。
varキーワードに直接アクセスできないため、意図的に外部変数をシャドウすることはできず、参照のみ可能です。したがって、深くネストされた関数を作成している場合は、外部変数の名前を誤って再利用していないように注意してください。
このドキュメントでは明確にするために抑制されていますが、すべてのCoffeeScript出力(importまたはexportステートメントを含むファイルを除く)は、匿名関数(function(){ … })();でラップされています。この安全ラッパーは、varキーワードの自動生成と組み合わさって、誤ってグローバル名前空間を汚染することが非常に困難になります。(安全ラッパーは、bareオプションで無効にでき、モジュールを使用する場合は不要であり、自動的に無効になります。)
他のスクリプトで使用するためのトップレベル変数を作成する場合は、windowのプロパティとしてアタッチします。CommonJSでは、exportsオブジェクトのプロパティとしてアタッチします。または、exportステートメントを使用します。CommonJSとブラウザの両方をターゲットにする場合は、存在演算子(後述)を使用すると、どこに追加するかを確実に把握できます。exports ? this。
CoffeeScriptはすべての変数宣言を処理するため、ES2015のletまたはconstを使用して変数を宣言することはできません。これは意図的なものです。変数宣言について考える必要がないことで得られるシンプルさが、変数を宣言する3つの異なる方法があることの利点を上回ると考えています。
If、Else、Unless、および条件付き代入
if/elseステートメントは、括弧と中括弧を使用せずに記述できます。関数やその他のブロック式と同様に、複数行の条件はインデントで区切られます。末尾にifまたはunlessが付いた便利な後置形式もあります。
CoffeeScriptは、可能な場合は三項演算子を使用し、それ以外の場合はクロージャラッパーを使用して、ifステートメントをJavaScript式にコンパイルできます。CoffeeScriptには明示的な三項ステートメントはありません。単に単一行で通常のifステートメントを使用します。
スプラット、または残余パラメータ/スプレッド構文
JavaScriptのargumentsオブジェクトは、可変数の引数を受け入れる関数を操作するための便利な方法です。CoffeeScriptは、関数定義と呼び出しの両方にスプラット...を提供し、可変数の引数を少しだけ受け入れやすくします。ES2015は、この機能を残余パラメータとして採用しました。
スプラットを使用すると、配列要素を省略することもできます…
…およびオブジェクトプロパティ。
ECMAScriptでは、これはスプレッド構文と呼ばれ、ES2015以降は配列で、ES2018以降はオブジェクトでサポートされています。
ループと内包表記
CoffeeScriptで記述するほとんどのループは、配列、オブジェクト、および範囲に対する内包表記になります。内包表記は、(オプションのガード句と現在の配列インデックスの値を使用して)forループを置き換え(コンパイルされます)。forループとは異なり、配列内包表記は式であり、返したり代入したりできます。
内包表記は、たとえばループ、each/forEach、map、またはselect/filterを使用するほとんどの場所を処理できるはずです。
shortNames = (name for name in list when name.length < 5)
ループの開始と終了がわかっている場合、または固定サイズの増分でステップスルーする場合は、範囲を使用して内包表記の開始と終了を指定できます。
上の例では、内包表記の値を変数に代入しているため、CoffeeScriptは各反復の結果を配列に収集していることに注意してください。関数が副作用のためだけに実行されるループで終わることがあります。このような場合は、意味のある戻り値(trueなど)またはnullを関数の下部に追加して、内包表記の結果を誤って返していないように注意してください。
固定サイズのチャンクで範囲内包表記をステップスルーするには、byを使用します。たとえば、evens = (x for x in [0..10] by 2)。
現在の反復値が必要ない場合は、それを省略できます:browser.closeCurrentTab() for [0...count]
内包表記は、オブジェクト内のキーと値を反復処理するためにも使用できます。配列内の値の代わりにオブジェクトのプロパティに対する内包表記を示すには、ofを使用します。
プロトタイプから継承される可能性のあるプロパティを回避するために、hasOwnPropertyチェックを追加して、オブジェクト自体で定義されているキーのみを反復処理する場合は、for own key, value of objectを使用します。
ジェネレーター関数を反復処理するには、fromを使用します。「ジェネレーター関数」を参照してください。
CoffeeScriptが提供する唯一の低レベルループは、whileループです。JavaScriptとの主な違いは、whileループを式として使用して、ループの各反復の結果を含む配列を返すことができることです。
読みやすくするために、untilキーワードはwhile notと同等であり、loopキーワードはwhile trueと同等です。
JavaScriptループを使用して関数を生成する場合、ループ変数が閉じられ、生成されたすべての関数が単に最終値を共有しないようにするために、クロージャラッパーを挿入するのが一般的です。CoffeeScriptは、渡された関数を即座に呼び出し、引数を転送するdoキーワードを提供します。
範囲を使用した配列のスライスとスプライシング
範囲は、配列のスライスを抽出するためにも使用できます。2つのドット(3..6)を使用すると、範囲は包括的になります(3, 4, 5, 6)。3つのドット(3...6)を使用すると、範囲は末尾を除外します(3, 4, 5)。スライスインデックスには便利なデフォルトがあります。省略された最初のインデックスはゼロにデフォルト設定され、省略された2番目のインデックスは配列のサイズにデフォルト設定されます。
同じ構文を代入に使用して、配列のセグメントを新しい値で置き換え、スプライシングできます。
JavaScript文字列は不変であり、スプライシングできないことに注意してください。
すべてが式です(少なくとも、可能な限り)
CoffeeScript関数にreturnステートメントを追加しなくても、最終値を返すことに気づいたかもしれません。CoffeeScriptコンパイラは、言語のすべてのステートメントを式として使用できるようにしようとします。以下の関数で、returnが実行可能な各分岐にどのようにプッシュされているかを見てください。
関数は常に最終値を返しますが、完了したことがわかっている場合は、明示的なreturn(return value)を書き出して、関数本体から早期に戻ることも推奨されます。
変数の宣言はスコープの先頭で行われるため、まだ出現していない変数であっても、式の中で代入を使用できます。
JavaScriptでは通常文となるものが、CoffeeScriptで式の一部として使用される場合、クロージャでラップされることで式に変換されます。これにより、例えば、内包表記の結果を変数に代入するなど、便利なことができます。
また、try/catch文を関数呼び出しに直接渡すような、少し奇妙なことも可能です。
JavaScriptには、意味のある式に変換できない文がいくつかあります。具体的には、break、continue、およびreturnです。コードブロック内でこれらを使用した場合、CoffeeScriptは変換を試みません。
演算子とエイリアス
==演算子は、望ましくない型変換を頻繁に引き起こし、推移的でなく、他の言語とは異なる意味を持つため、CoffeeScriptでは==は===に、!=は!==にコンパイルされます。さらに、isは===に、isntは!==にコンパイルされます。
!のエイリアスとしてnotを使用できます。
論理演算では、andは&&に、orは||にコンパイルされます。
改行またはセミコロンの代わりに、thenをwhile、if/else、およびswitch/when文で、条件と式を区切るために使用できます。
YAMLのように、onとyesはブール値trueと同じであり、offとnoはブール値falseと同じです。
unlessはifの逆として使用できます。
this.propertyのショートカットとして、@propertyを使用できます。
配列の存在をテストするにはinを使用し、JavaScriptオブジェクトのキーの存在をテストするにはofを使用できます。
forループでは、fromはES2015のofにコンパイルされます。(そうです、残念ながら、CoffeeScriptのofはES2015のofより前に存在していました。)
数式を簡略化するために、**はべき乗に使用でき、//は切り捨て除算を実行します。%はJavaScriptとまったく同じように機能しますが、%%は「被除数依存の剰余」を提供します。
まとめて見てみましょう
| CoffeeScript | JavaScript |
|---|---|
is |
=== |
isnt |
!== |
not |
! |
and |
&& |
or |
|| |
true、yes、on |
true |
false、no、off |
false |
@、this |
this |
a in b |
[].indexOf.call(b, a) >= 0 |
a of b |
a in b |
for a from b |
for (a of b) |
a ** b |
a ** b |
a // b |
Math.floor(a / b) |
a %% b |
(a % b + b) % b |
存在演算子
JavaScriptで変数の存在を確認するのは少し難しいです。if (variable) …はほぼ近いですが、ゼロ、空の文字列、およびfalse(最も一般的なケースを挙げるだけでも)の場合に失敗します。CoffeeScriptの存在演算子?は、変数がnull、undefined、または宣言されていない場合を除き、trueを返します。これはRubyのnil?に類似しています。
また、JavaScriptのパターンa = a || valueよりも安全な条件付き代入にも使用でき、数値や文字列を処理する可能性がある場合に役立ちます。
コンパイラがaがスコープ内であり、したがって宣言されていることを認識している場合、a?はa != nullにコンパイルされます。a !== nullではありません。 !=はnullとの緩い比較を行い、undefinedとの比較も兼ねます。逆もnot a?またはunless a?に対して当てはまります。
変数が宣言されていない可能性がある場合、コンパイラは徹底的なチェックを行います。これは、JavaScriptのコーダーが未知の変数が存在するかどうかを確認したい場合に、実際に入力すべき内容です。
存在演算子のアクセサー形式?.を使用して、プロパティチェーン内のnull参照を吸収できます。ベース値がnullまたはundefinedである可能性がある場合は、ドットアクセサー.の代わりに使用してください。すべてのプロパティが存在する場合、期待される結果が得られます。チェーンが途切れた場合は、発生するはずのTypeErrorの代わりにundefinedが返されます。
完全な説明
| 例 | 定義 |
|---|---|
a? |
aがスコープ内にあり、a != nullであることをテストします。 |
a ? b |
aがスコープ内にあり、a != nullの場合はaを返します。それ以外の場合は、bを返します。 |
a?.b または a?['b'] |
aがスコープ内にあり、a != nullの場合はa.bを返します。それ以外の場合は、undefinedを返します。 |
a?(b, c) または a? b, c |
aがスコープ内にあり、呼び出し可能な場合は、aを(引数bとcを使用して)呼び出した結果を返します。それ以外の場合は、undefinedを返します。 |
a ?= b |
aがスコープ内にない場合、またはa == nullの場合、bの値をaに代入します。aの新しい値を生成します。 |
関数呼び出しのチェーン
先頭の.は、開いているすべての呼び出しを閉じ、より単純なチェーン構文を可能にします。
分割代入
JavaScript(ES2015以降)と同様に、CoffeeScriptにも分割代入構文があります。配列またはオブジェクトリテラルを値に代入すると、CoffeeScriptは両側を分解して照合し、右側の値を左側の変数に代入します。最も単純なケースでは、並列代入に使用できます。
ただし、複数の値を返す関数を扱う場合にも役立ちます。
分割代入は、配列およびオブジェクトのネストの任意の深さで使用でき、深くネストされたプロパティを抽出するのに役立ちます。
分割代入は、スプラットと組み合わせることもできます。
展開を使用すると、配列の残りの値を代入せずに、配列の末尾から要素を取得できます。これは、関数パラメーターリストでも機能します。
分割代入は、クラスコンストラクターと組み合わせて、コンストラクターに渡されたオプションオブジェクトからインスタンスにプロパティを割り当てる場合にも役立ちます。
上記の例は、分割されたオブジェクトまたは配列でプロパティが欠落している場合、JavaScriptと同様に、デフォルトを指定できることも示しています。ただし、存在演算子とは異なり、デフォルトは値が欠落しているかundefinedの場合にのみ適用されることに注意してください。—nullを渡すと、デフォルトではなくnullの値が設定されます。
束縛された(ファットアロー)関数
JavaScriptでは、thisキーワードは、現在の関数がアタッチされているオブジェクトを意味するように動的にスコープされます。関数をコールバックとして渡すか、別のオブジェクトにアタッチすると、thisの元の値は失われます。この動作に慣れていない場合は、このDigital Webの記事で、その癖の良い概要を知ることができます。
ファットアロー=>を使用すると、関数を定義すると同時に、その場でthisの現在の値にバインドできます。これは、PrototypeやjQueryなどのコールバックベースのライブラリを使用したり、eachに渡すイテレーター関数を作成したり、onで使用するイベントハンドラー関数を作成する場合に役立ちます。ファットアローで作成された関数は、定義されているthisのプロパティにアクセスできます。
上記のコールバックで->を使用した場合、@customerはDOM要素の未定義の「customer」プロパティを参照し、それに対してpurchase()を呼び出そうとすると、例外が発生したはずです。
ファットアローはCoffeeScriptの最も人気のある機能の1つであり、ES2015で採用されました。そのため、CoffeeScript 2では=>がESの=>にコンパイルされます。
ジェネレーター関数
CoffeeScriptは、yieldキーワードを介してES2015のジェネレーター関数をサポートしています。function*(){}のようなナンセンスはありません。CoffeeScriptのジェネレーターは、単純にyieldする関数です。
yield*はyield fromと呼ばれ、yieldしないジェネレーターを強制する必要がある場合はyield returnを使用できます。
for…fromを使用して、ジェネレーター関数を反復処理できます。
非同期関数
ES2017の非同期関数は、awaitキーワードを介してサポートされています。ジェネレーターと同様に、asyncキーワードは必要ありません。CoffeeScriptの非同期関数は、単純にawaitする関数です。
yield returnがジェネレーターを強制するのと同様に、await returnを使用して関数を非同期にするように強制できます。
クラス
CoffeeScript 1は、プロトタイプ関数を扱うための糖衣構文として、classおよびextendsキーワードを提供していました。ES2015では、JavaScriptがこれらのキーワードを採用しました。そのため、CoffeeScript 2は、そのclassおよびextendsキーワードをES2015クラスにコンパイルします。
静的メソッドは、メソッド名の前に@を使用して定義できます。
最後に、クラス定義は実行可能コードのブロックであり、興味深いメタプログラミングの可能性を実現します。クラス定義のコンテキストでは、thisはクラスオブジェクト自体です。したがって、@property: valueを使用して静的プロパティを代入できます。
プロトタイプ継承
CoffeeScriptは、ES2015クラスをサポートすることに加えて、プロトタイプを扱うためのショートカットを提供します。::演算子を使用すると、オブジェクトのプロトタイプにすばやくアクセスできます。
Switch/When/Else
JavaScriptのswitch文は少し扱いにくいです。誤ってデフォルトケースにフォールスルーしないように、すべてのcase文の最後にbreakを忘れないようにする必要があります。CoffeeScriptは意図しないフォールスルーを防ぎ、switchを返却可能で代入可能な式に変換できます。形式は次のとおりです。switch条件、when句、elseデフォルトケース。
Rubyと同様に、CoffeeScriptのswitch文は、各when句に複数の値を取ることができます。値のいずれかが一致する場合、句が実行されます。
switch文は制御式なしで使用して、if/elseチェーンのよりクリーンな代替手段にすることもできます。
Try/Catch/Finally
try 式は、JavaScript の try 文と同じセマンティクスを持ちますが、CoffeeScript では、catch 部分と finally 部分の両方を省略できます。catch 部分は、エラーパラメータが必要ない場合は省略することもできます。
連結された比較
CoffeeScript は Python から連結された比較を借用しており、値が特定の範囲内にあるかどうかを簡単にテストできます。
ブロック正規表現
ブロック文字列やコメントと同様に、CoffeeScript はブロック正規表現をサポートしています。これは、内部の空白を無視し、コメントや挿入を含むことができる拡張正規表現です。Perl の /x 修飾子をモデルにした CoffeeScript のブロック正規表現は、/// で区切られ、複雑な正規表現を読みやすくするために大いに役立ちます。CoffeeScript のソースから引用すると
タグ付きテンプレートリテラル
CoffeeScript は、カスタマイズされた文字列挿入を可能にするES2015 タグ付きテンプレートリテラルをサポートしています。文字列の直前に関数名(2 つの間にスペースなし)を付けると、CoffeeScript はこの「関数と文字列」の組み合わせを ES2015 タグ付きテンプレートリテラルとして出力します。これは、それに応じて動作します。つまり、関数が呼び出され、パラメータは挿入された文字列を構成する入力テキストと式部分になります。その後、関数はこれらの部分を出力文字列に組み立てて、カスタム文字列挿入を提供できます。
モジュール
ES2015 モジュールは CoffeeScript でサポートされており、非常に類似した import および export 構文を使用します
動的インポートもサポートされており、括弧が必要です
CoffeeScript コンパイラはモジュールを解決しないことに注意してください。CoffeeScript で import または export ステートメントを記述すると、結果の出力に import または export ステートメントが生成されます。このようなステートメントは、すべての最新のブラウザで実行でき(スクリプトが <script type="module"> を介して参照されている場合)、出力の .js ファイルが、最も近い親の package.json ファイルに "type": "module" が含まれているフォルダーにある場合は、Node.js で実行できます。ランタイムが生成された出力を評価しているため、import ステートメントは出力ファイルを参照する必要があります。したがって、file.coffee が file.js として出力される場合は、import ステートメントで file.js として参照する必要があり、.js 拡張子を含める必要があります。
また、import または export ステートメントを含むファイルは、トップレベル関数安全ラッパーなしで出力されます。つまり、モジュールをインポートまたはエクスポートすると、そのファイルに対して自動的にベアモードがトリガーされます。これは、ES2015 仕様に従って、import または export ステートメントが最上位のスコープで発生する必要があるためです。
埋め込み JavaScript
できれば使う必要はないでしょうが、CoffeeScript 内に JavaScript のスニペットを混在させる必要がある場合は、バッククォートを使用して直接渡すことができます。
バックスラッシュでバッククォートをエスケープします: \` は ` になります。
バッククォートの前のバックスラッシュをさらに多くのバックスラッシュでエスケープします: \\\` は \` になります。
トリプルバッククォートを使用して JavaScript のブロックを埋め込むこともできます。JavaScript ブロック内でバッククォートが必要な場合は、バッククォートをエスケープするよりも簡単です。
JSX
JSX は、XML 要素が混在する JavaScript です。React 用に考案されたものですが、特定のライブラリやフレームワークに固有のものではありません。
CoffeeScript は、個別のプラグインや特別な設定を必要とせずに、XML 要素が混在することをサポートしています。XML 要素はそのままコンパイルされ、通常の JSX ファイルのように解析できる JSX を出力します。たとえば、React JSX 変換を使用した Babel などです。CoffeeScript は、React.createElement 呼び出しや、React やその他のフレームワークに固有のコードを出力しません。この JSX を、XML 要素がコンパイルされることを望む関数呼び出しに変換するには、ビルドチェーンに別のステップを追加する必要があります。
JSX や HTML と同様に、< と > を使用して XML タグを示します。{ と } を使用してタグ内に CoffeeScript コードを挿入できます。コンパイラエラーを回避するために、< と > を「より小さい」または「より大きい」という意味で使用する場合は、XML タグと区別するために演算子をスペースで囲む必要があります。したがって、i<len ではなく i < len となります。コンパイラは、意図を確信できる場合は寛容であろうとしますが、「より小さい」および「より大きい」演算子の周りに常にスペースを配置すると、あいまいさを解消できます。
CoffeeScript の古いプラグインやフォークは、JSX 構文をサポートし、CSX または CJSX と呼んでいました。また、.cjsx ファイル拡張子を使用することが多かったのですが、これはもう必要ありません。通常の .coffee で十分です。
型注釈
静的型チェックは、Flow のコメント型構文を使用することで CoffeeScript で実現できます
CoffeeScript 自体は型チェックを行いません。上記の JavaScript 出力を Flow に渡して、コードを検証する必要があります。ほとんどの人がこのためにビルドツールを使用すると予想されますが、CoffeeScript および Flow コマンドラインツールを使用して、可能な限り最も簡単な方法でこれを行う方法を以下に示します。Flow をインストールし、プロジェクトフォルダーに最新の CoffeeScript をインストール済みであると仮定します
coffee --bare --no-header --compile app.coffee && npm run flow
--bare と --no-header は、Flow がファイルの最初の行にコメント // @flow を必要とするため、重要です。ビルドチェーンを構成して CoffeeScript をコンパイルし、結果を Flow にインメモリで渡す場合、この例よりも優れたパフォーマンスを得ることができます。また、適切なビルドツールは、CoffeeScript ファイルを監視し、保存時に再コンパイルして型チェックを行うことができるはずです。
CoffeeScript で静的型チェックを実現する別の方法を知っている場合は、問題を提起してお知らせください。
リテラシー CoffeeScript
通常のプログラミング言語として使用されるだけでなく、CoffeeScript は「リテラシー」モードで記述することもできます。ファイルに .litcoffee 拡張子を付けると、Markdown ドキュメントとして記述できます。これは、実行可能な CoffeeScript コードでもあるドキュメントです。コンパイラは、インデントされたブロック(ソースコードを示す Markdown の方法)を実行可能なコードとして扱い、残りの部分はコメントとして無視します。コードブロックは、コメントから少なくとも 1 つの空白行で区切る必要もあります。
ちょっとした楽しみとして、コンパイラの一部は現在この方法で実装されています。 ドキュメントとして、raw、テキストエディタで適切にハイライト表示してください。
いくつかの注意点
- コードブロックは、互いに一貫したインデントを維持する必要があります。コンパイラがリテラシー CoffeeScript ファイルを解析するとき、まず、コードブロック以外のすべての行を破棄してから、残りの部分を通常の CoffeeScript ファイルとして解析します。したがって、コードブロックは、コメント行が存在しないかのように、一貫したインデント(タブまたはスペースでインデントされているかどうかを含む)で記述する必要があります。
- 同様に、リスト項目または引用符内のコードブロックは、実行可能なコードとして扱われません。リスト項目と引用符は独自のインデントを意味するため、一部がこれらの他のブロック内にあり、一部がそうでない場合に、連続するコードブロック間のインデントをどのように扱うかはあいまいになります。
- リスト項目は、最大でも 1 つの段落の長さしか使用できません。リスト項目の 2 番目の段落は、空白行の後でインデントされるため、コードブロックと区別できません。
ソースマップ
CoffeeScript には、ソースマップを生成するためのサポートが含まれています。これは、JavaScript エンジンに、評価されているコードと一致する CoffeeScript プログラムの部分を伝える方法です。ソースマップをサポートするブラウザは、ソースマップを自動的に使用して、デバッガーに元のソースコードを表示できます。JavaScript ファイルとともにソースマップを生成するには、コンパイラに --map または -m フラグを渡します。
ソースマップ、その仕組み、ブラウザでの設定方法の完全な入門については、HTML5 チュートリアルを参照してください。
Cake と Cakefile
CoffeeScript には、Make および Rake に似た (非常に) シンプルなビルドシステムが含まれています。当然、これは Cake と呼ばれ、CoffeeScript 言語自体をビルドおよびテストするタスクに使用されます。タスクは Cakefile という名前のファイルで定義され、ディレクトリ内から cake [task] を実行して呼び出すことができます。すべてのタスクとオプションのリストを印刷するには、cake と入力するだけです。
タスク定義は CoffeeScript で記述されているため、Cakefile に任意のコードを記述できます。タスクを実行するときに呼び出す名前、長い説明、および関数を使用してタスクを定義します。タスクがコマンドラインオプションを受け取る場合、短いフラグと長いフラグを使用してオプションを定義でき、options オブジェクトで使用できるようになります。これは、Node.js API を使用して CoffeeScript のパーサーを再構築するタスクです
別のタスクの前に 1 つのタスクを呼び出す必要がある場合 (たとえば、test の前に build を実行する場合)、invoke 関数を使用できます: invoke 'build'。Cake タスクは、CoffeeScript 関数をコマンドラインに公開するための最小限の方法であるため、組み込みの気の利いた機能は期待しないでください。依存関係や非同期コールバックが必要な場合は、ケーキタスクではなく、コード自体に配置するのが最善です。
"text/coffeescript" スクリプトタグ
本格的な利用は推奨されませんが、CoffeeScript は <script type="text/coffeescript"> タグを使用してブラウザに直接含めることができます。ソースには、コンパイラの圧縮および最小化バージョン(現在のバージョンをこちらからダウンロード(gzip圧縮時77k))が docs/v2/browser-compiler-legacy/coffeescript.js として含まれています。インラインの CoffeeScript タグを含むページにこのファイルを含めると、それらのタグが順番にコンパイルおよび評価されます。
CoffeeScript に関する通常の注意点が適用されます。インラインスクリプトはクロージャラッパー内で実行されるため、グローバル変数または関数を公開する場合は、window オブジェクトにアタッチする必要があります。
統合
CoffeeScript は広大な JavaScript エコシステムの一部であり、多くのライブラリが CoffeeScript と JavaScript の統合を支援しています。主要なプロジェクト、特に CoffeeScript 2 で動作するように更新されたプロジェクトをここにリストします。詳細は wiki ページ を参照してください。このセクションに追加すべきプロジェクトがある場合は、issue をオープンするか、プルリクエスト を送信してください。プロジェクトはカテゴリ別にアルファベット順にリストされています。
ビルドツール
-
Browserify with coffeeify
-
Gulp with gulp-coffee
-
Webpack with coffee-loader
コードエディタ
フレームワーク
リンターとフォーマット
テスト
リソース
- GitHub 上の CoffeeScript
- CoffeeScript の Issue
バグレポート、機能提案、および言語の変更に関するアイデアはこちらに投稿してください。 - CoffeeScript Google グループ
質問がある場合は、メーリングリストが助けを得るのに適しています。 - CoffeeScript Wiki
CoffeeScript の便利なヒントやコツを学んだり、落とし穴に遭遇した場合は、wiki で共有してください。 - FAQ
CoffeeScript に関する質問が以前にされたことがあるかもしれません。最初に FAQ を確認してください。 - JS2Coffee
非常に優れた JavaScript から CoffeeScript への逆コンパイラです。完璧ではない(JavaScript のクラスを推測したり、束縛された関数が必要な場合を推測したりなど)でしょうが、単純なスクリプトを変換するための優れた出発点になります。 - 高解像度ロゴ
CoffeeScript のロゴは、プレゼンテーションで使用するために SVG 形式で入手できます。
書籍
CoffeeScript を始めるのに役立つ優れたリソースが多数あり、オンラインで無料で入手できるものもあります。
- The Little Book on CoffeeScript は、Alex MacCaw 氏によって明確かつ正確に書かれた、CoffeeScript の簡単な 5 章の入門書です。
- Smooth CoffeeScript は、優れた書籍 Eloquent JavaScript を、代わりに CoffeeScript で書かれたとしたらどうなるかを再考したものです。言語機能だけでなく、関数型およびオブジェクト指向のプログラミングスタイルについても説明しています。E. Hoigaard 氏著。
- CoffeeScript: Accelerated JavaScript Development は、Trevor Burnham 氏による、この言語の徹底的な入門書です。この本の終わりまでに、クライアント側と Node.js 部分の両方を CoffeeScript で記述して、ペースの速いマルチプレイヤーワードゲームを構築することになります。
- CoffeeScript Programming with jQuery, Rails, and Node.js は、Michael Erasmus 氏による新しい書籍で、ブラウザ(jQuery)とサーバー側(Rails、Node)の両方での現実的な使用に焦点を当てて CoffeeScript を扱っています。
- CoffeeScript Ristretto は、単純な関数からクロージャ、高階関数、オブジェクト、クラス、コンビネータ、デコレータまで、CoffeeScript のセマンティクスを深く掘り下げたものです。Reg Braithwaite 氏著。
- Testing with CoffeeScript は、CoffeeScript と Jasmine を使用してテスト可能なアプリケーションを構築するための簡潔で無料でダウンロード可能なガイドです。
- CoffeeScript Application Development は Packt から発行されており、デモンストレーション Web アプリケーションを構築するプロセスを説明しながら CoffeeScript を紹介しています。90 を超える「レシピ」を掲載した CoffeeScript Application Development Coookbook も入手可能です。
- CoffeeScript in Action は、Manning Publications から発行されており、CoffeeScript の構文、構成テクニック、およびアプリケーション開発について説明しています。
- CoffeeScript: Die Alternative zu JavaScript は dpunkt.verlag から発行されており、ドイツ語で書かれた最初の CoffeeScript の書籍です。
スクリーンキャスト
- A Sip of CoffeeScript は、6 つのスクリーンキャストとブラウザ内コーディングを組み合わせて、楽しく学習できる Code School コース です。最初のレベルは無料で試すことができます。
- Meet CoffeeScript は、PeepCode(現在は PluralSight)による 75 分間のスクリーンキャストです。CoffeeScript を同等の JS に変換する様子をアニメーションで示している点が非常に印象的です。
- 時間的な制約を少なくしたい場合は、RailsCasts の CoffeeScript Basics が、CoffeeScript に関する重要なポイントすべてを 11 分でカバーしているので、役立つでしょう。
例
オープンソースの CoffeeScript の例の最適なリストは GitHub で見つけることができます。しかし、さらにいくつかの例を挙げると
- GitHub の Hubot は、便利で役に立たないタスクをいくつでも実行できるフレンドリーな IRC ロボットです。
- sstephenson の Pow は、包括的なアノテーション付きソースを備えた、ゼロ構成の Rack サーバーです。
- technoweenie の Coffee-Resque は、Node.js 用の Resque のポートです。
- stephank の Orona は、最新のブラウザ向けにリメイクされた Bolo タンクゲームです。
- GitHub の Atom は、Web テクノロジー上に構築されたハッカブルなテキストエディタです。
- Basecamp の Trix は、Web アプリケーション向けのリッチテキストエディタです。
Web チャット (IRC)
簡単なヘルプやアドバイスは、irc.freenode.net の CoffeeScript IRC ルーム #coffeescript で見つかることがよくあります。Web ブラウザ経由で参加できます。
アノテーション付きソース
CoffeeScript 2.7.0 のソースは、読みやすくアノテーション付きの形式で こちら で参照できます。特定のソースファイルに直接ジャンプすることもできます。
- 文法ルール — src/grammar
- 字句解析トークン — src/lexer
- リライター — src/rewriter
- 構文木 — src/nodes
- レキシカルスコープ — src/scope
- ヘルパーとユーティリティ関数 — src/helpers
- CoffeeScript モジュール — src/coffeescript
- Cake と Cakefile — src/cake
- 「coffee」コマンドラインユーティリティ — src/command
- オプション解析 — src/optparse
- インタラクティブ REPL — src/repl
- ソースマップ — src/sourcemap
貢献
貢献は大歓迎です!お気軽に リポジトリ をフォークして、プルリクエストを送信してください。
ECMAScript の一部の機能は意図的にサポートされていません。お探しの機能がすでに議論されているかどうかを確認するために、GitHub の未解決および解決済みの issue を確認してください。一般的なルールとして、まだ確定していない(提案承認プロセスのステージ 4)機能、または主要なブラウザや Node で実装されていない(場合によってはステージ 3 の機能で発生することがあります)機能に対する ECMAScript 構文はサポートしていません。CoffeeScript がサポートすることを選択したステージ 3 の機能は、実験的であるとみなされ、機能がステージ 4 に達するまで、破壊的な変更または削除される可能性があります。
CoffeeScript への追加に関するリソースについては、Wiki、特に パーサーの仕組み を参照してください。
プルリクエストが受け入れられる可能性を高めるためにできることがいくつかあります。
- テストを作成してください!プルリクエストには、何も壊していないことを確認するための基本的なテスト、または将来の変更がコードを壊さないことを確認するためのテストを含める必要があります。
- CoffeeScript コードベースの残りの部分のスタイルに従ってください。
- ECMAScript 構文が成熟している(ステージ 4、または主要なブラウザやランタイムでサポートされているステージ 3)ことを確認してください。
- 特定のユースケースまたはフレームワークを対象とした機能ではなく、幅広いユーティリティを持つ機能のみを追加してください。
もちろん、素晴らしい追加機能があるものの、これらの制約に適合しない可能性も十分にあります。独自のソリューションを自由に展開してください。多くの仲間がいるでしょう。
サポートされていない ECMAScript 機能
CoffeeScript が意図的にサポートしていない ECMAScript の機能がいくつかあります。
let と const: ブロックスコープの変数と再代入保護された変数
CoffeeScriptが設計された際、varは意図的に省略されました。これは、開発者が変数の宣言(var foo)と変数の代入(foo = 1)を区別する必要があるという、頭の中の整理の手間を省くためでした。CoffeeScriptコンパイラは、すべての関数スコープの先頭にvarステートメントを生成することで、宣言を自動的に処理します。これにより、グローバル変数を誤って宣言することが不可能になります。
letとconstは、JavaScriptに便利な機能を追加し、例えばif文の本体やforループの本体など、ブロックスコープ内で変数を宣言できるようになります。一方、varは常に関数全体のスコープで変数を宣言します。CoffeeScript 2が設計された際、この機能がCoffeeScriptで変数の宣言を考慮する必要がないというシンプルさを上回るほど有用かどうかについて多くの議論がありました。最終的に、シンプルさの方がより重要であると判断されました。CoffeeScriptでは、変数の種類は1つのみのままです。
constは、変数の再代入を防ぐだけであり、他の言語での定数のように、変数の値が変更されるのを防ぐものではないことに注意してください。
const obj = {foo: 'bar'}; obj.foo = 'baz'; // Allowed! obj = {}; // Throws error
名前付き関数と関数宣言
CoffeeScriptの初心者は、CoffeeScriptが生成するfoo = function() {}とは対照的に、JavaScriptのfunction foo() {}をどのように生成するのか疑問に思うことがよくあります。最初の形式は関数宣言であり、2番目の形式は関数式です。前述のように、CoffeeScriptではすべてが式であるため、自然に式形式を優先します。1つの形式のみをサポートすることで、2つの形式間の微妙な違いから生じる可能性のある紛らわしいバグを回避できます。
技術的には、foo = function() {}は、fooという名前の変数に代入される匿名関数を作成しています。CoffeeScriptの非常に初期のバージョンでは、この関数に名前を付けていました。例えば、foo = function foo() {}のように。しかし、これはInternet Explorerとの互換性の問題のために削除されました。しばらくの間、これらの関数はスタックトレースで名前が付けられていないため、人々を悩ませていました。しかし、最新のJavaScriptランタイムでは、そのような匿名関数の名前を、それらが代入される変数の名前から推測します。この状況を考えると、現在の動作を維持するのが最も簡単です。
getとsetキーワードの短縮構文
関数またはクラスメソッドの前に付くキーワードとしてのgetとsetは、CoffeeScriptでは意図的に実装されていません。
これは、CoffeeScriptではそのような構文が関数呼び出し(例えばget(function foo() {}))とまったく同じに見え、文法的な曖昧さを避けるためです。また、少し冗長ですが、同様に効果的な代替構文があるためです。
CoffeeScript 1.xから2への破壊的な変更
CoffeeScript 2は、可能な限り多くの慣用的なES2015+構文を、CoffeeScript 1.xからの破壊的な変更を最小限に抑えながら出力することを目指しています。残念ながら、いくつかの破壊的な変更は避けられませんでした。
束縛(ファットアロー)関数
CoffeeScript 1.xでは、=>は通常のfunctionにコンパイルされましたが、this/@への参照は外側のスコープのthisを使用するように書き換えられるか、または.bindを介して内側の関数が外側のスコープに束縛されていました(そのため、「束縛関数」という名前が付いています)。CoffeeScript 2では、=>はES2015の=>にコンパイルされ、わずかに異なる動作をします。最大の違いは、ES2015では、=>関数にはargumentsオブジェクトがないことです。
関数パラメーターと分割代入要素のデフォルト値
関数デフォルトパラメーターに関するES2015仕様と分割代入のデフォルト値に従い、デフォルト値は値がないか、undefinedの場合にのみ適用されます。CoffeeScript 1.xでは、デフォルト値はこれらの場合に適用されますが、値がnullの場合にも適用されていました。
束縛ジェネレーター関数
束縛ジェネレーター関数、別名ジェネレーターアロー関数は、ECMAScriptでは許可されていません。function*または=>は記述できますが、両方は記述できません。したがって、このようなCoffeeScriptコードは
f = => yield this # Throws a compiler error
昔ながらの方法で書き換える必要があります。
クラスはES2015クラスにコンパイルされます
ES2015クラスとそのメソッドには、通常の関数よりもいくつかの制限があります。
クラスコンストラクターはnewなしでは呼び出すことができません
(class)() # Throws a TypeError at runtime
ES2015クラスでは、束縛(ファットアロー)メソッドは許可されていません。CoffeeScriptコンパイラは、それらのサポートを維持するためにいくつかの工夫を行いますが、対応できないことの1つは、束縛される前に束縛メソッドを呼び出すことです。
class Base constructor: -> @onClick() # This works clickHandler = @onClick clickHandler() # This throws a runtime error class Component extends Base onClick: => console.log 'Clicked!', @
クラスメソッドはnewで使用することはできません(一般的ではありません)
class Namespace @Klass = -> new Namespace.Klass # Throws a TypeError at runtime
ES2015クラスへのコンパイルに必要な巻き上げのため、クラスメソッドの動的キーは、メソッドがプロトタイプ形式で割り当てられない限り、実行可能なクラス本体の値を使用できません。
class A name = 'method' "#{name}": -> # This method will be named 'undefined' @::[name] = -> # This will work; assigns to `A.prototype.method`
superとthis
派生クラス(別のクラスをextendsするクラス)のコンストラクターでは、superを呼び出す前にthisを使用することはできません
class B extends A constructor: -> this # Throws a compiler error
これは、派生クラスのコンストラクターでthisへの参照をsuperへの引数として渡すこともできないことを意味します。
class B extends A constructor: (@arg) -> super @arg # Throws a compiler error
これはES2015クラスの制限事項です。回避策として、super呼び出し後にthisに代入してください。
superとextends
アクセサーとのsuperの構文衝突のため、「裸の」super(括弧なしのキーワードsuper)は、すべての引数を転送するスーパーコールにコンパイルされなくなりました。
class B extends A foo: -> super # Throws a compiler error
引数は、スプラットを使用して明示的に転送できます。
または、親関数が引数を必要としないことがわかっている場合は、super()を呼び出すだけです。
CoffeeScript 1.xでは、extendsキーワードを使用して関数間でプロトタイプ継承を設定でき、superをプロトタイプ割り当てされた関数で手動で使用できました
A = -> B = -> B extends A B.prototype.foo = -> super arguments... # Last two lines each throw compiler errors in CoffeeScript 2
ES2015のextendsとsuperへの切り替えのため、これらのキーワードをプロトタイプ関数に使用することはサポートされなくなりました。上記のケースは次のようにリファクタリングできます。
or
JSXと<および>演算子
JSXの追加により、<および>文字は、「より小さい」および「より大きい」演算子として、また、<div>のようなXMLタグの区切り文字としても機能します。最適な結果を得るには、一般に、XMLタグと区別するために、常に演算子をスペースで囲む必要があります:i < len、i<lenではありません。コンパイラは、意図を確実に把握できる場合は寛容に処理しようとしますが、「より小さい」および「より大きい」演算子の周りに常にスペースを入れることで、曖昧さを解消できます。
リテラシーCoffeeScriptの解析
CoffeeScript 2のリテラシーCoffeeScriptの解析は、インデントされたリストをコードブロックとして扱わないように注意するようリファクタリングされました。ただし、これはすべてのコードブロック(コメントとして解釈される場合を除く)が、リストから少なくとも1つの空白行で区切られている必要があることを意味します。
また、コードブロックは一貫したインデントレベルを維持する必要があります。したがって、1つのタブ(または、2つのスペースや4つのスペースなど、タブストップと見なすもの)のインデントは、コードの「左マージン」として扱われ、ファイル内のすべてのコードはその列に対して相対的になります。
コメントの一部であり、実行されないようにするコードブロックは、少なくとも1行(理想的にはブロックの最初の行)を完全にインデントされていない必要があります。
引数解析とShebang(#!)行
CoffeeScript 1.xでは、スクリプトのパスとファイル名の後に、そのスクリプトに渡される引数の前に、--が必要でした。この慣例は現在非推奨となっています。したがって、次のようにする代わりに
coffee [options] path/to/script.coffee -- [args]
現在は次のように入力します
coffee [options] path/to/script.coffee [args]
非推奨のバージョンは引き続き機能しますが、スクリプトを実行する前に警告が表示されます。
Windows以外のプラットフォームでは、ファイルの先頭にShebang(#!)行を追加し、ファイルを実行可能としてマークすることで、.coffeeファイルを実行可能にすることができます。例えば
#!/usr/bin/env coffee x = 2 + 2 console.log x
これをexecutable.coffeeとして保存した場合、実行可能にして実行できます。
▶ chmod +x ./executable.coffee ▶ ./executable.coffee 4
CoffeeScript 1.xでは、スクリプトに引数を渡そうとすると、これが失敗していました。OS Xの一部のユーザーは、ファイルの最初の行として#!/usr/bin/env coffee --を使用することで問題を回避しました。ただし、これはLinuxでは機能しませんでした。これは、Linuxが単一の引数を超えるShebang行を解析できないためです。このようなスクリプトはOS Xで引き続き実行されますが、CoffeeScriptは、長すぎるShebang行で始まるファイルをコンパイルまたは評価する前に警告を表示するようになりました。CoffeeScript 2が--を必要とせずに引数を渡すことをサポートするようになったため、このようなスクリプトのShebang行を単に#!/usr/bin/env coffeeに変更することをお勧めします。
変更履歴
2.7.0
- インポートアサーション構文がサポートされるようになりました。これにより、
export { version } from './package.json' assert { type: 'json' }のようなステートメントや、import('./calendar.json', { assert { type: 'json' } })のような式が可能になります。 - CoffeeScriptは、Nodeのエラースタックトレースを常にパッチ適用しなくなりました。このパッチ適用は、行と列の番号を生成されたJavaScriptではなく、ソースのCoffeeScriptに一致するように調整するもので、他のライブラリとの競合を引き起こし、Nodeの新しい
--enable-source-mapsフラグが渡された場合は不要です。パッチ適用は、--enable-source-mapsが設定されておらず、他のライブラリがすでにスタックトレースにパッチ適用しておらず、require('coffeescript/register')が使用されている場合にのみ行われるようになります。パッチ適用は、require('coffeescript').patchStackTrace()またはimport { patchStackTrace } from 'coffeescript'; patchStackTrace()を介して明示的に有効にできます。 - ブロック(三重引用符付き)文字列が、テンプレートリテラルをラップするJSX式コンテナ(
<div a={`...`} />など)に正しくトランスパイルされていなかった問題のバグ修正。 - 明示的な
[配列または{オブジェクトリテラルの空でない最初の行に対して、行継続が期待どおりに動作していなかったバグ修正。
2.6.1
coffeescriptパッケージ自体が、Node.jsでESモジュールで使用される場合に名前付きエクスポートをサポートするようになりました。言い換えれば、import CoffeeScript from 'coffeescript'のみではなく、import { compile } from 'coffeescript'が動作するようになりました。- 非bareモードで大きなファイルをコンパイルする際のスタックオーバーフローエラーのバグ修正。
2.6.0
import.meta(import.meta.urlを含む)構文がサポートされるようになりました。awaitキーワードが関数外(つまり、トップレベル)でサポートされるようになりました。JavaScriptランタイムは、ESモジュールに対してのみこれをサポートしていることに注意してください。unlessまたはuntil行の末尾にあるfor内包表記のバグ修正。
2.5.1
- オブジェクトスプラットに、
a = {b::c...}のようなプロトタイプショートハンドや、a = {b?.c..., d?()...}のようなソークを含めることができるようになりました。 - 2.5.0での回帰により、Windowsスタイルの改行を含むファイルのコンパイルが大幅に遅くなったバグ修正。
- より大きな暗黙的オブジェクト内の
orのような行継続キーワードの後の暗黙的オブジェクトのバグ修正。
2.5.0
- コンパイラは、コマンドラインで
--astを介して、またはNode APIを介してastで利用できる新しいastオプションをサポートするようになりました。このオプションは、「抽象構文木」、または入力CoffeeScriptソースコードのJSONのような表現を出力します。このASTは、JavaScriptソースコードを扱うツールとの互換性のために、Babelの仕様に可能な限り近いものに従います。この新しいAST出力を使用する2つのツールは、eslint-plugin-coffee(ESLintを介してCoffeeScriptをリントするプラグイン)と、prettier-plugin-coffeescript(Prettierを介してCoffeeScriptソースコードを再フォーマットするプラグイン)です。CoffeeScriptのASTの構造とプロパティは最終的なものではなく、CoffeeScriptのバージョン間で破壊的な変更が行われる可能性があります。新しい統合を作成することに興味がある場合は、issueを開いてください。 - 数値区切り文字が、JavaScriptと同じ構文に従って、CoffeeScriptでサポートされるようになりました:
1_234_567。 BigInt数値が、JavaScriptと同じ構文に従って、CoffeeScriptでサポートされるようになりました:42n。'''と"""文字列が、\nエスケープシーケンスではなく、実際の改行を含む、より読みやすいJavaScriptテンプレートリテラル、またはバッククォート(`)文字列として出力されるようになりました。- クラスに計算されたプロパティ(例:
[someVar]: ->または@[anotherVar]: ->)を含めることができるようになりました。 - JSXタグにXMLスタイルの名前空間(例:
<image xlink:href="data:image/png" />または<Something:Tag></Something:Tag>)を含めることができるようになりました。 - コロンの後のコメントが出力に表示されない問題、JSX属性として誤って許可されなかった予約語、複数行配列でのインデントされた先頭の省略、およびソースマップの無効な位置データのバグ修正。
2.4.1
- CoffeeScriptブラウザコンパイラの従来のES5バージョンと最新のESモジュールバージョンの両方がNPMに公開され、パブリックCDN経由で利用可能なNPMモジュールのコードを提供するサービスを介してブラウザコンパイラを使用できるようになりました。従来のバージョンは
package.jsonの"browser"フィールドを介して参照され、ESモジュールバージョンは"module"フィールドを介して参照されます。
2.4.0
- 動的な
import()式がサポートされるようになりました。括弧は、importステートメントと区別するために常に必要です。「モジュール」を参照してください。執筆時点では、JavaScript機能自体はまだステージ3であることに注意してください。完全に標準化される前に変更された場合、CoffeeScriptでも変更される可能性があります。上流のECMAScript提案が確定する前にimport()を使用することは、提案が変更または却下された場合に破壊的な変更を受ける可能性があるため、暫定的と見なされるべきです。主要なブラウザやNode.jsなどの重要なランタイムで機能が出荷されたときにそれらをサポートするために、ステージ3のECMAScript機能に関するポリシーも改訂しました。 - CoffeeScriptコンパイラのブラウザバージョンが2つになりました。長年公開されてきた従来のものと、
importを介して使用できる新しいESモジュールバージョンです。ブラウザがサポートしている場合、このページで有効になります。ESモジュールブラウザコンパイラへの参照は、package.jsonの"module"フィールドにあります。 - Node APIは、以前はプライベートだった
registerCompiledメソッドを公開するようになり、coffeescriptパッケージを使用するプラグインがCoffeeScriptの内部キャッシュを利用できるようになりました。 - ブロック配列の文字列内のカンマ、クラス内の
doブロックで維持されていなかった@への参照、および関数のデフォルトパラメータが余分な括弧で囲まれなくなったバグ修正。
2.3.2
- Babel 7がサポートされるようになりました。バージョン7では、BabelチームはNPMの
babel-coreから@babel/coreに移行しました。現在、CoffeeScriptの--transpileオプションは、最初に@babel/core(Babelバージョン7以降)を検索し、次にbabel-core(バージョン6以前)を検索して、トランスパイルに使用するインストール済みのBabelバージョンを見つけようとします。 new.target構文がサポートされるようになりました。- キーワード
yieldに続いて、returnやその他のキーワードに対してすでに許可されていたように、インデントされたオブジェクトを続けることができるようになりました。 - 以前は、JSXタグまたは属性内のコメントは、補間中括弧(
{および})が出力される原因となっていました。これは、行(#、またはJavaScriptの//)コメントでのみ必要であり、ここ(###、または/* */)コメントでは必要ありません。そのため、コンパイラは、中括弧をトリガーするすべてのコメントがここコメントであるかどうかをチェックし、そうであれば、不要な補間中括弧を生成しません。
2.3.1
- ルートJSXタグまたはフラグメントを返すのではなく、別のJSXタグに隣接するJSXタグを返すことは、無効なJSX構文です。Babelはこれでエラーをスローし、CoffeeScriptコンパイラも同様にエラーをスローします。
- JSX補間(
<tag>{ ... }</tag>の中央)内の無効なインデントは、エラーをスローするようになりました。 - Try CoffeeScriptや同様のWebベースのCoffeeScriptエディターで使用されるブラウザコンパイラは、ブラウザコンパイラのスコープではなく、グローバルスコープでコードを評価するようになりました。これにより、ブラウザコンパイラを介して実行されるコードのパフォーマンスが向上します。
- 構文のクリーンアップ:暗黙的な関数呼び出しが、引数として本体のないクラスを取ることが可能になり、
?::は、行の継続を示唆するという点で::と同じように動作するようになりました。
2.3.0
- このリリースでは、CoffeeScriptで既に可能ではなかったES2018のすべての新機能と構文のサポートが追加されました。以下のすべての機能について、ターゲットランタイムが各機能をサポートしていることを知っていない限り、必ずトランスパイルしてください。
- 非同期イテレーターがサポートされるようになりました。
await呼び出しをyieldできるようになりました。例:do -> until file.EOF then yield await file.readLine()。 - オブジェクトスプラット/デストラクチャリング(別名:オブジェクトの残り/スプレッド構文)がES2018の一部として標準化されたため、このリリースでは、この構文を以前サポートしていたポリフィルが削除されました。
{a, b, rest...} = objのようなコードは、Object.assign呼び出しに変換されるのではなく、ほぼそのまま出力されます。Object.assignポリフィルとネイティブ実装の間にはいくつかの微妙な違いがあることに注意してください。 - 指数演算子
**と指数代入演算子**=は、ES2018のJavaScriptの新機能です。a ** 3のようなコードは、以前のようにMath.pow(a, 3)に変換されるのではなく、そのまま出力されるようになりました。 s(dotAll)フラグが正規表現でサポートされるようになりました。
2.2.4
forループのbyの値が、例えばfor x in [2..1] by -1のようにリテラル数値の場合、ループが範囲内にあるかどうかを判定するために必要なチェックが少なくなります。- 2.2.0 で、例えば
(fn(); break) while conditionのように、括弧内のステートメントがコンパイルされる回帰バグを修正しました。breakやreturnのような純粋なステートメントは、括弧で囲まれたブロックを式に変換できず、エラーをスローする必要があります。
2.2.3
- キーの値が空の配列であるオブジェクトのデストラクチャリング(
{ key: [] } = obj)のバグを修正しました。 thisにアタッチされたターゲットに対する配列のデストラクチャリング([ @most... , @penultimate, @last ] = arr)のバグを修正しました。
2.2.2
- 2.2.0 での回帰バグを修正しました。このバグでは、
by(ステップ)値を持つ範囲が、範囲と逆方向に増減する場合に、範囲の最初の値を含む配列を返していましたが、空の配列を返す必要があります。つまり、x for x in [2..1] by 1は[2]ではなく[]になるはずです(ステップ値は正の 1 で、カウントアップしますが、範囲は 2 から 1 にカウントダウンするため)。 importおよびexportステートメントと、ifステートメントのようにインデントされたブロックの開始をトリガーする行で、バックスラッシュを許可するバグを修正しました。
2.2.1
- 配列内のスプラットまたは展開を伴うデストラクチャリングを使用する場合に、特定のケースでコンパイラによってスローされるエラーに関する 2.2.0 での回帰バグを修正しました。
- 特定のケースで、範囲イテレータ変数がグローバルスコープで宣言されていた 2.2.0 での回帰バグを修正しました。
2.2.0
- このリリースでは、2014年、2012年、2011年まで遡る、現在オープンになっているすべてのバグが修正されています。
- 潜在的な破壊的変更: あいまいな
elseを持つインラインifまたはswitchステートメント(例えばif no then if yes then alert 1 else alert 2)は、elseが常に最も近いオープンなthenに対応するようにコンパイルされるようになりました。以前は、あいまいなelseの動作は予測できませんでした。コードに複数のthen(および 1 つ以上のelse)を持つif … thenまたはswitch … thenステートメントがある場合、括弧であいまいさを解決していない限り、コンパイルされた出力が異なる可能性があります。以前の動作は一貫性がなく、基本的にバグであったため、この変更を行いました。たとえば、インライン関数やブロックを暗示する何かがある場合、どの文法があるかによっては、elseが後続のthenではなく、より前のthenにバインドされる可能性がありました。現在、elseは、オープンな括弧を閉じるのと同じように、thenによって開かれたブロックを本質的に閉じます。 - 必要な
thenがない場合、エラーは間違いの場所をより正確に指摘します。 - CoffeeScript コンパイラ自体が必要とするいくつかの ES2015 JavaScript 機能をサポートしていない環境で
coffeeコマンドを実行すると、エラーがスローされます。これは、CoffeeScript がバージョン 6 より古い Node にインストールされている場合に発生する可能性があります。 - 非最終スプラット/スプレッドを伴うデストラクチャリング(例:
[open, contents..., close] = tag.split(''))は、ES2015 の rest 構文を使用して出力されるようになりました。 getまたはsetという名前の関数は、thisまたは@または?.にアタッチされている場合や、最初の引数が暗黙のオブジェクトである場合(例:@set key: 'val')など、より多くのケースで括弧なしで使用できるようになりました。breakのようなステートメントは、例えば(doSomething(); break) while conditionや(pick(key); break) for key of objのように、括弧内で使用できるようになりました。- デストラクチャリングで
this/@にアタッチされたプロパティへの割り当て(例:({@prop = yes, @otherProp = no}) ->)のバグを修正しました。 superをthisにアタッチされたパラメータで呼び出すことに関して、パラメータがより低いスコープにある場合に、誤ったエラーがスローされるバグを修正しました(例:class Child extends Parent then constructor: -> super(-> @prop))。forループにステップする変数が与えられた場合(例えば、for x in [1..3] by step)(by 0.5や他のプリミティブな数値とは対照的)に発生する可能性のある無限ループを防ぐためのバグを修正しました。- 範囲を評価するときに、イテレータ変数を 2 回宣言しないようにバグを修正しました(例:
end = 3; fn [0..end])。 - チェーンされた呼び出しにおける変数のスコープが誤っていたバグを修正しました(例:
start(x = 3).then(-> x = 4))。 doに渡される関数における変数のスコープが誤っていたバグを修正しました(例:for [1..3] then masked = 10; do -> alert masked)。- 関数呼び出しでの末尾のコンマ(例:
fn arg1, arg2,)に対して構文エラーがスローされなくなったバグを修正しました。 - プロパティアクセス内の式(例:
a[!b in c..])に関するバグを修正しました。 for行の任意の場所で行継続のバックスラッシュ(\)を許可するように修正しました。
2.1.1
- 実行可能なクラス本体の正しいコンテキストを設定するようにバグを修正しました。したがって、
class @B extends @A then @property = 1では、@propertyの@はグローバルオブジェクトではなく、クラスを参照するようになりました。 - 匿名クラスが同じ自動変数名を使用して作成されていたバグを修正しました。現在、それらは互いにオーバーライドしないように、それぞれ一意の名前を受け取るようになりました。
2.1.0
- オブジェクトリテラル内の計算されたプロパティキーがサポートされるようになりました:
obj = { ['key' + i]: 42 }、またはobj = [Symbol.iterator]: -> yield i++。 - 配列要素のスキップ(別名:エリジョン)がサポートされるようになりました:
arr = [a, , b]、または[, protocol] = url.match /^(.*):\/\//。 - JSX フラグメント構文がサポートされるようになりました。
///ブロック正規表現内の#行コメント内の///が、コメントの一部として扱われるのではなく、正規表現を誤って閉じていたバグを修正しました。- 配列のデストラクチャリング内のオブジェクトレストデストラクチャリングに対する誤った出力を修正しました。
2.0.3
- 例えば
exportedMember: { obj... }のように、明示的なオブジェクトを含む暗黙のオブジェクトが続くexport defaultのバグを修正しました。 - 暗黙のオブジェクトメンバの後の
key, val of obj(例:foo: bar for key, val of obj)に関するバグを修正しました。 - 配列とオブジェクトのデストラクチャリングを組み合わせる(例:
[ ..., {a, b} ] = arr)バグを修正しました。 - バインドされた(
=>)ジェネレータ関数を作成できるエッジケースに関するバグを修正しました。このような関数は ES2015 で許可されていないため、エラーをスローする必要があります。 - ソースマップのバグを修正しました。
.mapファイルは、常に要求された出力ファイル名と同じ基本ファイル名を持つ必要があります。したがって、coffee --map --output foo.js test.coffeeはfoo.jsおよびfoo.js.mapを生成する必要があります。 - 複数の入力ファイルに対して
--transpileと--mapを使用した場合に、生成されるソースマップが誤っていたバグを修正しました。 - REPL(
coffee --interactive)への入力の最初または最後にあるコメントに関するバグを修正しました。
2.0.2
--transpileがrequired またはimported CoffeeScript ファイルにも適用されるようになりました。--transpileは REPL で使用できます:coffee --interactive --transpile。- コメント出力の改善により、Flow のコメントベースの構文のすべてをカバーするはずです。 変数の初期割り当ての近くにあるインライン
###コメントは、変数宣言ステートメントに出力され、クラス名とメソッド名の近くにある###コメントは、Flow がそれらを予期する場所に出力されるようになりました。 - CoffeeScript キーワードのインポートが許可されるようになりました。ただし、エイリアスが付けられている場合に限ります:
import { and as andFn } from 'lib'。(import lib from 'lib'を実行してからlib.andを参照することもできます。) getおよびsetという名前の関数への呼び出しは、括弧なしのオブジェクトリテラルが引数として指定されている場合、エラーをスローしなくなりました:obj.set propertyName: propertyValue。- 派生クラス(別のクラスを
extendsするクラス)のコンストラクタでは、thisを参照する引数を使用してsuperを呼び出すことはできません:class Child extends Parent then constructor: (@arg) -> super(@arg)。これは JavaScript では許可されておらず、CoffeeScript コンパイラはエラーをスローするようになりました。代わりに、superを呼び出した後でthisに代入します:(arg) -> super(arg); @arg = arg。 - バックティックされたステートメントと巻き上げられた式が両方とも同じクラス本体にある場合に、誤った出力となるバグを修正しました。これにより、実験的な クラスフィールド構文を使用する人が、CoffeeScript がクラスプロトタイプの一部として出力する
prop: 3のような従来のクラス本体式とともに、`field = 3`のようなバックティックされた行を使用できるようになります。 - 複雑な
?操作の前にコメントが出力されないバグを修正しました(例:@a ? b)。 - すべてのテストが Windows でパスするようになりました。
2.0.1
babel-coreは、ほとんどのユーザーに対して自動的にインストールされるのを防ぐため、optionalDependencyとしてであっても、package.jsonにリストされなくなりました。--transpileを使用したい場合は、babel-coreを手動でインストールするだけです。 トランスパイルを参照してください。--transpileは、オプションを見つけるために Babel に依存するようになりました。つまり、コンパイルされるファイルのパスにある.babelrcファイルです。(以前は、CoffeeScript コンパイラがこのロジックを複製していたため、ユーザーの視点からは何も変更されていません。)これにより、将来のバージョンで Babel にオプションを渡す追加の方法(Babel 7 に含まれる.babelrc.jsファイルなど)が自動的にサポートされます。- クラスメソッドの外にあるクラス本体のバックティック式が、JavaScript のクラス本体自体に出力されるようになりました。これにより、クラスフィールド提案のような実験的な JavaScript 構文をパススルーできます。ご使用の トランスパイラがサポートしている場合に限ります。
2.0.0
- CoffeeScriptコンパイラーが、出力を保存または返す前にBabelを通してパイプ処理するように指示する
--transpileフラグまたはtranspileNode APIオプションが追加されました。詳細はトランスパイルを参照してください。また、-tショートフラグは、--tokensではなく--transpileを参照するように変更されました。 - ソースマップの
sourcesContentプロパティが常に設定されるようになりました。 - 分割代入とJSXのコメントに関するバグが修正されました。
- これらは、2.0.0-beta5と2.0.0の間の変更点のみであることに注意してください。1.xからのすべての変更については、下記を参照してください。
2.0.0-beta5
- Node 6がサポートされるようになり、
coffeeコマンドまたはNode APIを通じてCoffeeScript 2に必要な最小バージョンとしてこれを維持するよう努めます。古いバージョンのNodeや、常に最新ではないブラウザでは、レガシーブラウザコンパイラを使用してコンパイルできます。 - コマンドラインの
--outputフラグで、出力フォルダだけでなく出力ファイル名を指定できるようになりました。 - コマンドラインの
--requireフラグで、無効な識別子(名前にハイフンを含むNPMモジュールなど)であるファイル名またはモジュール名が正しく処理されるようになりました。 - オブジェクト分割代入が使用される場合に出力される
Object.assignは、Babelが出力するのと同じポリフィルを使用してポリフィルされます。これは、Internet Explorer 8以下をサポートする必要がある場合(または、独自のコードがポリフィルを必要とする機能を使用している場合)を除いて、ポリフィルは必要ないはずであることを意味します。詳細はES2015+出力を参照してください。 - コメントのみを含む文字列またはJSXの補間(
"a#{### comment ###}b"または<div>{### comment ###}</div>)が、(`a${/* comment */}b`)のように出力されるようになりました。 - 引用符を含む補間文字列(ES2015テンプレートリテラル)で、引用符がエスケープされなくなりました:
`say "${message}"` - 関数リテラルの後でチェーンすることが可能になりました(たとえば、関数を定義してから
.callを呼び出すなど)。 cake testを実行すると、非同期テストの結果が出力に含まれるようになりました。- オブジェクト分割代入のバグ、関数パラメータの展開、関数パラメータで生成された参照変数、
do後のチェーン関数、配列内の存在演算子ソーク後のスプラット([a?.b...])、配列または関数パラメータ内のスプラットを伴う後続のif([a if b...])、if、for、switch、whileまたはその他の無効なコンストラクトをthrowしようとする問題を修正しました。 - 構文のエッジケースに関するバグを修正しました:
=およびその他の「式の中間」トークン後のセミコロン、::後のスペース、:または*で始まるスクリプト。 - Node APIを介して生成されたソースマップに関するバグ、および
.coffeeファイル内からNode APIを介してCoffeeScriptをコンパイルしたときのスタックトレースの行番号に関するバグを修正しました。
2.0.0-beta4
- このリリースには、1.12.6から1.12.7までのすべての変更が含まれています。
- 行コメント(
#で始まる)が、生成されたJavaScriptに出力されるようになりました。 - ブロックコメント(
###で区切られる)が、以前は不可能だったインラインを含め、どこでも許可されるようになりました。これにより、Flowのコメントベースの構文を使用して、静的型アノテーションをサポートします。 - スプレッド構文(オブジェクト用の
...)が、JSXタグでサポートされるようになりました:<div {props...} />。 coffeeを介して実行されるスクリプトの引数解析が改善されました。詳細は破壊的な変更を参照してください。- CLI:nodeがフォークされたときに
SIGINTおよびSIGTERMシグナルを伝播します。 - REPLで、ラッパー関数を必要とせずに
awaitを使用できるようになりました。 do superが許可されるようになり、super.x.yやsuper['x'].yのような他のsuperへのアクセスも機能するようになりました。- スプラット/スプレッド構文の3つのドットを左または右のどちらにも使用できるようになりました(したがって、
props...または...propsの両方が有効です)。 - タグ付きテンプレートリテラルが、呼び出し可能な関数として認識されるようになりました。
- ネストされたプロパティのオブジェクトスプレッド構文に関するバグを修正しました。
- 分割代入された関数パラメータのデフォルト値に関するバグを修正しました。
2.0.0-beta3
- JSXがサポートされるようになりました。
- オブジェクトの残りのプロパティ/スプレッドプロパティがサポートされるようになりました。
- クラスでバインドされた(ファットアロー)メソッドが再びサポートされるようになりました。ただし、メソッドがバインドされる前に呼び出そうとすると、エラーがスローされます。詳細はクラスの破壊的な変更を参照してください。
- REPLで、
_への代入に関する警告が表示されなくなりました。 - 分割代入されたネストされたデフォルト値と、複数行にわたる式のチェーンまたは継続に関連する問題を修正しました。
2.0.0-beta2
- このリリースには、1.12.5から1.12.6までのすべての変更が含まれています。
- クラスのバインドされた(ファットアロー)メソッドは、クラスが親クラスを拡張している場合は、
super()の後、クラスコンストラクタで宣言する必要があります。詳細はクラスの破壊的な変更を参照してください。 indexOfおよびbindのポリフィルを含む、不要なユーティリティヘルパー関数がすべて削除されました。extendsキーワードは、クラスのコンテキストでのみ機能するようになりました。関数のプロトタイプを拡張するために使用することはできません。詳細はextendsの破壊的な変更を参照してください。- リテラルCoffeeScriptは、1.xの実装と同様に、インデントに基づいて完全に解析されるようになりました。Markdownを解析するための依存関係はなくなりました。詳細はリテラルCoffeeScript解析の破壊的な変更を参照してください。
- プロパティとして使用されるJavaScriptの予約語が、引用符で囲まれなくなりました。
require('coffeescript')は、WebpackやBrowserifyによって作成されたビルドなどの非Node環境でも機能するようになりました。これにより、ブラウザ環境で実行することを意図したビルドにブラウザコンパイラを含めるための、より便利な方法が提供されます。throw例外のswitchケースの後に、到達不能なbreakステートメントが追加されなくなりました。- ブラウザコンパイラは、Babiliを使用してコンパイルされ、Babelの
envプリセットまでトランスパイルされるようになりました(常に最新のバージョンだけでなく、現在使用中のすべてのブラウザで安全に使用できるはずです)。 - 関数
@getまたは@setを呼び出しても、必須の括弧に関するエラーがスローされなくなりました。(オブジェクトまたは@にアタッチされていない、単なるgetまたはsetは、意図的にコンパイラエラーをスローします。) $XDG_CACHE_HOMEが設定されている場合、REPLの.coffee_historyファイルはそこに保存されます。
2.0.0-beta1
- CoffeeScript 2の最初のベータリリース。これ以上の破壊的な変更は予想されていません。
- 分割代入されたオブジェクトと配列は、可能な場合は常にES2015+構文を使用して出力されるようになりました。
- リテラルCoffeeScriptは、インデントだけを見るのではなく、Markdown-Itを使用してMarkdownセクションを検出することにより、Markdownの解析を大幅に改善しました。
getまたはsetという名前の関数を呼び出すには、getまたはsetキーワード(これは許可されていません)と区別するために、括弧が必要になりました。- コンパイラは、フラグを必要とせずに非同期関数をサポートするNodeの最初のバージョンであるNode 7.6+を必要とするようになりました。
2.0.0-alpha1
- CoffeeScript 2の最初のアルファリリース。CoffeeScriptコンパイラは、可能な場合は常にES2015+構文を出力するようになりました。詳細は破壊的な変更を参照してください。
- クラスは、ES2015の
classおよびextendsキーワードを使用して出力されます。 async/awaitのサポートが追加されました。- バインドされた(アロー)関数は、
=>関数として出力されるようになりました。 - デフォルト値を持つ関数パラメータは、ES2015のデフォルト値構文を使用するようになりました。
- スプラット関数パラメータは、ES2015のスプレッド構文を使用するようになりました。
- 計算されたプロパティは、ES2015構文を使用するようになりました。
- 補間文字列(テンプレートリテラル)は、ES2015のバッククォート構文を使用するようになりました。
- リテラルCoffeeScriptファイルでのMarkdown認識のサポートが改善されました。
- インデントでのタブとスペースの混在が許可されなくなりました。
- ブラウザコンパイラは、Google Closure Compiler(JavaScriptバージョン)を使用して縮小化されるようになりました。
- CoffeeScript 2にはNode 7+が必要です。
1.12.7
- チェーンされた関数呼び出しとインデントされた
returnおよびthrow引数に関連する1.12.6の回帰を修正しました。 - REPLで、
_への代入に関する警告が表示されなくなりました。
1.12.6
returnおよびexportキーワードは、暗黙のオブジェクト(中括弧を必要とせずに、インデントによって定義)を受け入れることができるようになりました。- Unicodeコードポイントエスケープ(例:
\u{1F4A9})をサポートします。 coffeeコマンドは、最初にCoffeeScriptが現在のフォルダのnode_modulesにインストールされているかどうかを確認し、インストールされている場合はそこのcoffeeバイナリを実行します。それ以外の場合は、グローバルにインストールされたものを実行します。これにより、あるバージョンのCoffeeScriptをグローバルにインストールし、別のバージョンを特定のプロジェクト用にローカルにインストールできます。(cakeコマンドについても同様です。)- 暗黙的なオブジェクトまたは三項演算子を閉じない、チェーンされた関数呼び出しに関するバグを修正しました。
- 三項
ifステートメント内の?演算子によって生成された不適切なコードに関するバグを修正しました。 - いくつかのテストを修正し、失敗したテストでゼロ以外の終了コードが返されるようになりました。
1.12.5
importおよびexportステートメント内でのdefault、from、as、および*の処理が改善されました。defaultという名前のメンバーをインポートまたはエクスポートできるようになり、コンパイラがそれをdefaultキーワードとして解釈しなくなりました。- コンパイラで、無効な8進エスケープシーケンスがエラーをスローしなかったバグを修正しました。
1.12.4
cakeコマンドが更新され、ほとんどのタスクに新しいwatchオプションが追加されました。 CoffeeScriptリポジトリをクローンし、リポジトリのルートでcakeを実行して、オプションを確認してください。- 参照される変数を
exportすると、変数の宣言が妨げられていたバグを修正しました。 coffeeコマンドが.litcoffeeファイルで機能しなかったバグを修正しました。- ソースマップの向上とダウンストリームツールとの互換性の向上を目的として、トークンと位置データに関するバグを修正しました。
1.12.3
@値をfor式のインデックスとして使用できるようになりました。これにより、for式のコンパイルが緩くなり、インデックス変数が@値になることが許可されます。例:do @visit for @node, @index in nodes。@visit内では、現在のノード (@node) のインデックスが@indexとして利用可能になります。- CoffeeScript のパッチが適用された
Error.prepareStackTraceが復元されました。一部のダウンストリームプロジェクトで問題となっていた誤った例外を防ぐための修正が含まれています。これにより、1.12.2 以降のスタックトレースにおける誤った行番号が修正されます。 //=演算子の出力は、他の代入演算子と同様に、右オペランドを括弧で囲むようになりました。
1.12.2
- ブラウザコンパイラは、
MINIFY=false cake build:browserで、再び minify なしでビルドできるようになりました。 - エラーが発生しやすかった
Error.prepareStackTraceのパッチ適用バージョンが削除されました。 - REPL でのコマンド補完 (タブキーを押して候補を表示) が Node 6.9.1+ で修正されました。
- ブラウザベースのテストに、Node ベースのバージョンと同じすべてのテストが含まれるようになりました。
1.12.1
defaultという名前のモジュールメンバーをインポートできるようになりました。例:import { default } from 'lib'。ただし、ES2015 のように、モジュール全体をインポートしてdefaultという名前を付けることはできません (したがって、import default from 'lib'は許可されません)。- 変数名として
fromを使用するとforループの宣言が壊れていた回帰を修正しました。念のためですが、fromは CoffeeScript の予約語ではありません。変数名として使用できます。fromはimportおよびexportステートメント、そしてforループの宣言のコンテキスト内ではキーワードのように振る舞います。これらのコンテキストでもfromという名前の変数を使用できるはずであり、コンパイラは違いを判別できるはずです。
1.12.0
- CoffeeScript は ES2015 の タグ付きテンプレートリテラルをサポートするようになりました。コードでタグ付きテンプレートリテラルを使用する場合は、ランタイムがタグ付きテンプレートリテラルをサポートしているか、ターゲットランタイムがサポートするバージョンに JavaScript 出力をさらにトランスパイルする責任を負うことに注意してください。
- CoffeeScript は ES2015 の
for…ofを出力するためのfor…from構文を提供するようになりました。(一致させることができず申し訳ありませんが、私たちは他の何かに対して最初にfor…ofを思いつきました。) これにより、ジェネレーターまたは他のイテラブルオブジェクトを反復処理できます。コードでfor…fromを使用する場合は、ランタイムがfor…ofをサポートしているか、ターゲットランタイムがサポートするバージョンに JavaScript 出力をさらにトランスパイルする責任を負うことに注意してください。 - トリプルバッククォート (
```) を使用すると、単一のバッククォートのエスケープが不要な埋め込み JavaScript ブロックを作成できます。これにより、ES2015 テンプレートリテラルおよび Markdown との相互運用性が向上するはずです。 - 単一バッククォートで囲まれた埋め込み JavaScript 内では、バッククォートを
\`でエスケープできるようになりました。 - ブラウザテストが再びブラウザで実行されるようになり、ブラウザをテストしたい場合はこちらからアクセスできます。
- ES2015 の
importおよびexportの CoffeeScript のみのキーワードは無視されるようになりました。 - コンパイラは、匿名クラスをエクスポートしようとするとエラーをスローするようになりました。
- ソースマップの向上とダウンストリームツールとの互換性の向上を目的として、トークンと位置データに関するバグを修正しました。
1.11.1
- 補間されたキーの後ろの短縮オブジェクト構文のバグ修正。
"""文字列でのインデント削除のバグ修正。- クラスのプロトタイププロパティに "arguments" という名前を使用できないバグ修正。
- 大きな16進数のリテラルを、(他のすべての大きな数値リテラルと同様に)
2e308に正しくコンパイルします。
1.11.0
- CoffeeScript は ES2015 の
importおよびexport構文をサポートするようになりました。 - コンパイラに
-M, --inline-mapフラグを追加しました。これにより、ソースマップを別のファイルとしてではなく、直接 JavaScript 出力に埋め込むことができます。 yieldの多数の修正。yield returnを誤って式として使用できなくなりました。yieldは、式とともに、スタンドアロンでも使用できるという点で、returnをミラーリングするようになりました。以前にyield undefinedと記述していた場所には、単純にyieldと記述できるようになりました。ただし、これは、returnが持つ同じ構文上の制限を継承することも意味します。したがって、これらの例はコンパイルされなくなりました。doubles = -> yield for i in [1..3] i * 2 six = -> yield 2 * 3- JavaScript 出力が少しきれいになり、不要な括弧やスペース、二重インデント、および
yield周りの二重セミコロンがなくなりました。
&&=、||=、and=、およびor=は、等号の前に誤ってスペースを許可することがなくなりました。- いくつかのエラーメッセージを改善しました。
undefinedがvoid 0にコンパイルされるのと同じように、NaNが0/0に、Infinityが2e308にコンパイルされるようになりました。- デフォルト値を持つ名前変更された分割代入パラメータのバグ修正。
({a: b = 1}) ->がコンパイラをクラッシュさせなくなりました。 - CoffeeScript プログラムの内部表現が改善されました。これは、
CoffeeScript.tokensまたはCoffeeScript.nodesを使用するツールでのみ顕著になります。そのようなツールは、変更または追加されたトークンとノードに対応するために更新する必要があります。 - いくつかのマイナーなバグ修正。以下を含みます。
catchブロックでキャッチされたエラーが不要に宣言されなくなり、catchのないtryブロックに対して誤ってundefinedと名付けられることがなくなりました。- 代入不可能なパラメータの分割代入がコンパイラをクラッシュさせなくなりました。
- ソースマップが、.coffee.md ファイルからスローされたエラーに対して正しく使用されるようになりました。
coffee -e 'throw null'がクラッシュしなくなりました。- REPL で
.exitを使用して終了するときにクラッシュしなくなりました。 - 多数の
forループが同じスコープで使用されたときに、無効な JavaScript が出力されなくなりました。 - CLI で stdin を使用したときの Unicode の問題。
1.10.0
- CoffeeScript は ES2015 スタイルの分割代入のデフォルトをサポートするようになりました。
(offsetHeight: height) ->はコンパイルされなくなりました。その構文は偶然であり、部分的に壊れていました。代わりに({offsetHeight: height}) ->を使用してください。オブジェクトの分割代入には常に中かっこが必要です。- いくつかのマイナーなバグ修正。以下を含みます。
- REPL が以前に入力したものに基づいて、有効なコードを無効として報告する場合があるバグ。
- jest テストフレームワークでの複数の JS コンテキストの問題。
- 内部モジュールで strict モードが設定されている io.js のエラー。
catchブロックでキャッチされたエラーの変数名の衝突。
1.9.3
- 暗黙的な呼び出しにおけるオブジェクトリテラルの最初のキーでの補間のバグ修正。
- REPL の壊れたエラーメッセージと、REPL のいくつかのマイナーなバグを修正しました。
--bareオプションを使用してコンパイルするときに、行の先頭にあるトークンのソースマッピングを修正しました。これにより、ソースマップが小さくなるという嬉しい副作用があります。- コンパイルされたブロックコメントのわずかな書式設定の改善。
on、off、yes、およびnoのエラーメッセージを改善しました。
1.9.2
- 同じファイル名で複数のファイルをコンパイルするときに 1.9.1 で導入された **watch** モードのエラーを修正しました。
thisを含む式の周りのyieldのバグ修正。- Ruby スタイルの
-rオプションを REPL に追加しました。これにより、--evalまたは--interactiveで実行する前にモジュールを require できます。 <script type="text/coffeescript">タグで、.coffee ファイルに対するブラウザリクエストの重複を避けるために、srcの代わりにdata-src属性を使用できるようになりました。- IE8、strict ES5 正規表現、および Browserify のマイナーなバグ修正。
1.9.1
- 補間が (再び) オブジェクトリテラルのキーで機能するようになりました。これを使用して、プロパティに動的に名前を付けることができます。
- 内部コンパイラの変数名がアンダースコアで始まることがなくなりました。これにより、生成された JavaScript が少しきれいになり、AngularJS が関数引数を「解析」する完全に壊れていて神聖な方法の問題も修正されます。
yield returnおよびyield throwを使用したyield関連のいくつかのエッジケースを修正しました。- マイナーなバグ修正と、コンパイラのエラーメッセージのさまざまな改善。
1.9.0
- CoffeeScript は ES2015 ジェネレーターをサポートするようになりました。ジェネレーターは、単に
yieldする関数です。 - 文字列と正規表現のより堅牢な解析と改善されたエラーメッセージ。特に補間に関して。
- 内部コンパイラの変数名を生成するための戦略を変更しました。これは、
@example関数パラメータが関数本体内で裸のexample変数として利用できなくなったことを意味することに注意してください。 - Node および Io.js の最新バージョンとの REPL の互換性を修正しました。
- さまざまなマイナーなバグ修正。
1.8.0
- CLI の
--joinオプションは非推奨になりました。 - ソースマップでファイル拡張子として
.js.mapが使用されるようになり、単に.mapではなくなりました。 - CLI は、ファイルへの書き込みに失敗すると、終了コード 1 で終了するようになりました。
- コンパイラが、終了していない単一引用符付きの文字列でクラッシュしなくなりました。
- 文字列の補間の位置データを修正しました。これにより、ソースマップが同期しなくなっていました。
- エラーメッセージのエラーマーカーが、コードがタブでインデントされている場合に正しく配置されるようになりました。
- CoffeeScript のソースマップでパッチが適用されたスタックトレースのわずかな書式設定エラーを修正しました。
%%演算子は、その右オペランドを一度だけ強制変換するようになりました。- Cakefile から CoffeeScript ファイルを require する際に、事前にコンパイラを登録する必要がなくなりました。
- CoffeeScript REPL がエクスポートされ、
require 'coffeescript/repl'で require できるようになりました。 - Node 0.11 での REPL の修正。
1.7.1
coffeeバイナリでスクリプトを直接実行する際に、Node モジュールのルックアップを妨げていたタイプミスを修正しました。
1.7.0
- Node で CoffeeScript ファイルを require する場合、コンパイラを明示的に登録する必要があります。これは、
require 'coffeescript/register'またはCoffeeScript.register()で行うことができます。Mocha のような設定では、coffeescript/register を使用してください。 - エラーメッセージ、ソースマップ、スタックトレースが改善されました。ソースマップは更新された
//#構文を使用するようになりました。 - 先頭の
.が、開いているすべての呼び出しを閉じるようになり、よりシンプルなチェーン構文が可能になりました。 **、//、%%演算子と、パラメータリストと分割代入式における...展開が追加されました。- 複数行文字列は、単一のスペースで結合されるようになり、すべてのインデントが無視されます。行末のバックスラッシュは、文字列とヒアドキュメントの両方で、行間の空白の量を示すことができます。バックスラッシュは、ブロック正規表現内で空白を正しくエスケープします。
- 閉じ括弧がインデントできるようになり、予期しないエラーを引き起こすことがなくなりました。
- いくつかのコンパイルに関する破壊的な修正が行われました。呼び出し不可能なリテラル(文字列、数値など)が、呼び出し内でコンパイルされなくなり、複数の後置条件付きが正しくコンパイルされるようになりました。後置条件付きとループは、常にオブジェクトリテラルをバインドします。条件付き代入が部分式で正しくコンパイルされるようになりました。
superがメソッド外で禁止され、forループ内で正しく動作するようになりました。 - コンパイルされたブロックコメントのフォーマットが改善されました。
- Windows で
-pフォルダが作成されなくなりました。 - CoffeeScript に渡される
optionsオブジェクトが変更されなくなりました。
1.6.3
- CoffeeScript REPL が、セッション間で履歴を記憶するようになりました。本来 REPL がそうあるべきように。
- Node で
requireを使用して.coffee.mdリテラル CoffeeScript ファイルをロードできるようになりました。ブラウザでは、text/literate-coffeescriptスクリプトタグが使用できます。 - 古い
coffee --lintコマンドは削除されました。これは、元々コンパイラを開発していた際には便利でしたが、JSHint に取って代わられました。stdio 経由でリテラルファイルを渡すには、-lを使用できるようになりました。 - Windows のパス区切り文字、エラー名を指定しない
catch、および実行可能クラス本体でのプロトタイププロパティのアタッチに関するバグ修正。
1.6.2
- ソースマップを使用して、
coffeeコマンドで CoffeeScript を直接実行する場合、およびブラウザで CoffeeScript を直接実行する場合の自動行マッピングが提供されるようになりました。また、コンパイラによってスローされるセマンティックエラーに対して、より良いエラーメッセージを提供するようになりました - 色付きでさえ。 - リテラル/バニラスタイルの CoffeeScript プロジェクトの混在のサポートが改善され、両方のソースマップを同時に生成できるようになりました。
- 継承されたバインド関数のオーバーライドに関する 1.6.x のリグレッションと、Windows のファイルパス管理に関する修正。
coffeeコマンドが、.coffeeファイルと.jsファイルの両方を正しくfork()できるようになりました。(Node.js 0.9+ が必要です)
1.6.1
- ソースマップの最初のリリース。コンパイラに
--mapフラグを渡すと、すぐに使用できます。すべての感謝を Jason Walton に送ってください。 - インデントされた暗黙のオブジェクトに対する複数の暗黙の呼び出しに関する 1.5.0 のリグレッションを修正しました。暗黙の関数呼び出しと暗黙のオブジェクトの組み合わせは、一般的に、より適切に解析されるはずです。ただし、それらを過度にネストするのは、依然として良いスタイルではありません。
- 既存のツールとの互換性のために、
.coffee.mdがリテラル CoffeeScript ファイルの拡張子としてサポートされるようになりました。.litcoffeeが引き続き正規の拡張子です。 - メンバープロパティ、バインドメソッド、クラス宣言における
superに関するいくつかのマイナーな修正。
1.5.0
- リテラル CoffeeScriptの最初のリリース。
- CoffeeScript REPL が Node.js REPL をベースにするようになり、より適切かつ馴染みやすい動作をするようになりました。
- コンストラクタから明示的な値を返すことは禁止されました。任意の値を返したい場合は、コンストラクタではなく関数を使用してください。
- インデックスを手動で処理することなく、配列を逆方向にループできるようになりました:
for item in list by -1 - ソースマップはまだ出力されていませんが、ソース位置が CoffeeScript AST に保存されるようになりました。
1.4.0
- CoffeeScript コンパイラは、存在する場合、Microsoft の UTF-8 BOM を削除するようになり、BOM で破損したソースファイルをコンパイルできるようになりました。
registerExtensionを削除し、path.existsからfs.existsに移行することにより、Node/コンパイラの非推奨警告を修正しました。- スプラットのコンパイル、バッククォート、スライス、オブジェクトリテラル内の重複キーのエラーに関する小さな調整。
1.3.3
- JavaScript の厳格モードの新しいセマンティクスにより、CoffeeScript は、コンストラクタ関数がすべてのランタイムで名前を持つことを保証しなくなりました。議論については #2052 を参照してください。
- インスタンスメソッド内のネストされた関数内から、より確実に
superを呼び出すことができるようになりました(再帰的に上に辿ります)。 - 名前付きループ変数が、他のローカル変数とは異なるスコープヒューリスティックを持たなくなりました。(#643 を元に戻します)
- 分割代入の LHS 内にネストされたスプラットの修正。
- コンパイル時の厳格モードによる 8 進数リテラルの禁止の修正。
1.3.1
- CoffeeScript は、コンパイル時に JavaScript のすべての厳格モードの早期構文エラーを強制するようになりました。これには、古い形式の 8 進数リテラル、オブジェクトリテラル内の重複するプロパティ名、関数定義内の重複するパラメータ、未定義変数の削除、
evalまたはargumentsの値の設定などが含まれます。詳細な議論については、#1547 を参照してください。 - REPL に、大きなコードブロックを入力するための便利な新しい複数行モードが追加されました。REPL に例をコピーアンドペーストする場合に役立ちます。
Ctrl-Vで複数行モードに入ります。入力内容を REPL に直接パイプすることもできます。 - CoffeeScript は、コンパイルされた各ファイルの先頭に
Generated by CoffeeScript VERSIONヘッダーを出力するようになりました。 - 以前に未定義だった変数への条件付き代入
a or= bが構文エラーと見なされるようになりました。 doのセマンティクスへの調整により、名前空間をより簡単にシミュレートするために使用できるようになりました:do (x = 1, y = 2) -> …- ループインデックスが、ループ反復内では変更可能になり、反復間では変更不可能になりました。
- リストのシャローコピーを効果的に作成するために、一貫性を保つために、スライスの両端点を省略できるようになりました。
- Node の「新しい」ファイル監視 API の下での
coffee --watchに関する追加の調整と改善。監視対象のスクリプトに構文エラーが発生した場合、監視はデフォルトでビープ音を鳴らすようになりました。また、再帰的に監視する場合、デフォルトで隠しディレクトリを無視するようになりました。
1.2.0
coffee --watchと--joinの複数の改善。両方を一緒に使用できるだけでなく、--watch対象のフォルダ内でファイルやディレクトリを追加および削除できるようになりました。throwステートメントを式の一部として使用できるようになりました。- ファイルの先頭にあるブロックコメントが、安全クロージャラッパーの外側に表示されるようになりました。
- 末尾の演算子と未完の行に関するいくつかのマイナーな 1.1.3 のリグレッションと、バインドされたクラス関数内のバインドされた関数が誤った
thisを持つという、より大きな 1.1.3 のリグレッションを修正しました。
1.1.3
- ああ、空白。CoffeeScript のコンパイルされた JS は、このページの例でわかるように、間隔を空けて読みやすくしようとするようになりました。
- クラス本体のクラスレベルメソッドで
superを呼び出すことができるようになり、バインドされたクラスメソッドは正しいコンテキストを保持するようになりました。 - JavaScript は常に 8 進数
010 is 8と 16 進数0xf is 15をサポートしていましたが、CoffeeScript は 2 進数0b10 is 2もサポートするようになりました。 - CoffeeScript モジュールがサブディレクトリにネストされ、npm を使用しなくても、個々のコンポーネントを個別に
requireしやすくなりました。たとえば、CoffeeScript フォルダをパスに追加した後:require('coffeescript/lexer') - この Web ページの Try CoffeeScript に新しい「リンク」機能があります。これを使用して、例のスクリプトの共有可能なパーマリンクを取得します。
coffee --watch機能は、Node.js 0.6.0 以降でのみ機能するようになりましたが、Windows でも正しく機能するようになりました。- @michaelficarra, @geraldalewis, @satyr, and @trevorburnham による多くの小さなバグ修正。
1.1.2
ブロックコメントのフォーマット、?= コンパイル、制御構造に対する暗黙の呼び出し、try/catch ブロックの暗黙の呼び出し、ローカルスコープからの可変長引数のリーク、heregexes に続く構文エラーの行番号、括弧で囲まれた数値リテラルへのプロパティアクセス、予約名を持つバインドされたクラスメソッドとスーパー、REPL のオーバーホール、連続したコンパイルされたセミコロン、暗黙的に呼び出されたオブジェクト内のブロックコメント、および Chrome のバグの修正。
1.1.1
外部コンストラクタ関数を持つクラスのバグ修正。issue #1182 を参照してください。
1.1.0
coffee 実行可能ファイル経由で実行する場合、process.argv などは node の代わりに coffee を報告するようになりました。Node.js 0.4.x モジュールの検索変更との互換性が向上しました。REPL の出力は、Node のように色付けされるようになりました。--join を使用する際に連結した CoffeeScript に名前を付けることが必須になりました。複合除算 /= を誤って正規表現として字句解析する問題を修正しました。すべての text/coffeescript タグは、含まれる順序で実行されるようになりました。外部コンストラクタ関数を使用する拡張サブクラスに関する問題を修正しました。addImplicitParentheses でのエッジケースでの無限ループを修正しました。長い関数呼び出しチェーンでの指数関数的な減速を修正しました。グローバル変数が CoffeeScript REPL にリークしなくなりました。スプラットパラメータは関数に対してローカルに宣言されます。
1.0.1
Unicode識別子に関する字句解析器のバグを修正しました。Node.js 0.3.7 との互換性のために REPL を更新しました。REPL での相対パスの require を修正しました。末尾の return と return undefined が最適化されて削除されるようになりました。Node.js 0.2.5 との後方互換性のために、コア Node.js util モジュールの require を停止しました。条件付き return が switch ステートメントでフォールスルーを引き起こすケースを修正しました。分割代入における空のオブジェクトを最適化しました。
1.0.0
CoffeeScript のループは、ループ本体内で関数が生成されている場合にブロック スコープを保持しようとしなくなりました。代わりに、do キーワードを使用して便利なクロージャ ラッパーを作成できます。node 実行可能ファイルに直接オプションを渡すための --nodejs フラグを追加しました。式内での純粋なステートメントの使用に関する動作が改善されました。すべてのブラウザーで -1 を介したインクルーシブ スライシング、および任意の式をエンドポイントとしたスプライシングを修正しました。
0.9.6
REPL はスタックトレースを適切にフォーマットするようになり、非同期例外が発生しても動作し続けるようになりました。--watch を使用すると、ファイルのコンパイル時にタイムスタンプが出力されるようになりました。摘出したクロージャ ループ内で誤ってリークしていたいくつかの変数を修正しました。コンストラクタは、クラス本体内での宣言場所を維持するようになりました。動的なオブジェクト キーは削除されました。ネストされたクラスがサポートされるようになりました。裸のスプラット関数の実行コンテキストを修正しました。連鎖比較の反転に関するバグ修正。連鎖したクラスのインスタンス化がスプラットで正しく動作するようになりました。
0.9.5
0.9.5 は CoffeeScript 1.0 の最初のリリース候補と見なされるべきです。前回のリリース以降、多数の内部変更が行われており、その多くは satyr の Coco CoffeeScript 方言からの貢献によるものです。Heregexes (拡張正規表現) が追加されました。関数はデフォルト引数を持つことができるようになりました。クラス本体は実行可能なコードになりました。無効な CoffeeScript に対する構文エラーが改善されました。undefined は null のように動作するようになり、新しい値を割り当てることはできません。単一行内包表記に関する優先順位の変更がありました。result = i for i in list はデフォルトで result = (i for i in list) として解析されていましたが、現在は (result = i) for i in list として解析されるようになりました。
0.9.4
CoffeeScript は、適切な名前の一時変数を使用し、使用後にそれらの参照を再利用するようになりました。Node.js 0.3 の require.extensions サポートを追加しました。ブラウザーで CoffeeScript をロードすると、グローバル スコープに単一の CoffeeScript オブジェクトのみが追加されるようになりました。暗黙的なオブジェクトとブロック コメントのエッジ ケースを修正しました。
0.9.3
CoffeeScript の switch ステートメントが JS の switch ステートメントにコンパイルされるようになりました。以前は、JavaScript 1.3 との互換性のために if/else チェーンにコンパイルされていました。関数の呼び出しのソーキングがサポートされるようになりました。RubyMine エディターのユーザーは --watch モードを使用できるようになりました。
0.9.2
範囲リテラルの開始と終了の指定がオプションになりました。例: array[3..]。a not instanceof b と記述できるようになりました。ネストされた重要なインデントと重要でないインデントに関する重要なバグを修正しました (Issue #637)。coffee コマンドにフックできるようにする --require フラグを追加しました。推奨する JavaScriptLint セットアップ用のカスタム jsl.conf ファイルを追加しました。操作のルールをフラット化することにより、Jison 文法のコンパイル時間を高速化しました。ブロック コメントは、JavaScript ミニファイアフレンドリーな構文で使用できるようになりました。JavaScript の複合代入ビット演算子を追加しました。先頭に数値および文字列キーを持つ暗黙的なオブジェクト リテラル、暗黙的な呼び出しの対象、および複合代入の一部としてのバグ修正。
0.9.1
0.9.1 のバグ修正リリース。暗黙的なオブジェクト、暗黙的な関数呼び出し、および暗黙的なインデントの混合の処理が大幅に改善されました。文字列と正規表現の補間は、厳密に #{ … } (Ruby スタイル) になりました。コンパイラは --require フラグを受け取るようになり、コンパイル前に実行するスクリプトを指定します。
0.9.0
CoffeeScript の 0.9 シリーズは 1.0 のリリース候補と見なされます。テスト運用を開始しましょう。0.9.0 では、後方互換性のない大幅な変更が導入されました。代入には JavaScript のように = が使用され、オブジェクト リテラルには : が使用されるようになりました。これにより、暗黙的なオブジェクト リテラルと YAML スタイルのオブジェクト定義が可能になります。ハーフ代入は削除され、+=、or= などが使用されるようになりました。補間にはドル記号 $ の代わりにハッシュ記号 # が使用されるようになりました。ドル記号は有効な JS 識別子の一部である可能性があるためです。下向きの範囲内包表記は再び安全になり、整数エンドポイントで作成された場合は、ストレート for ループに最適化されます。高速で保護されていないオブジェクト内包表記の形式が追加されました: for all key, value of object。super キーワードを引数なしで言及すると、Ruby のように関数に渡されたすべての引数が転送されるようになりました。クラス B を親クラス A から拡張する場合、A に extended メソッドが定義されている場合、B を渡して呼び出されます。これにより、静的継承などが可能になります。ファットアローでバインドされた関数の出力がよりクリーンになりました。@variables をパラメータ リストで使用できるようになり、パラメータはオブジェクトのプロパティとして自動的に設定されます。コンストラクタやセッター関数で役立ちます。コンストラクタ関数はスプラットを受け取ることができるようになりました。
0.7.2
一部の状況で coffee コマンドライン オプションの解析が妨げられていた問題に対するクイック バグ修正 (0.7.1 の直後)。
0.7.1
ブロック スタイルのコメントは、JavaScript のブロック コメントとしてそのまま渡され、出力されるようになりました。これにより、ライセンスや著作権ヘッダーに役立ちます。ハッシュバンを介した Coffee スクリプトのスタンドアロン実行のサポートが向上しました。文法にないトークンに対する構文エラーが改善されました。
0.7.0
公式の CoffeeScript 変数スタイルは、JavaScript のように camelCase になりました。予約語はオブジェクト キーとして許可されるようになり、引用符で囲まれます。範囲内包表記はよりクリーンなコードを生成するようになりましたが、下向きに反復処理する場合は by -1 を指定する必要があります。前回のリリースから構文エラーの報告が大幅に改善されました。引数なしで coffee を実行すると、Readline サポート付きの REPL が起動するようになりました。<- バインド演算子は CoffeeScript から削除されました。while true ループと同等の loop キーワードが追加されました。クロージャを含む内包表記は、forEach のセマンティクスのように、その変数を閉じるようになります。クラス定義で (インスタンスにバインドされた) バインドされた関数を使用できるようになりました。一貫性のために、a in b は配列存在チェックとなり、a of b はオブジェクト キー チェックになりました。コメントは生成された JavaScript に渡されなくなりました。
0.6.2
coffee コマンドは、スクリプトのディレクトリ全体をコンパイルする際にディレクトリ構造を保持するようになりました。CoffeeScript コンパイラが Internet Explorer 内でライブ実行されるのを妨げていた 2 つの欠落を修正しました。CoffeeScript の heredoc と同様の、ブロック コメントの構文が追加されました。プロパティの名前が値の名前と同じである ECMA Harmony DRY スタイルのパターン マッチングがサポートされるようになりました: {name, length}: func。パターン マッチングが内包表記変数内で許可されるようになりました。unless がブロック形式で許可されるようになりました。until ループが while ループの逆として追加されました。switch ステートメントは、switch オブジェクト句なしで許可されるようになりました。Node.js v0.1.95 と互換性があります。
0.6.1
新しい Node.js v0.1.90 シリーズとの互換性のために CoffeeScript をアップグレードしました。
0.6.0
末尾のコンマが Python のように許可されるようになりました。静的プロパティは、@property 表記を使用してクラス定義内で直接割り当てることができます。
0.5.6
補間が文字列だけでなく、正規表現と heredoc 内でも使用できるようになりました。<- バインド演算子を追加しました。特別な ||= スタイルの演算子の代わりに、ハーフ式への代入を許可します。引数オブジェクトは自動的に配列に変換されなくなりました。coffeescript を require した後、Node.js は registerExtension のおかげで .coffee ファイルを直接ロードできるようになりました。複数のスプラットを関数呼び出し、配列、およびパターン マッチングで使用できるようになりました。
0.5.5
Stan Angeloff による文字列補間。0.5.3 以降 --run がデフォルトになっているため、--stdio と --eval をデフォルトで実行するように更新し、結果を出力する場合は --compile も渡してください。
0.5.4
Node.js のグローバル定数 __filename と __dirname を修正するバグ修正。ネストされた関数リテラルと不適切にインデントされたコメントのより柔軟な解析のための調整。最新の Node.js API の更新。
0.5.3
CoffeeScript には、クラスを定義するための構文が追加されました。コア コンポーネント (ノード、字句解析器、リライター、スコープ、Optparse) の多くがそれらを使用しています。Cakefile は optparse.coffee を使用してタスクのオプションを定義できます。--run が coffee コマンドのデフォルト フラグになりました。JavaScript を保存するには --compile を使用してください。正規表現リテラルと連鎖除算の間のあいまいさを修正しました。
0.5.2
/v2/browser-compiler-legacy/coffeescript.js として Web ページに含めるためのコンパイラの圧縮バージョンを追加しました。これは、タイプが text/coffeescript のスクリプト タグを自動的に実行します。パイプで渡されたコンパイル用の coffee コマンドに --stdio オプションを追加しました。
0.5.1
存在演算子によるnullソーキングの改善(インデックス付きプロパティへのソーキングを含む)。whileループに条件を追加し、内包表記と同様にwhenと組み合わせてフィルターとして使用できるようになりました。
0.5.0
CoffeeScript 0.5.0はメジャーリリースです。言語の変更はありませんが、Rubyコンパイラが削除され、純粋なCoffeeScriptで書かれたセルフホスティングコンパイラに置き換えられました。
0.3.2
@propertyがthis.propertyの短縮形になりました。デフォルトのJavaScriptエンジンがNarwhalからNode.jsに切り替わりました。Narwhalを使い続けたい場合は、--narwhalフラグを渡してください。
0.3.0
CoffeeScript 0.3には大きな構文変更が含まれています。関数記号が->に変更され、バインドされた関数記号が=>になりました。関数定義のパラメータリストは、括弧で囲む必要があります。プロパティソーキングが?.演算子で追加されました。引数付きの関数を呼び出すときに、括弧がオプションになりました。廃止されたブロクリテラル構文が削除されました。
0.2.6
Pythonスタイルのチェーン比較、条件付き存在演算子?=、およびBeautiful Codeからのいくつかの例が追加されました。文から式への変換、引数から配列への変換、TextMate構文ハイライターに関するバグ修正が含まれています。
0.2.5
switch文の条件に複数の値を一度に指定できるようになりました。いずれかがtrueであれば、caseが実行されます。thisにすぐにバインドする関数を定義する長いアロー==>が追加されました。whileループが、内包表記と同様に式として使用できるようになりました。スプラットをパターンマッチ内で使用して、配列の残りを吸収できるようになりました。
0.2.4
ネストされた配列やオブジェクトから値を抽出するための、ECMAScript Harmonyスタイルの分割代入が追加されました。整形された文字列やコードの塊のための、インデントを認識するヒアドキュメントが追加されました。
0.2.3
不満足だったinoキーワードが削除され、オブジェクト内包表記のためにofに置き換えられました。現在、for prop, value of objectのようになります。
0.2.2
オブジェクトに対する内包表記を実行する場合、コンパイル時に小さく、より効率的なコードを生成するのに役立つinの代わりにinoを使用します。.prototype.を表す短縮形として::が追加されました。「スプラット」記号が、プレフィックスのアスタリスク*から、ポストフィックスの省略記号...に変更されました。JavaScriptのin演算子、空のreturn文、空のwhileループが追加されました。大文字で始まるコンストラクタ関数には、オブジェクトの新しいインスタンスが返されることを確認するための安全チェックが含まれるようになりました。extendsキーワードが、GoogleのClosureライブラリのgoog.inheritsと同一に機能するようになりました。
0.2.1
引数オブジェクトが、参照時に実際の配列に変換されるようになりました。
0.2.0
メジャーリリース。有意な空白。文から式へのより良い変換。スプラット。スプライスリテラル。オブジェクト内包表記。ブロック。存在演算子。問題点を投稿してくれたすべての人々に感謝します。特に空白と式のヘルプを提供してくれたLiam O’Connor-Davisに感謝します。
0.1.6
CoffeeScriptディレクトリ外からcoffee --interactiveおよび--runを実行するためのバグ修正。ネストされた関数/if文のバグ修正。
0.1.5
配列スライスリテラルと配列内包表記の両方が、開始と終了を指定するためのRubyスタイルの範囲を取ることができるようになりました。JavaScriptの変数宣言がスコープの先頭にプッシュされるようになり、すべての代入文が式になりました。\を使用して改行をエスケープできます。coffeescriptコマンドがcoffeeと呼ばれるようになりました。
0.1.4
公式のCoffeeScript拡張子は、C#に適切に属する.csではなく、.coffeeになりました。多くの要望により、=を代入に使用できるようになりました。JavaScriptとは異なり、=はオブジェクトリテラル内でも:と交換可能に使用できます。func(1)(2)(3)(4)のようなチェーン関数呼び出しに対する文法的な修正が行われました。継承とスーパーは__proto__を使用しなくなったため、IE互換であるはずです。
0.1.3
coffeeコマンドに、インタラクティブなCoffeeScriptセッションを起動する--interactiveと、スクリプトを直接コンパイルして実行する--runが含まれるようになりました。どちらのオプションも、Narwhalの正常なインストールに依存します。aintキーワードがisntに置き換えられました。これはisと少しスムーズに一緒になります。引用符付き文字列が、オブジェクトリテラル内で識別子として許可されるようになりました(例:{"5+5": 10})。すべての代入演算子がコロンを使用するようになりました:+:、-:、*:など。
0.1.2
extendsキーワードの再追加により、複数のレベルの継承を通じてsuper()を呼び出す際のバグを修正しました。実験的なNarwhalサポート(Tuskパッケージとして)が、Tom Robinsonによって提供されました。これには、CoffeeScript REPLおよびインタープリターとしてのbin/csが含まれます。安全関数のラッパーを抑制するための新しい--no-wrapオプションが追加されました。
0.1.1
演算子としてinstanceofとtypeofが追加されました。
0.1.0
CoffeeScriptの初期リリース。
コメント
CoffeeScriptでは、コメントは行末までの
#文字、または###から次の###までで示されます。コメントはコンパイラによって無視されますが、コンパイラはコンパイル後にコメントを出力JavaScriptに再挿入するために最善を尽くします。インラインの
###コメントは型注釈を可能にします。