ECMAScript のバージョン (JavaScript で利用できる機能) について
要約
- ニコ生ゲームにおいて ES2016 以降の機能は利用しないでください (2024 年 9 月現在)。
- ただし次のいずれかの場合、ES2016 以降の機能でも 構文や演算子 は利用できます。
- TypeScript テンプレートでゲームを作成している
akashic-cli@3.0.0
以降を利用している
ECMAScript のバージョンと動作環境問題
JavaScript の構文や組み込みの機能は、ECMAScript (ECMA-262) として規格化されています。 規格は毎年更新されていて、新しい版ほど高機能になります。
たとえば const
, let
やアロー関数、 Map
と Set
などは 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 で追加された) ??
演算子を利用する以下のコードは、
x ?? false;
ES2015 までの機能だけを使う等価なコードとして以下の内容が .js ファイルに出力されます。
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 に変換できない新しい機能を利用するとコンパイルエラーになるよう設定しています。