Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Pages から Workers へ移行する

最終更新 Markdown で表示Agent セットアップ

Cloudflare Workers では、フロントエンドの静的アセットとバックエンド API、サーバーサイドレンダリング(SSR)を含むフルスタックアプリケーションをデプロイできます。

Pages と同様に、Workers 上の静的アセットへのリクエストは無料です。Pages Functions の呼び出しは Workers と同じ料金なので、同程度のコスト構成 になります。

Pages と異なり、Workers は使える機能の幅がはっきり広くなります(Durable Objects、Cron Triggers、より充実したオブザーバビリティなど)。一覧は このページの末尾 にあります。

移行

Cloudflare Pages から Cloudflare Workers への移行は、多くの場合シンプルです。プロジェクトの移行でよく行う手順は次のとおりです。

フレームワーク

Pages プロジェクトが よく使われるフレームワーク を使っている場合、ほとんどのフレームワークには Cloudflare Workers 向けのアダプターがあります。Pages 専用のアダプターを Workers 向けに差し替え、各アダプターの案内に従ってください。

プロジェクト設定

プロジェクトにまだない場合は、プロジェクトのルートに Wrangler 設定ファイルwrangler.jsoncwrangler.json、または wrangler.toml)を作成します。必須フィールドは次の 2 つです。

  • name

    デプロイ先の Worker 名を設定します。既存の Pages プロジェクト名と同じにできます。ただし Workers の名前制限(最大長など)に従う必要があります。

  • compatibility_date.

    すでに Pages Functions を使っていた場合は、そこで設定した日付と同じにします。そうでなければ、現在の日付を設定します。

ビルド出力ディレクトリ

Pages では「ビルド出力ディレクトリ」を設定していました(Wrangler 設定ファイル または Cloudflare ダッシュボード)。Worker プロジェクトでは、代わりに assets.directory を設定します。

以前(Cloudflare Pages):

{
	"name": "my-pages-project",
	"pages_build_output_dir": "./dist/client/"
}
name = "my-pages-project"
pages_build_output_dir = "./dist/client/"

現在(Cloudflare Workers):

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"assets": {
		"directory": "./dist/client/"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"

[assets]
directory = "./dist/client/"

配信動作

Pages は、デプロイしたプロジェクトの種類を自動で判断しようとしていました。404.htmlindex.html の有無を手がかりに、シングルページアプリケーション(SPA) か、カスタム 404 ページを配信するか を推測していました。

Workers では、誤設定を防ぐため、この動作は明示的で、手動で設定する 必要があります。

シングルページアプリケーション(SPA)の場合:

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"assets": {
		"directory": "./dist/client/",
		"not_found_handling": "single-page-application"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"

[assets]
directory = "./dist/client/"
not_found_handling = "single-page-application"

カスタム 404 ページの場合:

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"assets": {
		"directory": "./dist/client/",
		"not_found_handling": "404-page"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"

[assets]
directory = "./dist/client/"
not_found_handling = "404-page"
アセットを無視する

Pages は、node_modules.DS_Store.git など一部のファイルとフォルダーを静的アセットとしてアップロードしないようにしていました。Workers でもこれらのファイルをアップロードしたくない場合は、プロジェクトの静的アセットディレクトリに .assetsignore ファイル を作成します。

dist/client/.assetsignoretxt
**/node_modules
**/.DS_Store
**/.git

Pages Functions

フルスタックフレームワーク

Pages Functions で動くフルスタックフレームワークを使っている場合は、フレームワーク を Pages ではなく Workers 向けに更新してください。

「advanced mode」の _worker.js ファイルを使う Pages Functions

"advanced mode" の _worker.js ファイル を使う Pages Functions の場合は、まずこのスクリプトが静的アセットとしてアップロードされないようにします。_worker.js を静的アセットディレクトリの外へ移す(推奨)か、静的アセットディレクトリに .assetsignore ファイル を作成して _worker.js を含めます。

dist/client/.assetsignoretxt
_worker.js

次に、設定ファイルの main フィールドを、この Worker スクリプトの場所に向けます。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./dist/client/_worker.js", // or some other location if you moved the script out of the static asset directory
	"assets": {
		"directory": "./dist/client/"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./dist/client/_worker.js"

[assets]
directory = "./dist/client/"
functions/ フォルダーを使う Pages Functions

フォルダーの functions/ を使う Pages Functions の場合は、まず wrangler pages functions build コマンドで、これらの関数を 1 つの Worker スクリプトにコンパイルします。

npx wrangler pages functions build --outdir=./dist/worker/

このコマンドはいつでも実行できますが、ファイルベースのルーティングを続けたい場合は、別のフレームワークの利用を検討してください。HonoX はよく使われる選択肢の 1 つです。

Worker スクリプトをコンパイルしたら、設定ファイルの main フィールドを、ビルド先の場所に向けます。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./dist/worker/index.js",
	"assets": {
		"directory": "./dist/client/"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./dist/worker/index.js"

[assets]
directory = "./dist/client/"
_routes.json と Pages Functions のミドルウェア

Pages プロジェクトで _routes.json ファイル を書いた場合、または Pages Functions で ミドルウェア を使っていた場合は、Worker スクリプトの設定に注意してください。Pages はデフォルトで静的アセットより先に Pages Functions を配信し、_routes.json と Pages Functions のミドルウェアでこの動作をカスタマイズできました。

一方 Workers は、assets.run_worker_first を設定しない限り、Worker スクリプトより先に静的アセットを配信します。静的アセットを配信する前に認証チェックやリクエストのログを行う場合などには、このオプションが必要です。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./dist/worker/index.js",
	"assets": {
		"directory": "./dist/client/",
		"run_worker_first": true
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./dist/worker/index.js"

[assets]
directory = "./dist/client/"
run_worker_first = true
ゼロから始める

希望すれば、新しい Worker スクリプトをゼロから書き、Wrangler と最新ランタイムの機能(例: WorkerEntrypointTypeScript 対応バンドル など)を活かせます。

./worker/index.jsjs
import { WorkerEntrypoint } from "cloudflare:workers";

export default class extends WorkerEntrypoint {
	async fetch(request) {
		return new Response("Hello, world!");
	}
}
./worker/index.tsts
import { WorkerEntrypoint } from "cloudflare:workers";

export default class extends WorkerEntrypoint {
	async fetch(request: Request) {
		return new Response("Hello, world!");
	}
}
{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./worker/index.ts",
	"assets": {
		"directory": "./dist/client/"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./worker/index.ts"

[assets]
directory = "./dist/client/"

Assets バインディング

Pages は、Pages Functions から静的アセットへアクセスするための ASSETS バインディング を自動で提供していました。Workers では、このバインディング名はカスタマイズでき、手動で設定する必要があります。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./worker/index.ts",
	"assets": {
		"directory": "./dist/client/",
		"binding": "ASSETS"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./worker/index.ts"

[assets]
directory = "./dist/client/"
binding = "ASSETS"

ランタイム

Pages プロジェクトで 配置 をカスタマイズしていた場合、または compatibility datecompatibility flags を設定していた場合は、Wrangler 設定ファイルで同じ内容を定義できます。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"compatibility_flags": ["nodejs_compat"],
	"main": "./worker/index.ts",
	"placement": {
		"mode": "smart"
	},
	"assets": {
		"directory": "./dist/client/",
		"binding": "ASSETS"
	}
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
compatibility_flags = [ "nodejs_compat" ]
main = "./worker/index.ts"

[placement]
mode = "smart"

[assets]
directory = "./dist/client/"
binding = "ASSETS"

変数、シークレット、バインディング

変数バインディングWrangler 設定ファイル で設定でき、Worker の環境(env)から使えます。シークレット は Wrangler でアップロードするか、Cloudflare ダッシュボードで 本番用 に定義し、ローカル開発では .dev.vars を使います。

Workers Builds を使っている 場合は、ビルド環境に関連する変数もそこで設定 してください。Pages と異なり、Workers はランタイム変数とビルド時変数を同じセットでは共有しません。

Wrangler コマンド

以前は wrangler pages devwrangler pages deploy を使っていました。代わりに wrangler devwrangler deploy を使います。加えて、Vite ベースのフレームワークを使っている場合は、新しい Vite plugin で開発体験をさらにシンプルにできることがあります。

ビルド

Pages 組み込みの CI/CD を使っている場合は、まず リポジトリを Workers Builds に接続 し、次に Pages プロジェクトの自動デプロイを無効化 して、Workers Builds に切り替えられます。

プレビュー環境

Pages はプロジェクトごとにプレビュー環境を自動作成し、独立して設定できます。

Workers で近い体験を得るには、次を行います。

  1. プレビュー URL が有効であることを確認します(デフォルトでオンです)。

    {
    	"name": "my-worker",
    	// Set this to today's date
    	"compatibility_date": "2026-09-20",
    	"main": "./worker/index.ts",
    	"assets": {
    		"directory": "./dist/client/"
    	},
    	"preview_urls": true
    }
    name = "my-worker"
    # Set this to today's date
    compatibility_date = "2026-09-20"
    main = "./worker/index.ts"
    preview_urls = true
    
    [assets]
    directory = "./dist/client/"
  2. Workers Builds で 非本番ブランチのビルドを有効 にします。

任意で、これらのプレビュー URL を Cloudflare Access で保護 することもできます。

ヘッダーとリダイレクト

_headers_redirects ファイルは、静的アセット付きの Workers でネイティブに使えます。Pages と同様に、これらのファイルをプロジェクトの静的アセットディレクトリに含めてください。

pages.dev

以前は Pages プロジェクトに pages.dev サブドメインが提供されていました。現在は、すべての Worker プロジェクト向けに、個人用の workers.dev サブドメインを設定できます。このサブドメインは Cloudflare ダッシュボードで設定 でき、設定ファイルの workers_dev オプション で利用を選択できます。

{
	"name": "my-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"main": "./worker/index.ts",
	"workers_dev": true
}
name = "my-worker"
# Set this to today's date
compatibility_date = "2026-09-20"
main = "./worker/index.ts"
workers_dev = true

カスタムドメイン

ドメインのネームサーバーが Cloudflare 管理なら、Pages と同様に Worker へ カスタムドメイン を設定できます。一部のパスだけを Worker で配信したい場合は、ルート も設定できます。

ロールアウト

Worker の動作を確認し、開発ワークフローに納得し、本番トラフィックをすべて移行したら、Cloudflare ダッシュボードまたは Wrangler で Pages プロジェクトを削除できます。

npx wrangler pages project delete

AI コーディングアシスタントでプロジェクトを移行する

好みのコーディングアシスタント(例: Claude Code、Cursor)に、次の 実験的なプロンプト を追加すると、プロジェクトを Workers 向けにできます。

https://developers.cloudflare.com/workers/prompts/pages-to-workers.txt

コーディングアシスタントで Cloudflare ドキュメントの MCP server を使うと、Workers での構築時に LLM へよりよいコンテキストを渡せます。Pages から Workers への移行を依頼すると、このプロンプトが含まれます。

互換性マトリクス

この互換性マトリクスは、Workers と Pages の機能を比較します。以下に特記がない限り、Pages で動くものは Workers でも動き、Workers で動くものは Pages でも動きます。この一覧に不足があると思ったら、プルリクエストを開くGitHub issue を作成 してください。

凡例
✅: 対応
⏳: 近日対応
🟡: 非対応(回避策あり)
❌: 非対応

Workers Pages
コードの作成、テスト、デプロイ
Cloudflare Vite plugin
ロールバック
段階的デプロイ
プレビュー URL
テストツール
ローカル開発
リモート開発(--remote
ダッシュボードの Quick Editor
静的アセット
Early Hints 🟡 1
静的アセットのカスタム HTTP ヘッダー
ミドルウェア 2
リダイレクト
Smart Placement
パス上でアセットを配信する
オブザーバビリティ
Workers Logs
Logpush
Tail Workers
リアルタイムログ
ソースマップ
Runtime APIs とコンピューティングモデル
Node.js Compatibility Mode
Durable Objects 🟡 3
Cron Triggers
バインディング
AI
Analytics Engine
Assets
Browser Run
D1
Email Workers
環境変数
Hyperdrive
Image Resizing
KV
mTLS
Queue Producers
Queue Consumers
R2
レート制限
シークレット
Service bindings
Vectorize
ビルド(CI/CD)
モノレポ
ビルドのウォッチパス
ビルドキャッシュ
デプロイフック
ブランチデプロイ制御 🟡 4
カスタムブランチエイリアス
Pages Functions
ファイルベースルーティング 🟡 5
Pages Plugins 🟡 6
ドメイン設定
カスタムドメイン
カスタムサブドメイン
Cloudflare ゾーン外のカスタムドメイン
パス指定のルート

Footnotes

  1. ゾーン設定がオンなら、Workers でも Early Hints を使えます。Worker は適切な Link ヘッダーを送る必要があります。詳細は 103 Early Hints の例を参照してください。

  2. ミドルウェアは run_worker_first オプションで設定できますが、通常の Worker 呼び出しとして課金されます。関連する追加オプションは今後検討する予定です。

  3. Cloudflare Pages プロジェクトで Durable Objects を使う には、Durable Object を持つ別の Worker を作成し、本番環境とプレビュー環境の両方でバインディングを宣言する必要があります。Workers で Durable Objects を使う方がシンプルなので、そちらを推奨します。

  4. Workers Builds は 非本番ブランチのビルド を有効にできますが、Pages ほどの設定の細かさはまだありません。

  5. Workers は よく使われるフレームワーク に対応しており、その多くがファイルベースルーティングを実装しています。加えて、Wrangler で functions/ フォルダーをコンパイル して Worker にすると、Pages から Workers への移行が楽になります。

  6. 5 と同様に、Wrangler は Pages Functions を Worker にコンパイル できます。ゼロから始める場合、Pages Functions でできることは、Worker にコードを足すか、関連するサードパーティツール向けのフレームワーク固有プラグインを使うことでも実現できます。

役に立ちましたか?