nextjs

44 阅读1分钟

Codemods

其中一个

当我们检测到对页面/路由条目(page.js、layout.js、route.js或default.js)或generateMetadata/generateViewport API中的params或searchParams道具的属性访问时,它将尝试将调用站点从同步转换为异步函数,并等待属性访问。如果它不能异步(例如使用客户端组件),它将使用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}`,
  }
}

很高兴知道:当这个codemod识别出一个可能需要手动干预的位置,但我们无法确定确切的修复方法时,它会在代码中添加注释或类型转换,通知用户需要手动更新。这些注释的前缀是@next/codemod,而类型转换的前缀是UnsafeUnwrapped。在明确删除这些注释之前,构建将出错