Skip to main content

Next.js

Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。由 Vercel 团队开发和维护,它提供了服务器端渲染(SSR)、静态站点生成(SSG)等功能。

创建项目

npx create-next-app@latest

Next.js 默认附带 TypeScript、ESLint 和 Tailwind CSS 配置。

可以选择在项目的根目录中使用 src 目录来分隔应用程序的代码和配置文件

渲染

Next.js 默认使用服务器组件。自动实现服务器渲染而无需额外配置,并且可以在需要时选择使用客户端组件。

服务器组件支持 Promise,可以使用 async / await

设置元数据

Metadata APIs

可以在 layout.tsx 或者 page.tsx 中设置元数据:

import type { Metadata } from 'next';

export const metadata: Metadata = {
title: 'Create Next App',
description: 'Generated by create next app'
};

样式方案

  1. Tailwind CSS
  2. CSS Modules
  3. CSS-in-JS 库

clsx可以有条件的渲染样式

字体

字体优化

可以使用 Google Fonts 来引入字体。

例如,在 /app/ui 文件夹中,创建一个名为 fonts.ts 的新文件。将使用此文件保存在整个应用程序中使用的字体。

app/ui/fonts.ts
import { Inter, Lusitana } from 'next/font/google';

export const inter = Inter({ subsets: ['latin'] });

export const lusitana = Lusitana({
subsets: ['latin'],
weight: ['400', '700']
});
app/layout.tsx
import { inter } from '@/app/ui/fonts';

export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body className={`${inter.className} antialiased`}>{children}</body>
</html>
);
}

图片

图片优化

<Image>组件是 img 标签的扩展,带有自动优化图像的功能。

  • 防止在加载图像时自动切换布局
  • 调整图像大小以避免将大图像传送到具有较小视口的设备
  • 默认情况下延迟加载图像(图像在进入视口时加载)

例如,从 public 目录加载图片:

import Image from 'next/image';

export default function Page() {
return (
<Image
src="/hero-desktop.png"
width={1000}
height={760}
className="hidden md:block"
alt="Screenshots of the dashboard project showing desktop version"
/>
);
}

设置图像的宽度和高度以避免布局偏移,这些应该是与源图像相同的宽高比。

流式传输

流式传输是一种数据传输技术,可将路由分解为更小的「块」,并在它们准备就绪时将它们从服务器逐步流式传输到客户端。通过流式传输,可以防止缓慢的数据请求阻塞整个页面。

有两种方式:

  1. 在页面级别,使用正在 loading.tsx 文件
  2. 对特定组件,使用 <Suspense> 组件

loading.tsx

在有 page.tsx 的同级目录下创建 loading.tsx 文件,内容如下:

export default function Loading() {
return <div>Loading...</div>;
}

刷新页面,就会看到页面上出现了 Loading...

加载骨架

加载骨架是 UI 的简化版本。用作占位符,告诉用户内容正在加载。

Suspense 组件

Suspense 组件用于在异步操作(如数据加载)完成之前,显示一个加载指示器。可展示局部页面的加载状态。

import { Suspense } from 'react';
import { CardsSkeleton } from '@/app/ui/skeletons'; // 加载骨架组件
import CardWrapper from '@/app/ui/dashboard/cards'; // 要展示的卡片组件

export default async function Page() {
return (
<Suspense fallback={<CardsSkeleton />}>
<CardWrapper />
</Suspense>
);
}

鉴权

NextAuth.js