Contents
1. ES2025 で注目されている提案
| 提案名 | 現在のステージ | 主な目的 |
|---|---|---|
| Iterator Helpers | Stage 3 | map, filter, take, drop など、イテレータ上で配列と同様の高階操作を可能にする。 |
| Promise.try | Stage 3 | 同期関数・非同期関数を統一的に Promise 化し、例外処理を catch に集約できるヘルパー。 |
| Import Attributes | Stage 4(実装が進行中) | import 文に属性情報(例: { type:"json" })を付与して、モジュールローダー側でコンテキストを取得できるようにする。 |
| JSON Modules | Stage 3 | assert { type:"json" } を併せて記述することで、JSON ファイルを ES モジュールとして直接インポート可能にする。 |
これらはすべて TC39 の会議資料や GitHub リポジトリで公開されている 提案段階 の仕様です。実装がブラウザや Node.js に取り込まれるかどうかは、今後の標準化プロセス次第となります。
2. 提案ごとのシンタックスとサンプルコード
2‑1. Iterator Helpers(イテレータ向けユーティリティ)
|
1 2 3 4 5 6 7 |
// 文字列イテレータに対して map と filter をチェーン for (const ch of "hello".values() .map(c => c.toUpperCase()) .filter(c => c !== "L")) { console.log(ch); // H E O } |
Iterator.prototype.map,filter,take,dropなどが追加される想定です。- 現在は polyfill(例:
core-js/experimental/iterator-helpers)で試すことができます。
2‑2. Promise.try
|
1 2 3 4 5 6 7 8 |
Promise.try(() => { // 同期例外でも自動的に reject に変換される if (Math.random() > 0.5) throw new Error("偶然失敗"); return fetch("/api/data"); // 非同期処理を返すことも可能 }) .then(res => res.json()) .catch(err => console.error(err)); |
- 与えた関数の戻り値は自動的に
Promise.resolveに包まれ、例外はrejectへ変換されます。 - 現時点では Stage 3 の提案であり、実装は限定的です(Node.js 20+ の実験フラグや、一部ブラウザの開発ビルドで利用可能)。
2‑3. Import Attributes
|
1 2 3 |
import config from "./config.json" assert { type: "json" }; console.log(config.apiUrl); |
assertキーワードにより、インポート対象が JSON であることを明示します。- 属性情報はモジュールローダーが適切なハンドラを選択するための手掛かりになります。
2‑4. JSON Modules(Import Attributes と併用)
|
1 2 3 4 |
// data.json の内容例: {"msg":"Hello"} import data from "./data.json" assert { type: "json" }; console.log(data.msg); // "Hello" |
- 従来は
fetch+JSON.parse、あるいはビルドツールのローダーが必要でしたが、この提案により ネイティブ にインポートできるようになります。 - TypeScript の型定義(
*.d.ts)も自動生成される予定です。
3. ES2024・ES2023 との比較
| 機能 | ES2025 提案 (仮) | 従来の代替手段 | 主な差分 |
|---|---|---|---|
| Iterator Helpers | it.map(fn).filter(p) 等 |
Array.from(it).map(fn)、lodash の _.map |
イテレータ上で直接操作でき、メモリ使用量が削減。 |
| Promise.try | Promise.try(() => …) |
new Promise((res, rej) => { try { res(fn()); } catch(e){rej(e);} }) |
1 行で完結し、スタックトレースがシンプルになる。 |
| Import Attributes | import x from "./x.json" assert { type:"json" } |
ビルドツール独自ローダーや fetch + JSON.parse |
標準化によりビルド設定への依存が低減。 |
| JSON Modules | 上記同様 | import data from "./data.json"(非標準)や手動取得 |
モジュール解決が高速化し、型安全性が向上。 |
代替実装例は MDN の「Using import assertions」や、GitHub の polyfill リポジトリを参照してください。
4. 主なランタイムの実装ステータス(2026 年2月時点)
| ランタイム | Iterator Helpers | Promise.try | Import Attributes | JSON Modules |
|---|---|---|---|---|
| Chrome (≥ 115, experimental) | 未実装(フラグ #enable-iterator-helpers が利用可能) |
未実装(実験ビルドでオプトイン) | 実装済み(Chrome 116 からデフォルト有効化予定) | 実装済み(Chrome 115) |
| Edge (Chromium 系) | 同上 | 同上 | 同上 | 同上 |
| Firefox (≥ 113) | 未実装(--js-flags=--enable-iterator-helpers が必要) |
未実装 | 実装済み(Firefox 115) | 実装済み(Firefox 114) |
| Safari (≥ 17) | 未実装(WebKit の開発ブランチでテスト中) | 未実装 | 実装済み(Safari 17) | 実装済み(Safari 17) |
| Node.js (20.0+ experimental) | Polyfill が提供されているが、組込み実装はなし | --experimental-promise-try フラグで利用可 |
import ... assert {} はデフォルトでサポート |
JSON Modules は assert 付きインポートで使用可能 |
注意
- 表中のバージョン番号は 開発ビルドやフラグ有効時 の情報であり、正式リリース版に必ず含まれるとは限りません。
- 実装が未定の場合は 「未実装」 とし、代替手段として polyfill の利用を推奨します。
5. 移行ガイドラインとベストプラクティス
5‑1. 準備フェーズ
- 提案のステータス確認
- TC39 の公式リポジトリ(
https://github.com/tc39/proposals)で最新の Stage をチェック。 - 実験的ビルドで動作検証
- Chrome Canary、Firefox Nightly などの開発版を使用し、フラグや
--experimental-オプションで有効化できるか確認。
5‑2. ビルドツール・ランタイム設定
| ツール | 設定例 |
|---|---|
| Babel (v8以降) | ["@babel/preset-env", { "targets": "defaults", "bugfixes": true }](未実装機能は自動的に polyfill されない) |
| TypeScript (5.2+) | "moduleResolution": "node16" と併せて、"importsNotUsedAsValues": "error" を有効化し assert の型チェックを厳格化。 |
| Webpack (5.x) | experiments: { importAssertions: true } を追加すると Import Attributes が認識されます。 |
5‑3. コードベースへの段階的導入
- Iterator Helpers
- 大量データをストリーム処理している箇所で
Array.from(it).map(... )を置き換える。パフォーマンス測定はbenchmark.jsで行い、メモリ使用量が 10 %〜30 % 減少することが期待されます。 - Promise.try
- 複数の非同期関数で共通化したエラーハンドリングロジックを
Promise.tryに置き換える。既存テストがすべてパスするか確認し、スタックトレースが期待通りに出力されることを検証。 - Import Attributes / JSON Modules
- 新規モジュールは必ず
assert { type:"json" }を付与し、既存のfetch(...).then(r=>r.json())パターンは段階的に書き換える。古いブラウザ向けには@rollup/plugin-jsonなどのビルドタイムローダーを併用。
5‑4. テスト戦略
- Jest(v29 以上)で
testEnvironment: "jsdom"を設定し、ブラウザ実装をエミュレート。 - Node.js のテストは
--experimental-modules --experimental-promise-tryフラグ付きで走らせる。 - Polyfill が有効になるケースと無効になるケースの両方でユニットテストを実行し、挙動の差異が出ないことを確認。
5‑5. デプロイ時の注意点
| 項目 | 注意点 |
|---|---|
| 古いブラウザ(IE 系) | core-js の iterators ポリフィルや、promise.try 用のラッパーをバンドルに含める。 |
| デバッグ | Promise.try は内部で非同期化されるため、例外が元関数名ではなく anonymous になることがあります。必要に応じて Error.stackTraceLimit を調整してください。 |
| バージョン固定 | 実装が変動しやすいため、プロダクションビルドでは 特定バージョン(例: Chrome 116+)以上を対象としたコードにトランスパイルすることを推奨します。 |
6. まとめ
- Iterator Helpers と Promise.try は現時点で Stage 3 の提案です。実装は限定的ですが、メモリ効率やエラーハンドリングの簡素化という観点から注目されています。
- Import Attributes と JSON Modules は Stage 4 に近く、Chrome・Firefox・Safari の最新開発版で試すことができます。実装が安定すれば、ビルドツール依存を減らしたモジュール管理が可能になるでしょう。
- 移行は「小さなサンドボックスでの検証 → ビルド設定の更新 → 段階的コード置換」 の 3 ステップで進めるとリスクが低く、テスト自動化と polyfill の併用が安全策となります。
今後も TC39 の会合や各ブラウザベンダーのリリースノートを定期的にチェックし、仕様変更や実装ステータスの更新に追従してください。
本稿は 2026 年2月時点の情報を元に作成しています。最新情報は公式ドキュメント(MDN, TC39 proposals, 各ブラウザベンダーのリリースノート)をご参照ください。