<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Opennextjs on デジタルアーカイブシステムの技術ブログ</title><link>https://tech.ldas.jp/ja/tags/opennextjs/</link><description>Recent content in Opennextjs on デジタルアーカイブシステムの技術ブログ</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 06 Apr 2026 19:00:00 +0900</lastBuildDate><atom:link href="https://tech.ldas.jp/ja/tags/opennextjs/index.xml" rel="self" type="application/rss+xml"/><item><title>Vercel ProをHobbyに下げるためにNext.jsアプリをCloudflare Pagesに移行した</title><link>https://tech.ldas.jp/ja/posts/vercel-pro-to-hobby-cloudflare-migration/</link><pubDate>Mon, 06 Apr 2026 19:00:00 +0900</pubDate><guid>https://tech.ldas.jp/ja/posts/vercel-pro-to-hobby-cloudflare-migration/</guid><description>&lt;p>Vercel Proプランで60以上のNext.jsプロジェクトを運用していましたが、組織向けアプリをCloudflare Pagesに移行することで、Hobbyプラン（無料）へのダウングレードを実現しました。&lt;/p>
&lt;h2 id="背景">背景&lt;/h2>
&lt;h3 id="vercel-proの課題">Vercel Proの課題&lt;/h3>
&lt;p>Vercel Hobbyプランは&lt;strong>非商用・個人利用のみ&lt;/strong>です。組織のアプリをホストしている場合、Proプラン（$20/月〜）を維持する必要があります。&lt;/p>
&lt;p>しかし、60以上あるプロジェクトのうち組織向けアプリは2つだけでした。この2つをCloudflareに移せば、残りは個人プロジェクトとしてHobbyプランで運用できます。&lt;/p>
&lt;h3 id="移行対象">移行対象&lt;/h3>
&lt;ul>
&lt;li>多言語対応（日本語/英語）の検索アプリ（Next.js + next-intl + Elasticsearch）&lt;/li>
&lt;li>IIIF画像ビューアアプリ&lt;/li>
&lt;/ul>
&lt;p>いずれもカスタムドメインで運用中。&lt;/p>
&lt;h2 id="nextjs-16の壁--proxytsが未対応">Next.js 16の壁 — proxy.tsが未対応&lt;/h2>
&lt;p>最初にそのままCloudflare Pagesへの移行を試みましたが、ビルドの最終段階でエラーが発生しました。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Node.js middleware is not currently supported.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider switching to Edge Middleware.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Next.js 16では従来の &lt;code>middleware.ts&lt;/code> が &lt;code>proxy.ts&lt;/code> にリネームされ、&lt;strong>Node.jsランタイム固定&lt;/strong>になりました。&lt;code>@opennextjs/cloudflare&lt;/code> v1.18.0時点ではこの新しい &lt;code>proxy.ts&lt;/code> に未対応です（&lt;a href="https://github.com/opennextjs/opennextjs-cloudflare/issues/962">opennextjs/opennextjs-cloudflare#962&lt;/a>）。&lt;/p>
&lt;h3 id="解決策nextjs-15にダウングレード">解決策：Next.js 15にダウングレード&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># package.json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;next&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;^15.3.1&amp;#34;&lt;/span>, &lt;span class="c1"># 16.x → 15.x&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;next-intl&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;^3.26.5&amp;#34;&lt;/span>, &lt;span class="c1"># 4.x → 3.x（Next.js 15対応版）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;eslint-config-next&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;^15.3.1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同時に &lt;code>proxy.ts&lt;/code> を &lt;code>middleware.ts&lt;/code> にリネームし、エクスポート名も &lt;code>proxy&lt;/code> → &lt;code>middleware&lt;/code> に変更しました。&lt;/p>
&lt;h2 id="cloudflare-pagesへのデプロイ手順">Cloudflare Pagesへのデプロイ手順&lt;/h2>
&lt;h3 id="1-依存パッケージのインストール">1. 依存パッケージのインストール&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install --save-dev @opennextjs/cloudflare wrangler
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-設定ファイルの作成">2. 設定ファイルの作成&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// open-next.config.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">defineCloudflareConfig&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;@opennextjs/cloudflare&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="nx">defineCloudflareConfig&lt;/span>&lt;span class="p">({});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-jsonc" data-lang="jsonc">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// wrangler.jsonc
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;my-app&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;pages_build_output_dir&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;.open-next/assets&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;compatibility_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2025-04-01&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;compatibility_flags&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;nodejs_compat&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-ビルド">3. ビルド&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npx @opennextjs/cloudflare build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-pagesへのデプロイここが最大のポイント">4. Pagesへのデプロイ（ここが最大のポイント）&lt;/h3>
&lt;p>&lt;code>@opennextjs/cloudflare&lt;/code> のビルド出力はWorkers向けですが、Pagesにデプロイするには以下の手順が必要です。&lt;/p></description></item></channel></rss>