Next.js App Router 和 Pages Router对比

基本对比

FeatureApp RouterPages Router
路由类型服务端浏览器端
支持服务端组件(Server Components)
复杂度复杂简单
性能
自由度更灵活一般

需要注意的是,在App Router模式下,所有的组件默认都是服务端组件(Server Components),你可以指定为客户端组件,需要使用'use client'指令

To make the transition to Server Components easier, all components inside the App Router are Server Components by default, including special files and colocated components. This allows you to automatically adopt them with no extra work, and achieve great performance out of the box. You can also optionally opt-in to Client Components using the 'use client' directive.

从pages迁移到app

  • 创建一个根布局文件 app/layout.tsx

    这个layout替换了之前的 pages/_app.tsx和 pages/_document.tsx文件

export default function RootLayout({
  // Layouts must accept a children prop.
  // This will be populated with nested layouts or pages
  children
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  )
}

什么时候用服务端/客户端组件?

你需要做什么?服务端组件客户端组件
请求数据
访问后端资源(直接的)
将敏感信息保存在服务器上(access token, api密钥等)
比较大的依赖放在服务端/减小客户端打包的大小
添加交互和事件监听
使用hooks 和生命周期 (useState, useReducer, useEffect等)
使用浏览器仅有的APIs
使用自定义的hooks,而且依赖了state,effects或浏览器仅有的APIs
使用React Class组件