程式碼修改器
程式碼修改器是在您的程式碼庫上以程式設計方式執行的轉換。這允許以程式設計方式套用大量變更,而無需手動檢查每個檔案。
當 API 更新或棄用時,Next.js 提供程式碼修改器轉換來協助升級您的 Next.js 程式碼庫。
用法
在您的終端機中,導航 (cd
) 至您的專案資料夾,然後執行
npx @next/codemod <transform> <path>
將 <transform>
和 <path>
替換為適當的值。
transform
- 轉換的名稱path
- 要轉換的檔案或目錄--dry
進行試運行,不會修改任何程式碼--print
印出變更後的輸出以供比較
程式碼修改
15.0
將應用程式路由器路由區段設定 runtime
值從 experimental-edge
轉換為 edge
app-dir-runtime-config-experimental-edge
此程式碼修改器將轉換現已改為非同步的動態 API(來自 next/headers
的 cookies()
、headers()
和 draftMode()
),使其能被正確地 await 或在適用情況下以 React.use()
包裝。當無法自動遷移時,程式碼修改器會添加類型轉換(如果是 TypeScript 檔案)或註釋,以告知使用者需要手動檢查和更新。
例如
import { cookies, headers } from 'next/headers'
const token = cookies().get('token')
function useToken() {
const token = cookies().get('token')
return token
}
export default function Page() {
const name = cookies().get('name')
}
function getHeader() {
return headers().get('x-foo')
}
轉換成
import { use } from 'react'
import { cookies, headers, type UnsafeUnwrappedCookies } from 'next/headers'
const token = (await cookies()).get('token')
function useToken() {
const token = use(cookies()).get('token')
return token
}
export default function Page() {
const name = (await cookies()).get('name')
}
function getHeader() {
return (headers() as UnsafeUnwrappedCookies).get('x-foo')
}
當我們在頁面/路由項目(page.js
、layout.js
、route.js
或 default.js
)或 generateMetadata
/generateViewport
API 中偵測到對 params
或 searchParams
屬性的存取時,它會嘗試將呼叫點從同步函式轉換為非同步函式,並 await 屬性存取。如果它無法變為非同步(例如在客戶端元件中),它將使用 React.use
來解開 Promise。
例如
// page.tsx
export default function Page({
params,
searchParams,
}: {
params: { slug: string }
searchParams: { [key: string]: string | string[] | undefined }
}) {
const { value } = searchParams
if (value === 'foo') {
// ...
}
}
export function generateMetadata({ params }: { params: { slug: string } }) {
return {
title: `My Page - ${slug}`,
}
}
轉換成
// page.tsx
export default function Page(props: {
params: { slug: string }
searchParams: { [key: string]: string | string[] | undefined }
}) {
const { value } = await props.searchParams
if (value === 'foo') {
// ...
}
}
export function generateMetadata(props: { params: { slug: string } }) {
const { slug } = await props.params
return {
title: `My Page - ${slug}`,
}
}
注意事項:當此程式碼修改器識別到可能需要手動介入的位置,但我們無法確定確切的修復方法時,它會在程式碼中添加註釋或類型轉換,以告知使用者需要手動更新。這些註釋以 @next/codemod 為前綴,類型轉換以
UnsafeUnwrapped
為前綴。您的建置將會出錯,直到這些註釋被明確移除。了解更多。
使用 @vercel/functions
取代 NextRequest
的 geo
和 ip
屬性
next-request-geo-ip
npx @next/codemod@latest next-request-geo-ip .
此程式碼修改器會安裝 @vercel/functions
,並使用對應的 @vercel/functions
功能轉換 NextRequest
的 geo
和 ip
屬性。
例如
import type { NextRequest } from 'next/server'
export function GET(req: NextRequest) {
const { geo, ip } = req
}
轉換成
import type { NextRequest } from 'next/server'
import { geolocation, ipAddress } from '@vercel/functions'
export function GET(req: NextRequest) {
const geo = geolocation(req)
const ip = ipAddress(req)
}
將存取命名匯出的 next/dynamic
導入轉換為返回具有 default
屬性的物件 next-dynamic-access-named-export
終端機npx @next/codemod@latest next-dynamic-access-named-export .
next-dynamic-access-named-export
npx @next/codemod@latest next-dynamic-access-named-export .