144 人が閲覧(直近 30 日) Node.js

Node.js 26の新機能と破壊的変更・LTS移行日|24からの移行手順【26.10.0対応】

Node.js 26の新機能と破壊的変更・LTS移行日|24からの移行手順【26.10.0対応】

Node.js 26は2026年5月5日にCurrentとしてリリースされ、2026年10月28日にLTS(長期サポート)へ移り、2029年4月30日にサポートが終わります。中身の目玉はTemporal APIの既定有効化、V8 14.6、Undici 8の3つで、Undici 8では組み込みのfetchがHTTP/2で通信するようになりました。本記事は2026年9月27日時点の26系最新リリース26.10.0を基準に、スケジュール、新機能、削除されたAPI、Node.js 24から上げるときの手順をNode.js公式のリリースノートとスケジュール定義から整理します。

まとめ:Node.js 26のLTS日程と移行前に確認すること

  • 日程:2026年5月5日リリース、10月28日にActive LTS、2027年10月20日からMaintenance LTS、2029年4月30日にEOL。
  • 位置づけ:偶数版がLTSになる現行方式で出る最後の版。27以降は年1回リリースで全版がLTSになる。
  • 新機能:Temporalがフラグ無しで使える。Map.prototype.getOrInsert()とIterator.concat()が追加。fetchはHTTP/2対応サーバーにHTTP/2で接続する。
  • 壊れる箇所:response.writeHeader()と_stream_*モジュールが削除、--experimental-transform-typesが削除、module.register()は実行時警告。Node.js固有のABIに依存するネイティブアドオンは、147向けのビルドへの更新か再ビルドが要る(NODE_MODULE_VERSION 147)。
  • 本番の移行時期:Node.js 24は2028年4月30日までサポートされるので、本番はLTS入り後に上げれば十分です。ライブラリはCIに26を今すぐ加えます。

Node.js 26のリリース日・LTS入り・EOLの日程

Node.jsのリリース日程は、公式リポジトリnodejs/Releaseのschedule.jsonが正本です。2026年9月27日時点の各系列は次のとおりです。

系列 状態(9月27日時点) 初回リリース Active LTS開始 Maintenance開始 EOL
26.x(Lithium予定) Current 2026-05-05 2026-10-28 2027-10-20 2029-04-30
24.x(Krypton) Active LTS 2025-05-06 2025-10-28 2026-10-20 2028-04-30
22.x(Jod) Maintenance LTS 2024-04-24 2024-10-29 2025-10-21 2027-04-30
25.x EOL 2025-10-15 なし 2026-04-01 2026-06-01

LTS入りの時点でコードネームが付きます。予定名の一覧(nodejs/ReleaseのCODENAMES.md)では26.xは「Lithium」です。バージョン管理ツールでlts/*を指定している環境は、10月28日までは24系を、それ以降は26系を指します。LTSという区分そのものやlts/*の固定方法はNode.js LTSの現行版確認とlts/*の固定・移行時期で扱っています。

偶数版LTS方式の最後の版と、27以降の年1回リリース

Node.jsのリリース担当チームは2026年3月10日の公式ブログ「Evolving the Node.js Release Schedule」で、27.xから年2回のメジャーリリースを年1回に減らすと発表しました。26はこの変更前の方式に従う最後の系列です。

  • 毎年10月から翌3月まではAlpha(semver-majorの変更を含む検証版。バージョンは27.0.0-alpha.1形式)
  • 4月にCurrentとして正式リリースし、10月にLTSへ昇格。LTS期間は30か月で、初回リリースからEOLまで36か月
  • 奇数・偶数の区別をなくし、すべての版がLTSになる。版番号は初回リリースの西暦に合わせる(27.0.0は2027年、28.0.0は2028年)

schedule.jsonの27.xは、Alpha開始が2026年10月28日(26のLTS入りと同日)、Current開始が2027年4月22日、EOLが2030年4月30日です。27.xにはltsのキーが無く、2027年10月20日からmaintenanceになります。変更の理由としてブログは、奇数版の利用が少ないこと、4〜5系列へのセキュリティ修正の移植がボランティア中心の体制で限界にきていることを挙げています。なお同ブログの表は26.0.0を「April 2026」としていますが、実際のリリースは5月5日でした。

Temporal APIの既定有効化と日付処理の変わり方

26.0.0のリリースノートは最初の項目でTemporal APIの既定有効化を挙げています。24系ではV8のフラグ--harmony-temporalを付けたときだけ現れたTemporalが、フラグ無しでグローバルに存在します。Dateとの違いが最も出るのは、月末をまたぐ加算とタイムゾーンの扱いです。

// Date:1月31日に「1か月」を足すと2月31日が繰り越されて3月3日になる
const old = new Date(2026, 0, 31);
old.setMonth(1);
console.log(old.getMonth() + 1, old.getDate()); // 3 3

// Temporal:月末に丸められる
const d = Temporal.PlainDate.from('2026-01-31');
console.log(d.add({ months: 1 }).toString()); // 2026-02-28

// タイムゾーン付きの時刻はDST(夏時間)の切替も計算に入る
const z = Temporal.ZonedDateTime.from('2026-03-08T01:30[America/New_York]');
console.log(z.add({ hours: 1 }).toString());
// 2026-03-08T03:30:00-04:00[America/New_York]

上の出力は公式配布の26.10.0で実行した結果です。Temporal.PlainDate(日付だけ)、Temporal.ZonedDateTime(タイムゾーン付き)、Temporal.Instant(時点)と型が分かれており、いずれも不変オブジェクトなのでadd()は新しい値を返します。26.2.0ではfs.StatsにもTemporal.Instantの時刻フィールドが加わりました。

date-fnsやDay.jsを今すぐ外す必要はありません。Temporalは24系では既定で無効(実験的フラグが必要)で、未対応のブラウザもあるため、同じコードを複数の実行環境で動かすなら、ライブラリのままにするかポリフィルを併用します。サーバー側だけで完結し、26以上に固定できるコードから置き換えるのが順当です。

Homebrew版のTemporal非搭載とビルド設定

Temporalが「既定で有効」なのは公式ビルドの話です。V8のTemporal実装はRust製のライブラリに依存しており、ビルド時の設定v8_enable_temporal_supportで有無が決まります。macOSのHomebrewで入れたnode 26.5.0ではこの値が0で、typeof Temporalは"undefined"でした。Homebrewのformulaにも「--shared-temporal_capiは--v8-enable-temporal-support付きでビルドする場合にだけ使う」との注記があり、同フラグは渡されていません。

node -p "process.config.variables.v8_enable_temporal_support + ' ' + typeof Temporal"
// 公式tarball 26.10.0  → 1 object
// Homebrew 26.5.0      → 0 undefined

手元で動いたのにCIでTemporal is not definedになる、あるいはその逆は、この差で起きます。Temporalを使うなら、開発機・CI・本番のNode.jsの入手元をnodejs.orgの配布物(nvmやVolta、公式Dockerイメージ等)にそろえ、上のコマンドで確認してください。

TypeScriptでTemporalを型付けする設定

Temporalの型は@types/nodeではなくTypeScript本体のlibで提供されます。@types/node 26.6.3のfs.d.tsには「TS 6.0未満のサポートを外したらTemporal組み込み型に置き換える」というTODOがあり、Node.js側では型を定義していません。TypeScript 7.0.2で確かめると、"lib": ["es2025"]ではTemporalがTS2304(名前が見つからない)、getOrInsertがTS2550になり、"lib": ["esnext"]にすると両方通りました。

@types/nodeの26系は、Node.js 26のリリースから45日後の2026年6月19日に26.0.0が公開され、9月27日時点のlatestは26.6.3です。

V8 14.6とUndici 8で変わるJavaScriptとHTTPの挙動

getOrInsertとIterator.concat(V8 14.6)

V8は14.6.202.33(Chromium 146相当)に上がり、ES2026に入った2つの提案が使えるようになりました。

const cache = new Map();
// キーが無いときだけ値を入れて返す(has→set→getの3行が1行になる)
cache.getOrInsert('a', 1);            // 1
cache.getOrInsert('a', 2);            // 1(既存値のまま)
// 値の生成が重い場合は関数で渡す
cache.getOrInsertComputed('b', (k) => k.toUpperCase()); // 'B'

// 複数の反復可能オブジェクトを配列化せずに連結
[...Iterator.concat([1, 2], new Set([3]))]; // [1, 2, 3]

WeakMapにも同じgetOrInsertとgetOrInsertComputedがあります。ES2026に入った機能でもMath.sumPreciseは26.10.0でundefinedのままで、V8のフラグ--js-sum-preciseが要ります。Error.isErrorとUint8Array.fromBase64は既定で使えます。ECMAScriptの版ごとの収録機能はECMAScriptとはで一覧にしています。

fetchのHTTP/2既定有効化(Undici 8)

組み込みのfetchを実装するUndiciは、26.0.0で8.0.2に上がり、26.10.0では8.10.2です。Undici 8.0.0のリリースノートには「feat!: enable h2 by default」とあり、HTTP/2が既定で有効になりました。HTTP/1.1とHTTP/2の両方を受け付けるTLSサーバーにfetchで接続し、サーバー側でreq.httpVersionを出すと、結果は次のように分かれます。

Node.js Undici サーバーが受けたHTTPバージョン
24.21.0 7.29.1 1.1
26.10.0 8.10.2 2.0

コードを変えなくても、ALPNでHTTP/2を提示する相手とはHTTP/2で話すようになります。影響が出やすいのは、HTTP/1.1前提で組まれた社内プロキシやAPIゲートウェイ、ヘッダー名の大文字小文字に依存した処理(HTTP/2ではヘッダー名が小文字になる)、1リクエスト1コネクションを前提にした接続数の監視です。26へ上げたら外部APIを叩く結合テストを必ず通し、問題が出た接続だけ、npmのundiciパッケージからAgentをallowH2: falseで作り、fetchのdispatcherオプションに渡すとHTTP/1.1に戻ります(26.10.0とundici 8.11.2で確認)。

削除・非推奨になったAPIと移行先

26.0.0で動かなくなるもの(削除)と、警告が出るようになったもの(実行時非推奨)を分けて並べます。削除されたAPIは、そのコードが実行された時点でエラーになります。テストで通らない分岐に残っていれば見逃すため、テストの成否だけでなくソースの検索でも確かめます。

対象 26での扱い 移行先
response.writeHeader() 削除 writeHead()
_stream_wrap等6モジュール 削除 node:stream
--experimental-transform-types 削除 tsc等でトランスパイル
authTagLength未指定の短いGCM認証タグ(DEP0182) 削除 authTagLengthを明示
module.register()(DEP0205) 実行時警告 module.registerHooks()
crypto APIへのCryptoKey渡し(DEP0203) 実行時警告 KeyObject
抽出不可CryptoKeyのKeyObject.from()(DEP0204) 実行時警告 抽出可能な鍵で生成
Duplex.toWeb()のtype(DEP0201) 実行時警告 readableType

削除された_stream_*は_stream_wrap、_stream_readable、_stream_writable、_stream_duplex、_stream_transform、_stream_passthroughの6つで、26.10.0でrequire('_stream_wrap')を実行するとMODULE_NOT_FOUNDになります。自分のコードに無くても古い依存パッケージが読んでいることがあるので、node_modulesをgrep -r "_stream_"で一度確かめておくと安心です。

ほかに、--localstorage-fileを指定しないとlocalStorageがundefinedになる変更と、ML-KEM・ML-DSAの秘密鍵をPKCS#8で書き出すときの既定がシードのみの形式になる変更もsemver-majorとして入っています。

--experimental-transform-types削除とTypeScriptのenum移行

Node.jsはTypeScriptの型注釈を取り除いて実行できますが(型除去)、enumやnamespaceのように実行時のコードを生成する構文は変換が必要で、26でその変換用フラグ--experimental-transform-typesが消えました。

$ node --experimental-transform-types e.ts
node: bad option: --experimental-transform-types

$ node e.ts   # e.ts の中身: enum E {A}; console.log(E.A)
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode

型注釈だけのファイル(const x: number = 1等)はそのまま動きます。enumを使っている場合は、as constを付けたオブジェクトへ書き換えるか、tscなどでJavaScriptに変換してから実行します。TypeScript側の変更点はTypeScript 6.0とは|新機能・5から6への移行手順とGo製7.0対応まで総まとめにまとめています。

module.register()の非推奨化とregisterHooks()への移行

module.register()は別スレッドで非同期に動くカスタマイズフックで、26では同じプロセスで最初に呼び出したときにDEP0205の警告が1回出ます。公式ドキュメント(DEP0205)は、非同期フックはワーカースレッドの調停が複雑で解決できない問題があるとして、同期・同一スレッドで全種類のモジュールに効くmodule.registerHooks()への移行を求めています。

import { registerHooks } from 'node:module';

registerHooks({
  resolve(specifier, context, nextResolve) {
    if (specifier === 'virtual:hello') {
      return { url: 'data:text/javascript,export default "hi"', shortCircuit: true };
    }
    return nextResolve(specifier, context);
  },
});

const m = await import('virtual:hello');
console.log(m.default); // hi

フックが同期になるため、resolveやloadの中でawaitしていたローダーは書き直しが要ります。ESMのモジュール解決の仕組みそのものはNative ESMの基本仕組みとCommonJSとの根本的な違いの整理を参照してください。

26.1.0〜26.10.0で追加された機能

Currentの期間中はマイナーリリースで機能が足されます。26.0.0の発表時点の記事には載っていない追加を、リリースノートの日付順に抜き出しました(セキュリティリリース以外の主なもの)。

版 日付 主な追加
26.1.0 2026-05-07 node:ffi(実験的)、crypto.randomUUIDv7()
26.2.0 2026-05-20 fs.StatsにTemporal.Instant、1xx送信
26.3.0 2026-06-01 permission.drop()
26.4.0 2026-06-24 パッケージマップ、node:vfs(最小実装)
26.5.0 2026-07-08 --experimental-import-text
26.8.0 2026-08-26 zlibのZIP読み書き、AES-GCM-SIV
26.9.0 2026-09-16 node:ffiのフラグ撤廃、node:bench
26.10.0 2026-09-22 util.throttle()/debounce()

node:ffiはJavaScriptから共有ライブラリの関数を直接呼ぶモジュールです。26.1.0では--experimental-ffiが必要でしたが、26.9.0でフラグ無しで読み込めるようになりました(読み込むと実験的機能の警告が出ます)。パーミッションモデル有効時は--allow-ffiが要り、リリースノートは不正なポインタや型の誤りでプロセスがクラッシュしうる「本質的に安全でないAPI」と明記しています。node:benchは26.10.0時点では--experimental-benchの指定が必要です。

26.3.0のリリースノートには、AppleがIntel Macのサポートを縮小していることから、Apple SiliconとIntelの両方で動くmacOSユニバーサルバイナリを26のサポート期間の最後まで配布し続けられない可能性がある、という告知も入りました。Intel Macで26を長く使う予定なら、配布形態の変更を追っておく必要があります。

セキュリティリリースは6月の26.3.1と7月29日の26.5.1の2回で、26.5.1ではHTTP/2とパーミッションモデルのHigh 2件を含む10件のCVEが修正されました。脆弱性情報の追い方はNode.jsの脆弱性とは|影響の確認方法と対応バージョン・アップデート手順で解説しています。

ネイティブアドオンとビルド環境の必須対応

ネイティブアドオンのうち、Node.jsやV8のC++ APIを直接使うものは、ABIの番号NODE_MODULE_VERSIONが合わないと読み込めません。Node-API(N-API)で書かれたアドオンはこの番号に依存しないため、そのまま動きます。26は147で、24の137、25の141から変わっています。

  • アドオンの再ビルド:Node.js固有APIに依存するアドオンは、147向けのプリビルドがある版へ更新するか、npm rebuildでソースからビルドし直す。
  • ソースからビルドする環境:GCCは13.2以上、Python 3.9は非対応、WindowsはWindows SDK 11、AIX・IBM iはPower 9以上が前提になった。
  • Corepackは同梱されない:Node.jsの配布ドキュメントに「Node.js 25.0.0以降は配布しない」とあり、26.10.0のbin/にはnode・npm・npxしかない。pnpmやYarnをCorepackで管理していた環境はnpm install -g corepackで別途入れる。

同梱のnpmは26.0.0の11.12.1から26.10.0では11.19.1になっています。Corepackの入れ方とpackageManagerの固定はcorepackでpnpmを管理する方法|corepack enable・prepareの使い方とNode.js 25の変更が詳しいです。

Node.js 24から26への移行手順

手順は「CIで26を並走 → 警告を例外にして洗い出し → アドオンと外部通信を確認 → 本番切替」の順です。

  1. CIのマトリクスに26を追加する。本番の24を残したまま、26で同じテストを回します。
  2. 非推奨警告をエラーにして走らせる。node --throw-deprecationで起動すると、DEP0205などの警告が例外として投げられ、呼び出し元のスタックが残ります。
  3. ネイティブアドオンを更新・再ビルドする。node -p process.versions.modulesが147であることを確認し、Node.js固有APIに依存するアドオンは147対応版へ更新するかnpm rebuild。
  4. 外部API・プロキシ経由の通信を結合テストで通す。fetchのHTTP/2化で差が出るのはここです。
  5. package.jsonのenginesを更新する。下限は実際に使うAPIとCIで検証した系列に合わせます。Temporalなど26の機能を使うなら"node": ">=26"、使わないライブラリなら"node": ">=22"のように範囲で書き、26を上限で切らないようにします。
# .github/workflows/test.yml
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [22, 24, 26]
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - run: node --throw-deprecation --test

複数の版を手元で切り替える方法は、Volta(ヴォルタ)とは?Node.jsバージョン管理の使い方とメンテ終了・mise移行やNodebrewとは?Node.jsのバージョン管理・インストール・切り替えを入門解説を参照してください。

本番を今すぐ26へ上げるべきでないケース

本番サービスをCurrentのうちに26へ上げる理由は、Temporalやfetchの挙動を先に取り込みたい場合を除けば、ほとんどありません。24は2026年10月20日にMaintenance LTSへ移った後も2028年4月30日までセキュリティ修正が出ます。Current期間はマイナー版ごとに機能が増え、26.9.0のように実験的モジュールの扱いが途中で変わることもあります。本番の切替は10月28日のLTS入り後、少なくとも最初のLTSパッチを待ってからで十分です。

急ぐべきなのは次の2つです。1つは、npmに公開しているライブラリの作者で、利用者が26を使い始める前にCIへ26を入れておく必要があります。もう1つは22系で動かしている本番で、22は2027年4月30日にEOLを迎えます。移行先はサポートが2029年4月30日まで続く26を第一候補とし、依存パッケージやネイティブアドオンが26に未対応なら、2028年4月30日までサポートされる24を選びます。

よくある質問

Node.js 26のリリース日はいつですか?

26.0.0は2026年5月5日にCurrentとしてリリースされました。2026年9月27日時点の26系最新リリースは9月22日の26.10.0です。

Node.js 26はいつLTSになり、いつまでサポートされますか?

2026年10月28日にActive LTSへ移り、2027年10月20日からMaintenance LTS、2029年4月30日にEOLです。コードネームは予定名簿で「Lithium」です。

今のNode.jsのLTSはどれですか?

2026年9月27日時点のActive LTSは24.x(Krypton)、Maintenance LTSは22.x(Jod)です。10月28日以降は26.xがActive LTSになり、24.xはMaintenance LTSになります。LTSの考え方とlts/*の扱いはNode.js LTSの解説記事を参照してください。

@types/node 26はありますか?

あります。26.0.0は2026年6月19日に公開され、9月27日時点のlatestは26.6.3です。npm install -D @types/node@26で入ります。Temporalの型は@types/nodeではなく、tsconfigのlibにesnextを指定すると有効になります。

Node.js 26でCorepackは使えますか?

同梱されていないので、そのままではcorepackコマンドはありません。Node.js 25.0.0から配布物に含まれなくなりました。npm install -g corepackで入れれば、corepack enableなどは従来どおり使えます。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 5 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.09.28 テックブログ タイムズカーの不正アクセスと約660万件の流出|免許証画像を退会者まで残さない保管設計
  2. 2026.09.25 コラム 最低賃金引き上げ【令和8年度】47都道府県の改定額・発効日と企業の対応手順
  3. 2026.09.25 コラム 障害者雇用の助成金一覧:月いくら・支給要件と申請書類を勤怠データで揃える方法
  4. 2026.09.28 テックブログ anthropic skillsとは?公式19スキルの中身とClaude Code・APIでの導入手順
  5. 2026.09.05 コラム 犯罪収益移転防止法の本人確認:2027年4月の対面IC読み取り義務化と改修要件

RELATED POSTS 関連記事

目次