ECMAScript のバージョン (JavaScript で利用できる機能) について
要約
- ニコ生ゲームにおいて ES2016 以降の機能は利用しないでください (2024 年 9 月現在)。
- TypeScript では、
target
を指定することで ES2016 以降でも利用できる機能があります。
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 では一部緩和されます 。 より新しい機能を使いたい場合は TypeScript テンプレートの利用を検討してください。
INFO
ニコ生ゲームのこの制限は、主にニコニコ生放送がサポートする古い機種のスマートフォンによって生じています。 将来的に Android などのサポート状況が変化した場合、この制限は緩和されます。
TypeScript で開発している場合
TypeScript では、.js ファイルを生成する際の ECMAScript のバージョンを指定することができます (tsconfig.json の "target"
プロパティ) 。
Akashic Engine の TypeScript テンプレートには最初からこの設定が含まれています。 そのため構文や演算子に関しては ES2016 以降の機能を利用できます。 たとえば (ES2020 で追加された) ??
演算子を利用する以下のコードは、
x ?? false;
ES2015 までの機能だけを使う等価なコードとして以下の内容が .js ファイルに出力されます。
x !== null && x !== void 0 ? x : 100;
WARNING
この TypeScript による変換は構文や演算子に限られます 。クラスやオブジェクトのメソッドなどには対応していません。 たとえば以下のものは TypeScript テンプレートであっても利用できません。
- 配列の
flat()
,flatMap()
,at()
- 文字列の
padStart()
,padEnd()
,trimStart()
,trimEnd()
,matchAll()
BigInt
,WeakRef
など
TypeScript テンプレートでは、これらの機能を利用するとエラーになるようになっています。