フロントエンド、バックエンド、データベースが1つのCloudflare Workerに
2025-04-08
静的サイトやフルスタックアプリケーションをCloudflare Workersでデプロイできるようになりました。React Router v7、Astro、VueなどのフレームワークサポートとCloudflare Viteプラグインは、本日一般公開となります。 ...
\n
\n以前は、Cloudflare Pagesで構築するかWorkersで構築するか(あるいは、アプリの一部にPagesを使用し、別の部分にはWorkersするか)をはじめに選択する必要がありました。これは、アプリに何が必要かを最初から理解し、プロジェクトが進化しても間違ったプラットフォームやアーキテクチャに縛られる事態にならないことを願うということです。Workersは柔軟なプラットフォームであるように設計されており、開発者が必要に応じてプロジェクトを進化させられるようになっています。そこで当社は、数年にわたってPagesの諸機能をWorkersに取り込む作業に取り組んできました。
Workersが静的アセットの配信とサーバーサイドレンダリングの両方をサポートするようになったので、Workersから始めるのがよいでしょう。Cloudflare Pagesは引き続きサポートしますが、今後の投資、最適化、機能開発の作業はすべてWorkersの改善に向けられます。当社は、Pagesでうまくいった点や改善点について皆様からいただいたフィードバックを基に、Workersを最高のフルスタックアプリ構築プラットフォームにすることを目指しています。
以前は、Pagesでアプリを構築する際、こだわりがうかがえるオンランプが本当に使いやすかったのですが、アプリケーションが複雑になると終いには壁に突き当たるということがよくありました。Durable Objectsで状態を管理したい場合は、そのためにまったく別のWorkerを設定する必要があり、デプロイメントが複雑になって、オーバーヘッドもかさみました。また、リアルタイムログしかなく、変更を一度にロールアウトよりほかありませんでした。
Workersで構築すれば、他のどの開発者プラットフォームサービス(Durable Objects、Email Workersなど)へもすぐにバインドでき、単一のプロジェクトでフロントエンドとバックエンドの両方を管理することができます。すべて一回のデプロイメントで行えます。さらに、Workersの可観測性ツール一式(Workers Logsなど)がプラットフォームに組み込まれています。トラフィックの特定の割合だけに変更をロールアウトしたければ、Gradual Deploymentsでできます。
こうした最新の改善は、Pagesの優れた部分をWorkersに取り込むという目標の一部です。例えば、静的な_headersと_redirectsの設定ファイルがサポート対象になったため、Pages(または別のプラットフォーム)から既存プロジェクトをWorkersへ簡単に移動できます。プロジェクトを変更する必要はありません。また、GitHubやGitLabをWorkers Buildsと直接統合し、ビルドとデプロイメントを自動化します。そして本日より、プレビューURLがコメントとしてリポジトリに投稿されるようになりました。機能ブランチのエイリアスと環境は近日公開予定です。
既存のプロジェクトをPagesからWorkersに移行する方法については、移行ガイドをご覧ください。
次に、Workersで異なるレンダリングモードでアプリケーションを構築する方法についてお話します。
\nまずはじめに、Workersでサポートされているすべてのアーキテクチャとレンダリングモードを簡単に説明します:
静的サイト:静的サイトにアクセスすると、サーバーは事前に構築された静的アセット(HTML、CSS、JavaScript、画像、フォントなど)をすぐに返します。リクエスト時にサーバーで動的レンダリングが行われることはありません。静的アセットは通常ビルド時に生成され、CDNから直接配信されるため、静的サイトは高速で簡単にキャッシュ可能になります。このアプローチは、コンテンツの変更がほとんどないサイトに適しています。
シングルページアプリケーション(SPA):SPAを読み込むと、サーバーは最初に最小限のHTMLシェルとJavaScriptバンドル(静的アセットとして配信)を送信します。ブラウザがこのJavaScriptをダウンロードし、続いてユーザーインターフェース全体をクライアントサイドでレンダリングします。最初の読み込みの後は、すべてのナビゲーションが通常クライアントサイドルーティングで、ページ全体を更新することなく行われます。これにより、高速でアプリのような使用感が実現します。
サーバーサイドレンダリング(SSR)アプリケーション:SSRを使っているサイトを初めて訪問した時に、サーバーはそのリクエストに応じてフルレンダリングのHTMLページをオンデマンドで生成します。ブラウザはこの完全なHTMLを即座に表示するため、最初のページの読み込みが速くなります。読み込みが終わると、JavaScriptがページの「ハイドレーション」を行い、インタラクティブ性を付与します。その後のナビゲーションは、新しいサーバーレンダリングページをトリガーするか、多くの最新フレームワークではSPAに似たクライアントサイドレンダリングに移行します。
次に、Workersでこの種のアプリケーションを構築する方法について掘り下げます。まず開発環境の準備から説明します。
\nアプリケーションをアップロードする前に、クライアントサイドのコードをすべて静的アセットのディレクトリにバンドルする必要があります。wrangler dev
を実行するとWranglerがコードをバンドルしてビルドしますが、今は新しいViteプラグインでViteもサポートされています。Viteプラグインは、既にViteのビルドツールと開発サーバーを使用している方に最適なオプションです。Viteの開発サーバーを使用して、引き続き開発(およびVitestによるテスト)を行うことができます。すべてWorkersランタイムを使用します。
Cloudflare Viteプラグインの使用を開始する際は、以下の実行により、Viteと当社のプラグインを使用してReactアプリケーションをスキャフォールディングします。
\nnpm create cloudflare@latest my-react-app -- --framework=react
\n プロジェクトを開くと、次のようなディレクトリ構造が表示されるはずです:
\n...\n├── api\n│ └── index.ts\n├── public\n│ └── ...\n├── src\n│ └── ...\n...\n├── index.html\n├── package.json\n├── vite.config.ts\n└── wrangler.jsonc
\n npm run build
を実行すると、/dist
という名前の新しいフォルダが表示されます。
...\n├── api\n│ └── index.ts\n├── dist\n│ └── ...\n├── public\n│ └── ...\n├── src\n│ └── ...\n...\n├── index.html\n├── package.json\n├── vite.config.ts\n└── wrangler.jsonc
\n Viteプラグインは、そのプロジェクトでビルドされた静的アセット(この場合はクライアントサイドコード、いくつかのCSSファイル、画像など)がこの/dist
ディレクトリに含まれていることを、Wranglerに知らせます。
このシングルページアプリケーション(SPA)アーキテクチャは、デプロイすると以下のようになります:
\nリクエストが来ると、Cloudflareはパス名を見て、そのパス名に一致する静的アセットを自動的に配信します。例えば、静的アセットディレクトリにblog.html
ファイルが含まれていれば、example.com/blog
のリクエストはそのファイルを取得します。
Astroのような静的サイトジェネレーター(SSG)で作成された静的サイトがある場合、必要なのはwrangler.jsonc
ファイル(またはwrangler.toml
)を作成して、構築したアセットがどこにあるかをCloudflareに知らせることだけです:
// wrangler.jsonc \n\n{\n "name": "my-static-site",\n "compatibility_date": "2025-04-01",\n "assets": {\n "directory": "./dist",\n }\n}
\n その設定を追加したら、あとはプロジェクトを構築してwrangler deployを実行するだけです。そうするとサイト全体がアップロードされ、Workers上でトラフィックを処理する準備が整います。デプロイして、リクエストが入り始めると、静的サイトはCloudflareのネットワーク全体にキャッシュされます。
\n以下を実行することで、Workersで新しいAstroプロジェクトを今すぐ始めることができます:
\nnpm create cloudflare@latest my-astro-app -- --framework=astro
\n サポートされている他のフレームワークと使用開始方法については、フレームワークガイドでご覧いただけます。
\nシングルページアプリケーションの場合は、Wranglerの設定でシングルページアプリケーション
モードを明示的に有効化します:
{\n "name": "example-spa-worker-hyperdrive",\n "main": "api/index.js",\n "compatibility_flags": ["nodejs_compat"],\n "compatibility_date": "2025-04-01",\n },\n "assets": {\n "directory": "./dist",\n "binding": "ASSETS",\n "not_found_handling": "single-page-application"\n },\n "hyperdrive": [\n {\n "binding": "HYPERDRIVE",\n "id": "d9c9cfb2587f44ee9b0730baa692ffec",\n "localConnectionString": "postgresql://myuser:mypassword@localhost:5432/mydatabase"\n }\n ],\n "placement": {\n "mode": "smart"\n }\n}
\n これを有効にすることで、プラットフォームが、ナビゲーションリクエスト(Sec-Fetch-Mode: navigate
ヘッダーを含むリクエスト)はすべて静的アセットを意図したものであると想定し、一致する静的アセットが見つからない時はいつでもindex.html
を返します。静的アセットと一致しない非ナビゲーションリクエスト(データ要求など)の場合は、CloudflareがWorkerスクリプトを呼び出します。このセットアップによって、Reactでフロントエンドをレンダリングし、Workerでバックエンドの操作を処理し、Viteでこの2つをつなぎ合わせることができます。これは、create-react-app
で構築された古いSPA(最近廃止)のポーティングに最適なオプションです。
このWrangler設定ファイルに関してもう一つ注記すべき点は、Hyperdriveバインディングを定義してSmart Placementを有効にしていることです。Hyperdriveは既存のデータベースの使用を可能にし、接続プーリングを処理します。これで、Workers(高度に分散されたサーバーレス環境で稼働)を従来型のデータベースに直接接続するという長年の課題が解決します。設計上、Workersは軽量のV8 Isolateで動作します。永続的なTCPソケットはなく、CPU/メモリには厳しい制限があります。この分離はセキュリティと速度の面ではいいのですが、データベース接続をオープンな状態に保持することが困難になります。Hyperdriveは、Cloudflareのネットワークとお客様のデータベースの間の「橋」として機能し、こういった制約に対処しています。安定した接続やプールの維持という重い作業を引き受けて、Workersで再利用できるようにしているのです。また、Smart Placementをオンにすることで、Workerへのリクエストの送信元がデータベースから遠い場合(遠ければ遅延が発生します)は、データベース接続を扱うWorkerとHyperdriveの「ブリッジ」の両方をデータベースの近くへ移すことをCloudflareが選択し、ラウンドトリップタイムを短縮できるようにしています。
このブログで最初に見た「Cloudflareへデプロイ」の例を見てみましょう。api/index.js
で、Hyperdriveを経由してホストデータベースに接続するAPIを(Honoを使用して)定義しました。
import { Hono } from "hono";\nimport postgres from "postgres";\nimport booksRouter from "./routes/books";\nimport bookRelatedRouter from "./routes/book-related";\n\nconst app = new Hono();\n\n// Setup SQL client middleware\napp.use("*", async (c, next) => {\n // Create SQL client\n const sql = postgres(c.env.HYPERDRIVE.connectionString, {\n max: 5,\n fetch_types: false,\n });\n\n c.env.SQL = sql;\n\n // Process the request\n await next();\n\n // Close the SQL connection after the response is sent\n c.executionCtx.waitUntil(sql.end());\n});\n\napp.route("/api/books", booksRouter);\napp.route("/api/books/:id/related", bookRelatedRouter);\n\n\nexport default {\n fetch: app.fetch,\n};
\n デプロイすると、アプリのアーキテクチャは次のようになります:
\nSmart PlacementがWorkerをデータベースの近くに移すると、こんな感じになります:
サーバー上でレンダリングを処理したいなら、当社は多くの一般的な フルスタックフレームワークをサポートしています。
以下は先ほどの例の別バージョンで、React Router v7のサーバーサイドレンダリングを使用しています:
また、Next.jsをOpenNextアダプタやフレームワークガイドに記載されている他のフレームワークで使用することもできます。
\nNode.js APIのサポートも引き続き進めており、最近crypto
、tls
、net
、dns
のモジュールのサポートが追加されています。これにより、これらのNode.jsモジュールに依存する既存のアプリケーションやライブラリを、Workersで実行できるようになりました。例を見てみましょう:
以前は、mongodb
パッケージを使用しようとすると、次のエラーが発生しました:
Error: [unenv] dns.resolveTxt is not implemented yet!
\n この問題は、mongodb
がnode:dns
モジュールを使用してホスト名のDNSルックアップを行った時に発生しました。この問題を回避しても、mongodb
がnode:tls
を使用してデータベースにセキュアに接続しようとした時に、別のエラーが発生したでしょう。
現在、mongodb
は期待通り使えます。node:dns
とnode:tls
がサポートされているからです。node:crypto
とnode:net
に依存するライブラリについても、同じことが言えます。
また、Workersは、process.envオブジェクトの環境変数と機密情報を表示するようになっています。nodejs_compat
互換性フラグがオンになっていて、互換性の日付が2025-04-01
以降に設定されている場合です。一部のライブラリ(および開発者)はこのオブジェクトに変数が入力されることを想定して、それをトップレベルの設定に使っています。微調整せずにいれば、ライブラリが不意に壊れ、開発者はCloudflare Workersで変数を処理するための追加ロジックを作成しなければならなかったかもしれません。
現在は、Node.jsにアクセスするのと同じように変数にアクセスできるようになりました。
\nconst LOG_LEVEL = process.env.LOG_LEVEL || "info";
\n \n WorkerリクエストあたりのCPU時間の上限を引き上げ、30秒から5分にしました。これにより、計算負荷の高い操作をより長い時間、タイムアウトなしで実行できます。例えば、新しくサポートされたnode:crypto
モジュールを使用して非常に大きなファイルをハッシュする場合、CPU負荷の高い操作を外部のコンピューティングに依存せず、Workersで行うことができます。
Workers Buildsも改善しました。GitリポジトリをWorkerに接続できるため、変更をプッシュするたびにビルドとデプロイが自動でできます。Workers BuildsはBuilder Day 2024で発表されましたが、当初はリポジトリを既存のWorkerに接続することしかできませんでした。今では、リポジトリを持ち込んで新しいWorkerとしてすぐにデプロイできるので、プロジェクトの移行に必要なセットアップやボタンクリックの量を減らすことができます。Workers Buildsのビルドの起動遅延を6秒短縮して、パフォーマンスを改善しました。現在は平均10秒以内に起動します。APIの応答性も上がり、Smart Placementのおかげで遅延は7分の1に短縮されています。
注:Builder Day 2024中に発表した通り、2025年4月2日からWorkers Buildsは新しい料金体系モデルに移行しました。Freeプランユーザーのビルド時間は3,000分が上限となり、Workers有料サブスクリプションユーザーには、「6,000分の無料枠が含まれ、それ以降はビルド1分あたり0.005ドル」という新しい従量課金モデルが適用されます。また、同時ビルドのサポート強化として、有料プランに同時ビルド6回を含めました。複数のプロジェクトやMonorepoでの作業が容易になります。料金の詳細はドキュメントでご確認ください。
また、Workers Buildsを非本番ブランチで実行するように設定することもできます。プレビューURLがコメントとしてGitHubに投稿されます。
\n私たちは先週、Imagesのバインディングによって柔軟でプログラマティックな画像最適化のワークフローがどう実現するかについて、ブログ記事を書きました。
これまでは、Workerでfetch()
を呼び出すことで画像最適化機能にアクセスできました。この方法では、オリジナルの画像がURLで取得可能である必要があります。しかし、場合によってはURLからアクセスできない画像もあります。例えば、ユーザーがアップロードした画像を圧縮してからストレージにアップロードしたい場合などです。Imagesのバインディング機能を使うと、画像のボディをバイトストリームとして操作することで、画像を直接最適化できます。
詳しくは、R2にアップロードする前に画像を変換するためのCloudflareガイドをご参照ください。
\n皆さんが何を構築されるのか楽しみです。当社は引き続き、Workersでのアプリケーション作成をより簡単にするための新機能や改善に注力します。そうした取り組みは、コミュニティからのフィードバックを反映してさらに改善されます。皆さんもぜひDiscordに参加して、議論に参加していただければ嬉しいです。
開始するための有用なリソース:
"],"published_at":[0,"2025-04-08T14:05+00:00"],"updated_at":[0,"2025-04-16T15:45:19.780Z"],"feature_image":[0,"https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4XxYGJI8hHbY3GQWzuM2BA/bfad24f662883f169142de42806316b3/Feature_Image.png"],"tags":[1,[[0,{"id":[0,"2xCnBweKwOI3VXdYsGVbMe"],"name":[0,"Developer Week"],"slug":[0,"developer-week"]}],[0,{"id":[0,"4HIPcb68qM0e26fIxyfzwQ"],"name":[0,"開発者"],"slug":[0,"developers"]}],[0,{"id":[0,"7zEmuPybEdq3jhbDEc1fQN"],"name":[0,"フロントエンド"],"slug":[0,"front-end"]}],[0,{"id":[0,"6Irshc0o9CUpLTphYWQ5mH"],"name":[0,"フルスタック"],"slug":[0,"full-stack"]}],[0,{"id":[0,"3E2D6D4cI82KIloPpl0WZW"],"name":[0,"全体的な使いやすさ"],"slug":[0,"general-availability"]}],[0,{"id":[0,"3kr4meEhp1NrKwm01XXeqk"],"name":[0,"Cloudflare Pages"],"slug":[0,"cloudflare-pages"]}],[0,{"id":[0,"6hbkItfupogJP3aRDAq6v8"],"name":[0,"Cloudflare Workers"],"slug":[0,"workers"]}],[0,{"id":[0,"715fxP0LCYITiFP6JZ7rkX"],"name":[0,"MySQL"],"slug":[0,"mysql"]}],[0,{"id":[0,"5EP9xxxSTGvFx3RIxjqIgP"],"name":[0,"Hyperdrive"],"slug":[0,"hyperdrive"]}]]],"relatedTags":[0],"authors":[1,[[0,{"name":[0,"Korinne Alpers"],"slug":[0,"korinne-alpers"],"bio":[0],"profile_image":[0,"https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5cfasTtVaoOsISarcB9F4Z/1686863c1bbd4dc0b74c7229cfcee42c/Korinne_Alpers.jpg"],"location":[0],"website":[0],"twitter":[0],"facebook":[0]}]]],"meta_description":[0,"Cloudflare Workersで静的サイトやフルスタックアプリケーションをデプロイできるようになりました。プリミティブはすべてここにあります。React Router v7、Astro、Vueなどのフレームワークサポートは、Cloudflare Viteプラグインと同様に、本日一般利用可能です。HyperdriveでPostgresデータベースやMySQLデータベースに接続しましょう。"],"primary_author":[0,{}],"localeList":[0,{"name":[0,"LOC: Your frontend, backend, and database — now in one Cloudflare Worker"],"enUS":[0,"English for Locale"],"zhCN":[0,"Translated for Locale"],"zhHansCN":[0,"No Page for Locale"],"zhTW":[0,"Translated for Locale"],"frFR":[0,"Translated for Locale"],"deDE":[0,"Translated for Locale"],"itIT":[0,"No Page for Locale"],"jaJP":[0,"Translated for Locale"],"koKR":[0,"Translated for Locale"],"ptBR":[0,"No Page for Locale"],"esLA":[0,"No Page for Locale"],"esES":[0,"Translated for Locale"],"enAU":[0,"No Page for Locale"],"enCA":[0,"No Page for Locale"],"enIN":[0,"No Page for Locale"],"enGB":[0,"No Page for Locale"],"idID":[0,"No Page for Locale"],"ruRU":[0,"No Page for Locale"],"svSE":[0,"No Page for Locale"],"viVN":[0,"No Page for Locale"],"plPL":[0,"No Page for Locale"],"arAR":[0,"No Page for Locale"],"nlNL":[0,"No Page for Locale"],"thTH":[0,"No Page for Locale"],"trTR":[0,"No Page for Locale"],"heIL":[0,"No Page for Locale"],"lvLV":[0,"No Page for Locale"],"etEE":[0,"No Page for Locale"],"ltLT":[0,"No Page for Locale"]}],"url":[0,"https://blog.cloudflare.com/full-stack-development-on-cloudflare-workers"],"metadata":[0,{"title":[0,"フロントエンド、バックエンド、データベースが1つのCloudflare Workerに"],"description":[0,"Cloudflare Workersで静的サイトやフルスタックアプリケーションをデプロイできるようになりました。プリミティブはすべてここにあります。React Router v7、Astro、Vueなどのフレームワークサポートは、Cloudflare Viteプラグインと同様に、本日一般利用可能です。HyperdriveでPostgresデータベースやMySQLデータベースに接続しましょう。"],"imgPreview":[0,"https://cf-assets.www.cloudflare.com/zkvhlag99gkb/nEHopEC5RW0uFf2J4V05f/225d3e9189bbdcf1610215a0e93ddf78/OG_Share_2024__33_.png"]}]}],"locale":[0,"ja-jp"],"translations":[0,{"posts.by":[0,"リーク元"],"footer.gdpr":[0,"GDPR"],"lang_blurb1":[0,"この投稿は{lang1}でも表示されます。"],"lang_blurb2":[0,"この投稿は{lang1}および{lang2}でも表示されます。"],"lang_blurb3":[0,"この投稿は{lang1}、{lang2}、{lang3}でも表示されます。"],"footer.press":[0,"プレス"],"header.title":[0,"Cloudflare ブログ"],"search.clear":[0,"消去"],"search.filter":[0,"フィルター"],"search.source":[0,"ソース"],"footer.careers":[0,"キャリア"],"footer.company":[0,"会社"],"footer.support":[0,"サポート"],"footer.the_net":[0,"theNet"],"search.filters":[0,"フィルター"],"footer.our_team":[0,"Cloudflareのチーム"],"footer.webinars":[0,"ウェビナー"],"page.more_posts":[0,"その他の投稿"],"posts.time_read":[0,"{time}分で読了"],"search.language":[0,"言語"],"footer.community":[0,"コミュニティ"],"footer.resources":[0,"リソース"],"footer.solutions":[0,"ソリューション"],"footer.trademark":[0,"商標"],"header.subscribe":[0,"登録"],"footer.compliance":[0,"コンプライアンス"],"footer.free_plans":[0,"Freeプラン"],"footer.impact_ESG":[0,"インパクト/ESG"],"posts.follow_on_X":[0,"Xでフォロー"],"footer.help_center":[0,"ヘルプセンター"],"footer.network_map":[0,"ネットワークマップ"],"header.please_wait":[0,"お待ちください"],"page.related_posts":[0,"関連ブログ投稿"],"search.result_stat":[0,"{search_keyword}の結果{search_range}/{search_total}"],"footer.case_studies":[0,"導入事例"],"footer.connect_2024":[0,"Connect 2024"],"footer.terms_of_use":[0,"利用規約"],"footer.white_papers":[0,"ホワイトペーパー"],"footer.cloudflare_tv":[0,"Cloudflare TV"],"footer.community_hub":[0,"コミュニティハブ"],"footer.compare_plans":[0,"プラン比較"],"footer.contact_sales":[0,"営業担当へのお問い合わせ"],"header.contact_sales":[0,"営業担当へのお問い合わせ"],"header.email_address":[0,"メールアドレス"],"page.error.not_found":[0,"ページが見つかりません"],"footer.developer_docs":[0,"開発者ドキュメント"],"footer.privacy_policy":[0,"プライバシーポリシー"],"footer.request_a_demo":[0,"デモ依頼"],"page.continue_reading":[0,"続きを読む"],"footer.analysts_report":[0,"アナリストレポート"],"footer.for_enterprises":[0,"エンタープライズ向け"],"footer.getting_started":[0,"利用開始"],"footer.learning_center":[0,"ラーニングセンター"],"footer.project_galileo":[0,"プロジェクトGalileo"],"pagination.newer_posts":[0,"次の投稿"],"pagination.older_posts":[0,"以前の投稿"],"posts.social_buttons.x":[0,"Xで議論"],"search.icon_aria_label":[0,"検索"],"search.source_location":[0,"ソース/ロケーション"],"footer.about_cloudflare":[0,"Cloudflareについて"],"footer.athenian_project":[0,"Athenianプロジェクト"],"footer.become_a_partner":[0,"パートナープログラム"],"footer.cloudflare_radar":[0,"Cloudflare Radar"],"footer.network_services":[0,"ネットワークサービス"],"footer.trust_and_safety":[0,"信頼性と安全性"],"header.get_started_free":[0,"まずは無料プランから"],"page.search.placeholder":[0,"Cloudflareを検索"],"footer.cloudflare_status":[0,"Cloudflareステータス"],"footer.cookie_preference":[0,"Cookieの設定"],"header.valid_email_error":[0,"有効なメールアドレスを入力してください。"],"search.result_stat_empty":[0,"検索結果 {search_total}件中{search_range}件を表示"],"footer.connectivity_cloud":[0,"コネクティビティクラウド"],"footer.developer_services":[0,"開発者サービス"],"footer.investor_relations":[0,"IR"],"page.not_found.error_code":[0,"エラーコード:404"],"search.autocomplete_title":[0,"クエリを挿入し、Enterキーを押して送信してください"],"footer.logos_and_press_kit":[0,"ロゴとプレスキット"],"footer.application_services":[0,"アプリケーションサービス"],"footer.get_a_recommendation":[0,"推奨製品"],"posts.social_buttons.reddit":[0,"Redditで議論"],"footer.sse_and_sase_services":[0,"SSEサービスとSASEサービス"],"page.not_found.outdated_link":[0,"古いリンクを使われたか、アドレスを誤って入力された可能性があります。"],"footer.report_security_issues":[0,"セキュリティの問題を報告"],"page.error.error_message_page":[0,"お探しのページは見つかりませんでした。"],"header.subscribe_notifications":[0,"新規投稿のお知らせを受信されたい方は、サブスクリプションをご登録ください:"],"footer.cloudflare_for_campaigns":[0,"Cloudflare for Campaigns"],"header.subscription_confimation":[0,"サブスクリプションが確定されました。ご登録ありがとうございます!"],"posts.social_buttons.hackernews":[0,"Hacker Newsでの議論"],"footer.diversity_equity_inclusion":[0,"多様性、公平性、包摂性"],"footer.critical_infrastructure_defense_project":[0,"重要インフラ防衛プロジェクト"]}]}" ssr="" client="load" opts="{"name":"PostCard","value":true}" await-children="">2025-04-08
静的サイトやフルスタックアプリケーションをCloudflare Workersでデプロイできるようになりました。React Router v7、Astro、VueなどのフレームワークサポートとCloudflare Viteプラグインは、本日一般公開となります。 ...