多區域
範例
多區域是一種微前端方法,它將網域上的大型應用程式分成較小的 Next.js 應用程式,每個應用程式都服務一組路徑。當應用程式中有彼此無關的頁面集合時,這會很有用。藉由將這些頁面移至單獨的區域(即單獨的應用程式),您可以減少每個應用程式的大小,從而縮短建置時間並移除僅對其中一個區域必要的程式碼。由於應用程式是分離的,因此多區域還允許網域上的其他應用程式使用它們自己選擇的框架。
例如,假設您想要拆分以下頁面集
/blog/*
所有部落格文章/dashboard/*
使用者登入儀表板後的所有頁面/*
網站上其他未被其他區域涵蓋的部分
透過多區域支援,您可以在同一個網域上建立三個應用程式,它們對使用者來說看起來都一樣,但您可以獨立開發和部署每個應用程式。


在同一區域內的頁面之間導覽將執行軟導覽,這是一種不需要重新載入頁面的導覽。例如,在此圖表中,從 /
導覽到 /products
將會是軟導覽。
從一個區域的頁面導覽到另一個區域的頁面(例如從 /
導覽到 /dashboard
)將執行硬導覽,卸載當前頁面的資源並載入新頁面的資源。經常一起瀏覽的頁面應該位於同一區域,以避免硬導覽。
如何定義區域
區域是一個普通的 Next.js 應用程式,您也可以在其中設定 assetPrefix,以避免與其他區域中的頁面和靜態檔案衝突。
/** @type {import('next').NextConfig} */
const nextConfig = {
assetPrefix: '/blog-static',
}
Next.js 資源(例如 JavaScript 和 CSS)將以 assetPrefix
作為前綴,以確保它們不會與來自其他區域的資源衝突。這些資源將在每個區域的 /assetPrefix/_next/...
下提供。
處理所有未路由到其他更特定區域的路徑的預設應用程式不需要 assetPrefix
。
在 Next.js 15 之前的版本中,您可能還需要額外的重寫來處理靜態資源。在 Next.js 15 中不再需要這樣做。
/** @type {import('next').NextConfig} */
const nextConfig = {
assetPrefix: '/blog-static',
async rewrites() {
return {
beforeFiles: [
{
source: '/blog-static/_next/:path+',
destination: '/_next/:path+',
},
],
}
},
}
如何將請求路由到正確的區域
使用多區域設定時,您需要將路徑路由到正確的區域,因為它們是由不同的應用程式提供的。您可以使用任何 HTTP 代理來執行此操作,但其中一個 Next.js 應用程式也可以用於路由整個網域的請求。
要使用 Next.js 應用程式路由到正確的區域,您可以使用 rewrites
。對於由不同區域提供的每個路徑,您都需要新增一個重寫規則,以將該路徑傳送到其他區域的網域。例如:
async rewrites() {
return [
{
source: '/blog',
destination: `${process.env.BLOG_DOMAIN}/blog`,
},
{
source: '/blog/:path+',
destination: `${process.env.BLOG_DOMAIN}/blog/:path+`,
}
];
}
destination
應該是區域提供的 URL,包含通訊協定和網域。這應該指向區域的正式網域,但它也可以用於在本地開發中將請求路由到 localhost
。
注意事項:URL 路徑對於每個區域應該是唯一的。例如,兩個區域嘗試提供
/blog
將會造成路由衝突。
使用中介軟體路由請求
建議透過 rewrites
路由請求,以盡量減少請求的延遲成本,但當路由需要動態決策時,也可以使用中介軟體。例如,如果您使用功能標記來決定路徑的路由位置(例如在遷移期間),則可以使用中介軟體。
export async function middleware(request) {
const { pathname, search } = req.nextUrl;
if (pathname === '/your-path' && myFeaturFlag.isEnabled()) {
return NextResponse.rewrite(`${rewriteDomain}${pathname}${search});
}
}
區域間連結 元件。這是因為 Next.js 會嘗試預取並軟導航到 <Link>
元件中的任何相對路徑,而這在跨區域的情況下將無法運作。
共用程式碼
構成不同區域的 Next.js 應用程式可以放在任何儲存庫中。然而,將這些區域放在 單體儲存庫(monorepo) 中通常更方便共用程式碼。對於位於不同儲存庫中的區域,也可以使用公開或私有的 NPM 套件來共用程式碼。
由於不同區域中的頁面可能在不同的時間發布,因此功能標記對於跨不同區域統一啟用或停用功能非常有用。
對於在 Vercel 上執行的 Next.js 應用程式,您可以使用 單體儲存庫(monorepo),透過單一 git push
指令即可部署所有受影響的區域。
這有幫助嗎?