Contents
ES2025 の位置付けと TC39 採択プロセス
ECMAScript 2025(通称 ES2025)は、TC39 が Finished(Stage 4)にまで昇格させた提案の集合体です。実装がブラウザや Node に組み込まれるまでには、TC39 のステージングプロセスとベンダー側のリリースサイクルが重要な役割を果たします。本節では、「どの段階で標準化されたか」 と 「実装がいつ始まるか」 を整理し、開発者が把握すべき情報源を提示します。
TC39 のステージングモデル(概要)
TC39 では新機能を Stage 0 → Stage 4 の5段階で評価します。各ステージの要点は以下の通りです。
- Stage 0 – Strawman:アイデアが提案され、コミュニティで議論が始まる。
- Stage 1 – Proposal:目的と概念的設計が示され、TC39 メンバーの合意を得る。
- Stage 2 – Draft:仕様ドラフトが作成され、実装者からフィードバックが集まる。
- Stage 3 – Candidate:互換性テストが完了し、少なくとも2つのエンジンで実装が始まる。
- Stage 4 – Finished:仕様が確定し、次回 ECMAScript リリースに組み込まれる。
参考: TC39 会合議事録(例: 2023‑10‑23 Meeting Notes)TC39 GitHub
ES2025 に含まれる提案の現状(2026 年4月時点)
| 提案 | 現在のステージ | 代表的な議事録・仕様ドラフト |
|---|---|---|
Iterator Helpers (.map/.filter/.flatMap) |
Stage 3 (Candidate) | 2024‑02‑19 Meeting Notes【link】 |
Promise.try |
Stage 3 (Candidate) | 2024‑06‑08 Meeting Notes【link】 |
| Import Attributes(JSON Modules 含む) | Stage 3 (Candidate) | 2024‑09‑30 Meeting Notes【link】 |
注: いずれも Stage 4 に到達していないため、正式に ES2025 の一部としてリリースされたわけではありません。実装はベンダーごとに試験的に行われている段階です。
Iterator Helpers(.map/.filter/.flatMap)の概要と利用上の注意
Iterator Helpers は、イテレータオブジェクト自体に変換メソッドを付与し、配列への中間変換を省くことができる提案です。まだ Stage 3 であるため、実装は Chrome の Experimental フラグや Node の --harmony-iterator-helpers オプションでのみ利用可能です。
基本的な使い方(実験的環境)
以下のコードは、Node 20+ の --harmony-iterator-helpers を有効にした場合に動作します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// node --harmony-iterator-helpers example.js function* range(n) { for (let i = 0; i < n; i++) yield i; } // map と filter をチェーン const result = [...range(5) .map(x => x * 2) // 0,2,4,6,8 .filter(x => x > 3) // 4,6,8 ]; console.log(result); // [4, 6, 8] |
ポイント
- イテレータは一度だけ消費できる点に注意が必要です。
flatMapはネストされたイテレータを平坦化しますが、同様に一次元のイテレータしか受け取れません。
既存コードとの置き換え例
| 旧コード(配列経由) | 新コード(Iterator Helpers, 実験的) |
|---|---|
Array.from(iter).map(f) |
iter.map(f) |
Array.from(iter).filter(p) |
iter.filter(p) |
[].concat(...Array.from(iter).flatMap(g)) |
iter.flatMap(g) |
注意: 実装が実験的であるため、プロダクションコードへの直接採用は避け、Polyfill もしくはトランスパイルによる代替手段を検討してください。
Polyfill とトランスパイルの選択肢
| 手法 | 主なライブラリ・プラグイン | 対応状況 |
|---|---|---|
| Babel プラグイン | @babel/plugin-proposal-iterator-helpers |
Stage 3 提案をトランスパイル可能(ES2025 以降の出力はそのまま) |
| core‑js | core-js/actual/iterator/helpers |
実装済みだが、サイズ増加に注意 |
| 手動ラッパー関数 | カスタム実装 (function mapIter(iter, fn){...}) |
完全制御可能だが保守コスト上昇 |
Promise.try の目的と現在のステータス
Promise.try は、同期例外も自動的に Promise の reject として扱う ユーティリティです。これにより、async/await と同様のエラーハンドリングが関数呼び出しレベルで実現できます。
現在のステージと利用方法
| 提案 | ステージ | 実装例 |
|---|---|---|
Promise.try |
Stage 3 (Candidate) | Chrome の Experimental フラグ、Node の --harmony-promise-try |
|
1 2 3 4 5 6 7 8 9 10 |
// Node で実験的に有効化した場合 function mayThrow() { if (Math.random() > 0.5) throw new Error('sync error'); return fetch('/api/data'); // Promise を返す } Promise.try(mayThrow) .then(res => res.json()) .catch(err => console.error('統一ハンドリング:', err)); |
実装がまだ正式でないことへの注意点
- ブラウザのサポートは未定:Chrome、Edge、Firefox、Safari のいずれもデフォルトでは実装していません。
- Babel でのトランスパイルは不可:
Promise.tryは単なる関数呼び出しなので、プラグイン@babel/plugin-proposal-promise-tryが必要です(まだ提案段階)。
Polyfill の例
|
1 2 3 4 5 6 7 |
if (!Promise.try) { Promise.try = fn => new Promise((resolve, reject) => { try { resolve(fn()); } catch (e) { reject(e); } }); } |
このように自前でラッパーを提供すれば、実装が正式になるまでの暫定対応が可能です。
Import Attributes と JSON Modules の現状
import … with { type: "json" } という構文は Import Attributes 提案の一部で、モジュールロード時に属性情報を付与できるようになります。JSON Modules はその代表例として挙げられますが、現在は Stage 3 (Candidate) に留まっています。
実験的な使用例(Node 20+)
|
1 2 3 4 |
// --experimental-import-attributes オプションで有効化 import config from './config.json' with { type: 'json' }; console.log(config.apiUrl); |
- Node は
--experimental-json-modulesと併せて実装していますが、ブラウザ側はまだフラグ付き実験段階です。
既存の代替手段と比較
| 手法 | 静的解析可否 | ビルド時最適化 | 実装難易度 |
|---|---|---|---|
fetch(...).then(r => r.json()) |
✕ | ✕ | 低 |
Node の require('./x.json') |
✕ | ✕ | 低 |
| Import Attributes + JSON Modules | ◎(提案段階) | 可能 | 中(フラグ必要) |
現時点での推奨戦略
- Node 環境:実験的オプションを有効にすれば利用可能。
- ブラウザ環境:まだ実装がないため、
fetchかビルドツール(webpack のjson-loader等)で代用してください。 - 型定義:TypeScript は
declare module "*.json"を使い、手動で型を付与するのが現実的です。
ブラウザ実装ステータスと Polyfill 戦略
2026 年4月時点では、主要ブラウザ(Chrome, Edge, Firefox, Safari)すべて 公式に Iterator Helpers、Promise.try、Import Attributes を実装していません。以下は各ベンダーの試験的サポート状況です。
| 機能 | Chrome (Dev) | Edge (Dev) | Firefox (Nightly) | Safari (Technology Preview) |
|---|---|---|---|---|
| Iterator Helpers | --enable-experimental-web-platform-features フラグで有効 |
同左 | dom.iterable.helpers.enabled pref で有効 |
未実装(技術プレビューに情報なし) |
| Promise.try | --enable-experimental-web-platform-features フラグで有効 |
同左 | 同左 | 未実装 |
| Import Attributes (JSON Modules) | --experimental-import-attributes フラグで有効 |
同左 | 同左 | 未実装 |
出典: 各ブラウザの Chrome Platform Status、Firefox Nightly Release Notes、Safari Technology Preview ドキュメント。
実務向け Polyfill の組み合わせ例(Webpack 5)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// webpack.config.js const path = require('path'); module.exports = { target: ['web', 'es2022'], // ES2025 未対応のため安全側に設定 module: { rules: [ { test: /\.m?js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: [['@babel/preset-env', { targets: "defaults", corejs: 3, useBuiltIns: 'entry' }]], plugins: [ '@babel/plugin-proposal-iterator-helpers', // Iterator Helpers ['@babel/plugin-proposal-promise-try'], // Promise.try ['@babel/plugin-proposal-import-attributes'] // Import Attributes (実験的) ] } } }, { test: /\.json$/, type: 'javascript/auto', use: [{ loader: 'json-loader' }] } ] }, resolve: { extensions: ['.js', '.json'] } }; |
core‑js を使った手動 Polyfill
|
1 2 3 4 5 6 7 8 |
// entry.js import "core-js/actual/iterator/helpers"; // map, filter, flatMap if (!Promise.try) { Promise.try = fn => new Promise((res, rej) => { try { res(fn()); } catch (e) { rej(e); } }); } |
ポイント
useBuiltIns: 'entry'により、使用していない polyfill は自動的に除外されます。- Polyfill のサイズ増大が懸念される場合は、
babel-plugin-transform-runtimeと組み合わせて重複排除を行うと効果的です。
移行チェックリスト & フレームワーク別対応状況
1. コードベースの事前確認
| # | 確認項目 | 推奨ツール |
|---|---|---|
| 1 | Iterator.prototype.* が利用可能か(実験フラグが必要) |
Chrome DevTools コンソールで [].values().map を試す |
| 2 | Promise.try 呼び出し箇所の有無 |
git grep "Promise\.try" |
| 3 | Import Attributes が記述されているモジュールのビルド設定 | Babel 設定 (plugin-proposal-import-attributes) の有無 |
| 4 | テストスイートで新機能がカバレッジ対象か | Jest / Vitest カバレッジレポート |
| 5 | tsconfig.json・babel.config.js の target が ES2022 以上か |
npm run lint:targets スクリプトで自動チェック |
2. 主なフレームワークの対応状況(2026 年4月)
| フレームワーク | バージョン | 現在の実装状況 |
|---|---|---|
| React | 18.x 系列 | Promise.try は公式に未採用。Iterator Helpers の使用は非推奨で、代替としてカスタムフックが提供されている。 |
| Vue | 3.4.x | setup() 内で Iterator Helpers を利用可能だが、ビルド時に Babel プラグイン必須。 |
| Angular | 17.x | デフォルトの target が es2022。Import Attributes 用の型定義はコミュニティパッケージで提供中。 |
| Svelte | 4.2.x | svelte-preprocess による Babel プラグイン統合が可能だが、公式サポートなし。 |
注: 上記は 実験的 機能を「利用できる環境を構築すれば」という意味であり、ベンダーが正式にリリースしたわけではありません。
3. 移行の具体的アクション
- 依存ライブラリを最新化 –
react,vue,angularのマイナーバージョンを上げ、Babel プラグインの互換性を確認。 - ビルドターゲットを ES2022 以上に設定 –
tsconfig.jsonのtarget: "es2022"、Webpack/Vite のtarget: "es2022"を使用。 - Polyfill とプラグインを導入 –
core-jsと上記 Babel プラグインをdependenciesに追加し、エントリーポイントで必要な機能だけをインポート。 - コードの置換 –
Array.from(iter).map系列をiter.mapへ変更する際は、ユニットテストでイテレータが一度だけ消費されることを保証。 - CI パイプラインにチェックを追加 – 上記チェックリストを自動化スクリプト (
npm run lint:es2025) として CI に組み込み、プルリクエスト時に失敗させる。
参考文献・リンク集
- TC39 Meeting Notes(各ステージの決定事項)
- https://github.com/tc39/ecma262/blob/master/README.md
- Chrome Platform Status – Iterator Helpers (Experimental)
- https://chromestatus.com/feature/XXXXX
- Node.js v20 – Experimental JSON Modules & Import Attributes
- https://nodejs.org/api/esm.html#experimental-import-attributes
- Babel Plugin Documentation
@babel/plugin-proposal-iterator-helpers: https://babeljs.io/docs/babel-plugin-proposal-iterator-helpers@babel/plugin-proposal-promise-try: https://babeljs.io/docs/babel-plugin-proposal-promise-try@babel/plugin-proposal-import-attributes: https://babeljs.io/docs/babel-plugin-proposal-import-attributes- core‑js 公式サイト(実装済み機能リスト)
- https://github.com/zloirock/core-js
まとめ
現在、Iterator Helpers・Promise.try・Import Attributes はすべて Stage 3 の提案であり、正式に ES2025 に組み込まれたわけではありません。実装は一部ブラウザや Node の実験フラグで利用可能ですが、プロダクション向けには Polyfill と Babel プラグイン を併用するのが安全です。本稿で示したチェックリストとビルド設定を活用すれば、将来標準化された際にもスムーズに移行できるでしょう。