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

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

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

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年10月14日時点の26系最新リリース26.11.1を基準に、日程、24との違い、新機能、削除されたAPI、AWS LambdaやDockerでの対応状況、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で接続する。26.11.0でnode:sqliteのクラス名がDatabaseに変わり、テストの止まらない原因を表示する--process-timeoutが入った。
  • 壊れる箇所:response.writeHeader()と_stream_*モジュールが削除、--experimental-transform-typesが削除、module.register()は実行時警告。Node.js固有のABIに依存するネイティブアドオンは、147向けのビルドへの更新か再ビルドが要る(NODE_MODULE_VERSION 147)。
  • 実行環境:AWS Lambdaのnodejs26.xは2026年8月25日からのパブリックプレビューで、本番には使えない。Docker公式イメージには26.11.1のタグがある。
  • 本番の移行時期:Node.js 24は2028年4月30日までサポートされるので、本番はLTS入り後に上げれば十分です。ライブラリはCIに26を今すぐ加えます。

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

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

系列 状態(10月14日時点) 初回リリース 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

10月20日に24系がMaintenance LTSへ移り、8日後の28日に26系がActive LTSになります。LTS入りの時点でコードネームが付き、予定名の一覧(nodejs/ReleaseのCODENAMES.md)では26.xは「Lithium」です(schedule.jsonのcodenameは10月14日時点でまだ空欄)。バージョン管理ツールのlts/*は最新のLTSを指す可変の別名で、10月28日に26系がLTSになった後、ツールがリリース情報を取り直した時点で解決先が24系から26系へ変わります。nvmはnodejs.orgに接続したときにローカルのLTS別名を作り直す仕組みで、日付が来ただけでインストール済みのNode.jsが切り替わるわけではありません。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日でした。

Node.js 24と26の違い(比較表)

両系列の最新版(24.21.0と26.11.1)をnodejs.orgの公式配布バイナリで起動し、process.versionsなどで取った値です。

項目 Node.js 24.21.0 Node.js 26.11.1
V8(process.versions.v8) 13.6.233.17-node.53 14.6.202.34-node.37
Undici(fetchの実装) 7.29.1 8.11.2
fetchが使うHTTP 1.1 2.0(相手が対応していれば)
Temporal 無し(undefined) 既定で有効
NODE_MODULE_VERSION 137 147
同梱npm 11.19.0 11.20.0
--process-timeout bad option 使える
EOL 2028-04-30 2029-04-30

サポート期間の差は1年です。22系(EOL 2027年4月30日)から上げる場合は、どちらへ移っても削除されたAPIとアドオンの再ビルドへの対応が要るので、移行作業を1回で済ませたいなら26を選ぶ方が得です。24から26への差分は以下の各章で順に扱います。

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.11.1で実行した結果です。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.11.1  → 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が公開され、10月14日時点のlatestは26.6.5(10月9日公開)です。

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

V8 14.6で追加されたMapの値挿入とIteratorの連結

V8は26.0.0で14.6.202.33(Chromium 146相当)に上がり、26.11.1では14.6.202.34です。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.11.1で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.11.1では8.11.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.11.1 8.11.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オプションに渡します。

import { Agent } from 'undici';

const dispatcher = new Agent({ allowH2: false });
const res = await fetch('https://api.example.com/', { dispatcher });
await res.body?.cancel();
await dispatcher.close();

本文を読まない通信は例のようにcancel()で捨て、使い終わったAgentはclose()で閉じます(Undiciは接続の解放をガベージコレクション任せにしないよう求めています)。26.11.1とundici 8.11.2の組み合わせで、上と同じサーバーが受けたバージョンが1.1に戻ることを確かめています。

削除・非推奨になった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
sqlite.DatabaseSync(DEP0210・26.11.0) 文書上の非推奨 sqlite.Database
sqlite.StatementSync(DEP0211・26.11.0) 文書上の非推奨 sqlite.Statement

削除された_stream_*は_stream_wrap、_stream_readable、_stream_writable、_stream_duplex、_stream_transform、_stream_passthroughの6つで、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.11.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()
26.11.0 2026-10-07 sqliteのクラス改名、--process-timeout

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

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

セキュリティリリースは10月14日時点で6月18日の26.3.1と7月29日の26.5.1の2回で、26.5.1ではHTTP/2とパーミッションモデルのHigh 2件を含む10件のCVEが修正されました。26.11.1は26.11.0と同じ10月7日に出た修正版で、中身はドキュメント生成の変更の差し戻しだけです。脆弱性情報の追い方はNode.jsの脆弱性とは|影響の確認方法と対応バージョン・アップデート手順で解説しています。

node:sqliteのDatabaseSync→Database改名(26.11.0)

26.11.0でnode:sqliteのDatabaseSyncがDatabaseに、StatementSyncがStatementに改名されました。旧名は同じクラスを指す別名として残り、非推奨はドキュメント上だけ(DEP0210・DEP0211)なので、旧名のコードも警告なしで動きます。

import { Database, DatabaseSync } from 'node:sqlite';

console.log(DatabaseSync === Database); // true

const db = new Database(':memory:');
db.exec('CREATE TABLE t(id INTEGER PRIMARY KEY, name TEXT)');
db.prepare('INSERT INTO t(name) VALUES (?)').run('a');
console.log(db.prepare('SELECT count(*) AS n FROM t').get());
// [Object: null prototype] { n: 1 }

注意点は、新しい名前が24系に無いことです。24.21.0でrequire('node:sqlite').Databaseはundefinedでした。24と26の両方で動かすライブラリは、24のサポートが続くあいだ旧名のDatabaseSyncを使い続ける方が安全です。

–process-timeoutによるCIの終了待ち原因の調査(26.11.0)

--process-timeoutは、指定した時間が過ぎてもプロセスが終わらないときに終了コード124で終了させ、その時点でイベントループを生かしているリソースを標準エラーに出すオプションです。タイマーやソケットの閉じ忘れでテストが終わらず、CIのジョブがタイムアウトまで止まる場面で、原因の特定に使えます。

$ node --process-timeout=1s -e "setInterval(() => {}, 1000)"
(node:66137) Process timed out after 1s (--process-timeout). Exiting with code 124.
Main thread was not executing JavaScript.
Resources keeping the event loop alive:
    Timeout (next due in 941ms)
$ echo $?
124

時間はms・s・m・hの単位付きで書きます。単位を省いた--process-timeout=1は「invalid value」で起動しません。公式のCLIドキュメントは安定度を1.1(活発に開発中)としており、NODE_OPTIONSには書けず、--inspectなどデバッガを有効にするオプションとも併用できません。24.21.0ではbad optionになります。

同じ26.11.0では、process.ref()とprocess.unref()が安定版になり、文字列に変換したときの長さをデコードせずに返すBuffer.stringLength()、ヘッダー名と値を検査するhttp.isValidHeaderName()・http.isValidHeaderValue()も加わりました。Buffer.stringLength()が受け取るのはBufferやTypedArrayで、文字列を渡すとERR_INVALID_ARG_TYPEになります。文字列のバイト数を測るのは従来どおりBuffer.byteLength()です。

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

ネイティブアドオンのうち、Node.jsやV8のC++ APIを直接使うものは、ABIの番号NODE_MODULE_VERSIONが合わないと読み込めません。Node-API(N-API)だけを使うアドオンは、この番号の変更だけを理由とする再ビルドは原則不要です。ただし、併用する外部ライブラリのABIや実行環境の互換性は別途確認が必要です。26は147で、24の137、25の141から変わっています。

  • アドオンの再ビルド:Node.js固有APIに依存するアドオンは、147向けのプリビルドがある版へ更新するか、npm rebuildでソースからビルドし直す。
  • ソースからビルドする環境:GCCを使う場合は13.2以上が必要で、Python 3.9は非対応、WindowsではWindows 11 SDK、AIX・IBM iではPower 9以上が前提になった。Temporalを有効にしてNode.js本体をビルドする場合は、rustc 1.86以上(LLVM 19以上)とcargo 1.86以上も要る(見つからなければ警告を出してTemporal無しでビルドされる)。
  • Corepackは同梱されない:Node.jsの配布ドキュメントに「Node.js 25.0.0以降は配布しない」とあり、26.11.1のbin/にはnode・npm・npxしかない。pnpmやYarnをCorepackで管理していた環境はnpm install -g corepackで別途入れる。

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

AWS Lambda・Docker・GitHub ActionsでのNode.js 26の対応状況

AWS Lambdaのnodejs26.xはパブリックプレビュー

AWSは2026年8月25日のWhat’s Newで、Lambdaのマネージドランタイムに「パブリックプレビュー」の段階を設け、その最初としてNode.js 26とPython 3.15を公開しました。ランタイム識別子はnodejs26.xで、OSはAmazon Linux 2023です。

  • プレビュー中は破壊的な変更が入りうるため、Lambda SLAとAWSのテクニカルサポートの対象外で、本番ワークロードには使わないよう案内されている。
  • 一般提供(GA)になっても識別子はnodejs26.xのままで、プレビュー中に作った関数はそのままGAへ移る。
  • ランタイムの一覧では、nodejs26.xの廃止日は未定、nodejs24.xは2028年4月30日に廃止(関数の新規作成は6月1日、更新は7月1日から不可)。

10月14日時点でGAの告知は出ていません。本番のLambdaはnodejs24.xのままにして、検証用の関数でnodejs26.xを試し、GAの告知を待って切り替えます。Lambdaの仕組みや料金の考え方はAWS Lambdaとは?仕組み・料金体系とコールドスタート対策・採用判断を実装者目線で解説で扱っています。

Docker公式イメージとAlpineのサポート区分

Docker Hubの公式イメージnodeには、26.11.1-trixie-slimや26.11.1-alpine3.23などのタグが10月8〜9日に公開されています。node:26のように系列だけを書くと、パッチ版が出るたびに中身が変わります。

Alpineで使う場合は、26.11.0でx64のmusl環境(musl 1.2.5以上、カーネル6.12以上。例としてAlpine 3.22)がサポート区分のTier 2に上がったことを押さえておきます(26.11.1のBUILDING.md)。同ファイルの定義では、Tier 2もTier 1と同じくテストの失敗がリリースを止める区分ですが、利用者の少ない環境とされ、基盤の問題でバイナリの公開が遅れることがあると書かれています。musl向けのプリビルドを配っていないネイティブアドオンはAlpineではソースからのビルドになるので、アドオンを使うならglibcのtrixie-slimやbookworm-slimを選ぶ方が手間がかかりません。

GitHub Actionsではactions/setup-nodeのnode-versionに26を書けば入ります。入力項目やキャッシュの設定はactions/setup-nodeとは|v7の入力・キャッシュ設定とv5以降の既定変更にまとめています。

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のnode:ffiや26.11.0のnode:sqliteのように、途中でフラグや名前が変わることもあります。本番の切替は10月28日のLTS入り後、少なくとも最初のLTSパッチを待ってからで十分です。Denoからの移行先としてNode.js 26とBunを比べた判断はDeno・Bun・Node.jsの比較と移行コードで扱っています。AWS Lambdaで動かすサービスは、それに加えてnodejs26.xのGAを待ちます。

急ぐべきなのは次の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年10月14日時点の26系最新リリースは10月7日の26.11.1です。

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

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

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

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

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

あります。26.0.0は2026年6月19日に公開され、10月14日時点のlatestは26.6.5です。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などは従来どおり使えます。

関連記事

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

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

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

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

資料請求

RELATED POSTS 関連記事

目次