Skip to content

ECMAScript のバージョン (JavaScript で利用できる機能) について

要約

  • ニコ生ゲームにおいて ES2016 以降の機能は利用しないでください (2024 年 9 月現在)。
  • ただし次のいずれかの場合、ES2016 以降の機能でも 構文や演算子 は利用できます。
    • TypeScript テンプレートでゲームを作成している
    • akashic-cli@3.0.0 以降を利用している

ECMAScript のバージョンと動作環境問題

JavaScript の構文や組み込みの機能は、ECMAScript (ECMA-262) として規格化されています。 規格は毎年更新されていて、新しい版ほど高機能になります。

たとえば const, let やアロー関数、 MapSet などは 2015 年の版 (ES2015) で追加された機能です。 同様に、冪乗演算子 ** は 2016 年の版 (ES2016)、 async 関数は 2017 年、optional chaining 演算子 ?. は 2020 年の版で追加されました。

新しい版の機能は便利なことも多い一方、 実行環境によってはサポートされていない 可能性があります。 サポートされていない機能を利用すると、プログラムは単にエラーになり、続行できません。

特に演算子や構文がサポートされていない場合、プログラムは一行も実行されることなくエラーになるため 「ゲーム画面にエラーメッセージを表示してプレイヤーにソフトウェア更新を促す」といった対応すらできません。

ニコ生ゲームのサポート範囲

この問題を避けるため、 ニコ生ゲームでは現在、ES2015 までの機能をサポート範囲 としています。 2024 年 9 月現在、ES2016 以降の機能の利用は避けるようにしてください。

避けるべき機能の例:

  • **, ?., ??, &&=, ||= などの演算子
  • オブジェクト内の ...
  • 変数束縛なしの catch
  • 配列の flat(), flatMap(), at()
  • 文字列の padStart(), padEnd(), matchAll()
  • BigInt, WeakRef

TIP

これらは一例です。「ES2016 以降」に該当する機能の具体的な内容については、 Ecma TC39 の Finished Proposals などを参照してください。 このページは 2016 年以降の版に含められた仕様の一覧になっているので、書かれているものは全て ES2016 以降に当てはまります。

ただし後述のとおり、TypeScript テンプレートと akashic-cli@3.0.0 以降では、この制限は一部緩和されます

INFO

ニコ生ゲームのこの制限は、主にニコニコ生放送がサポートする古い機種のスマートフォンによって生じています。 将来的に Android などのサポート状況が変化した場合、この制限は緩和されます。

akashic-cli@3.0.0 以降を利用している場合

akahsic-cli@3.0.0 以降の akashic export コマンドは、 内部でスクリプトアセットを変換して、ES2015 環境に対応した .js ファイルを生成するようになっています。

そのため 構文や演算子に関しては ES2016 以降の機能を利用できます 。 たとえば (ES2020 で追加された) ?? 演算子を利用する以下のコードは、

javascript
x ?? false;

ES2015 までの機能だけを使う等価なコードとして以下の内容が .js ファイルに出力されます。

javascript
x !== null && x !== void 0 ? x : 100;

WARNING

この この変換は構文や演算子に限られることに注意 してください。 クラスやオブジェクトのメソッドなどには対応していません。 たとえば以下のものは利用できません。

  • 配列の flat(), flatMap(), at()
  • 文字列の padStart(), padEnd(), trimStart(), trimEnd(), matchAll()
  • BigInt, WeakRef など

TypeScript で開発している場合

TypeScript テンプレートを利用している場合も同様に、ES2016 以降の構文や演算子を利用できます。 これは akashic-cli のバージョンに依存しません。

TypeScript コンパイラには「生成する .js ファイルの ECMAScript バージョンを指定する機能」があり (tsconfig.json の "target" プロパティ)、Akashic Engine の TypeScript テンプレートは以前からこの設定を行なっていたためです。

WARNING

やはりこちらの変換も 構文や演算子に限られる ことに注意してください。 クラスやオブジェクトのメソッドなどには対応していません。 TypeScript テンプレートでは、ES2015 に変換できない新しい機能を利用するとコンパイルエラーになるよう設定しています。