テック技報最新号へ →
インフラ

Workers: 互換日付 2026-11-17 から request.signal と新モジュールレジストリが既定でオンになる

互換日付(compatibility_date)を 2026-11-17 以降に上げた Worker では、クライアント切断を request.signal で受け取れるようになり、JavaScript のモジュール読み込みも新しいレジストリ(require() で ES モジュール、import.meta)に切り替わる。

@CFchangelog · 投稿 2026-11-02
#infra#cloudflare#workers#compatibility-date#abortsignal#esm#nodejs-compat

どんなときに関係する?

既存の Worker は互換日付かフラグを変えるまで今の動きのまま。影響が出るのは「互換日付を上げたとき」なので、wrangler.jsonc の日付を機械的に更新している運用(Renovate やテンプレートの更新など)では、上げる前に下の 2 点を確認しておく。

1. request.signal でクライアント切断を拾う

切断されたらログを出す、後片付けをする、AbortSignal を受け取る処理(fetch など)を止める、といった使い方ができる。遅いオリジンへの中継で、客が帰ったあとも上流に待ち続ける無駄を減らせる。

ts
export default {
  async fetch(request): Promise<Response> {
    request.signal.addEventListener("abort", () => {
      console.log("Client disconnected");
    }, { once: true });

    // 上流への fetch にも signal を渡すと、切断時に一緒に止まる
    return fetch("https://example.com/slow-response", { signal: request.signal });
  },
} satisfies ExportedHandler;
  • 11/17 より前に試すなら、今の日付のまま compatibility_flags に enable_request_signal を足す。
  • 日付を上げたうえで無効にしたいなら disable_request_signal。
  • request_signal_passthrough は有効にならない。上流へ伝えたいときは上の例のように signal を明示的に渡す。

2. 新しいモジュールレジストリ

URL ベースのモジュール解決になり、JavaScript 標準と Node.js との互換性が上がる(Python Workers は旧レジストリのまま)。

  • Node.js 互換(nodejs_compat)の Worker では、require() で ES モジュールを読める。ただし読むモジュールとその依存が トップレベル await を使っていると失敗する。
  • import.meta.url(今のモジュールの URL)、import.meta.main(エントリポイントかどうか)、import.meta.resolve("./helper.js")(読み込まずに URL だけ求める。存在確認もしない)が使える。バンドラーが import.meta を書き換えることがあるので、素の挙動を確かめるならバンドルなし(unbundled)でデプロイする。
  • 不正な import attributes(with { type: ... } など)を拒否するようになる。依存ライブラリに古い書き方が残っていないか確認する。
  • 先に試すなら new_module_registry フラグ。日付を上げても旧レジストリに留まるなら legacy_module_registry。

上げる前のチェックリスト

  1. 検証環境で enable_request_signal と new_module_registry をフラグで先に入れてデプロイし、動作を見る。
  2. 依存に require() 経由でトップレベル await を含むものがないか、不正な import attributes がないかを確認。
  3. 問題なければ互換日付を 2026-11-17 以降に上げてフラグを外す。駄目なら disable_request_signal / legacy_module_registry で個別に戻す。

関連

出典

X の元の投稿を開く