001 Next.js教程—— 项目搭建

项目安装

npx create-next-app@latest
#@后跟版本号 @latest是最新版的意思 @14.0.0就是搭建14.0.0版本的next脚手架

初始化方式:

  • 创建一个NextJs项目
  • 项目名叫nextjs-demo
  • 使用 TypeScript
  • 开启 ESLint 代码检测
  • 使用 Css原子类 (Tailwindcss)
  • 不使用 src 作为根目录
  • 使用 appRouter 的方式构建应用
  • 使用 alias 别名来优化 import 文件引入
  • 根目录 alias 默认匹配 @* 符号(可自定义输入)

next项目创建时的初始化选项

Next.js v14 核心目录结构

(默认使用 App Router,支持 React Server Components)

my-app/
├── app/                  # 核心路由目录 (App Router)
│   ├── (auth)/           # 路由组 (不改变URL结构)
│   ├── dashboard/        # 普通路由 (/dashboard)
│   │   ├── analytics/    # 嵌套路由 (/dashboard/analytics)
│   │   │   └── page.tsx  # 嵌套页面组件
│   │   ├── layout.tsx    # 仪表盘专属布局
│   │   └── page.tsx      # 仪表盘主页面
│   ├── blog/
│   │   ├── [slug]/       # 动态路由 (e.g. /blog/post-1)
│   │   │   └── page.tsx  
│   │   └── page.tsx      
│   ├── api/              # API 路由 (可选)
│   │   └── route.ts      
│   ├── favicon.ico       # 网站图标
│   ├── globals.css       # 全局CSS
│   ├── layout.tsx        # 根布局 (必须)
│   ├── page.tsx          # 首页 (/) 
│   ├── template.tsx      # 可复用的模板组件
│   ├── error.tsx         # 错误边界 (替代 _error.js)
│   ├── loading.tsx       # 加载状态 (Suspense)
│   └── not-found.tsx     # 404 页面
│
├── public/               # 静态资源
│   ├── images/           # 图片资源
│   └── robots.txt        # SEO配置
│
├── src/                  # 可选源码目录 (推荐)
│   ├── components/       # 通用组件
│   ├── lib/              # 工具函数
│   └── styles/           # 样式文件
│
├── .env                  # 环境变量
├── .eslintrc.json        # ESLint 配置
├── .gitignore            
├── next.config.js        # Next.js 配置
├── package.json          
├── middleware.ts         # 中间件 (路由守卫/重定向)
└── tsconfig.json         # TypeScript 配置

关键文件详解

1. app/ 目录 (App Router)
  • layout.tsx
    根布局文件,必须包含 <html><body> 标签:
    export default function RootLayout({ children }: { children: React.ReactNode }) {
      return (
        <html lang="en">
          <body className={inter.className}>{children}</body>
        </html>
      );
    }

Metadata API
替代 next/head,在 layout.tsx 中配置:

import type { Metadata } from "next";
export const metadata: Metadata = {
  title: "这是一个页面标题",
  description: "这是页面描述",
};
  • page.tsx
    页面组件,默认导出的 React 组件:
  export default function Home() {
      return <h1>Hello, Next.js 14!</h1>;
    }
  • 动态路由
    使用 [folderName] 格式定义:
    app/
      └── blog/
          └── [slug]/
              └── page.tsx  # 通过 `params.slug` 获取参数
  • 特殊文件

    • loading.tsx:基于 Suspense 的加载状态

    • error.tsx:局部错误处理

    • not-found.tsx:自定义 404

2. 路由组 (Route Groups)

(folderName) 组织路由但不影响 URL 路径:

app/
  ├── (auth)/
  │   ├── login/
  │   │   └── page.tsx    # 路径仍为 /login
  │   └── register/
  │       └── page.tsx
  └── (marketing)/
      ├── about/
      └── contact/
3. 数据获取 (v14 优化)

在 Server Components 中直接使用 async/await

// app/dashboard/page.tsx
export default async function Dashboard() {
  const data = await fetch("https://api.example.com/data");
  return <div>{data}</div>;
}
4. Server Actions

在组件内直接定义服务端操作(无需 API 路由):

// app/actions.ts
"use server";
export async function createPost(formData: FormData) {
  // 服务端操作(数据库写入等)
}
5. 中间件 (middleware.ts)

全局请求拦截:

export function middleware(request: NextRequest) {
  if (request.nextUrl.pathname.startsWith("/dashboard")) {
    // 验证用户权限
  }
}

Next.js的数据获取与渲染

1. 服务器组件(Server Components)

直接使用 async/await:在组件内发起请求,替代 getServerSideProps

// app/dashboard/page.tsx
export default async function Dashboard() {
  const data = await fetch('https://api.example.com/data');
  return <div>{data}</div>;
}

禁止使用 Hooks:服务器组件中不可用 useStateuseEffect 等客户端 API

2. 渲染模式配置

通过 fetch 参数控制缓存策略:

模式配置方式适用场景
SSR{ cache: 'no-store' }实时数据(如用户仪表盘)2
SSG{ cache: 'force-cache' }静态内容(如博客)
ISR{ next: { revalidate: 60 } }增量更新(如商品列表)27

Next.js 的 路由系统进阶

1. 并行路由(Parallel Routes)
  • 用途:同一布局内同时渲染多个独立路由(如仪表盘多视图)。

  • 约定:使用 @ 前缀定义插槽(Slots)。

app/
  └── dashboard/
      ├── @analytics/   # 插槽:@analytics
      │   └── page.tsx
      ├── @team/        # 插槽:@team
      │   └── page.tsx
      └── layout.tsx    # 通过 props 接收插槽
// layout.tsx
export default function Layout({ children, analytics, team }) {
  return (
    <>
      {children}
      <div>{analytics}</div> 
      <div>{team}</div>
    </>
  );
}
2. 拦截路由(Intercepting Routes)
  • 用途:动态拦截路由跳转(如点击链接时弹出模态框而非跳页)。

  • 约定:使用 (..) 语法匹配上级路由:

app/
  ├── @modal/          # 拦截层
  │   └── (..)photo/    # 匹配 photo/[id]
  │       └── [id].tsx
  └── photo/
      └── [id].tsx     # 原始路由
3. 路由组(Route Groups)
  • 用途:组织路由文件(如按功能分类),不影响 URL 结构

  • 约定(folderName) 格式1:

app/
  ├── (auth)/
  │   ├── login/page.tsx   # URL: /login
  │   └── register/page.tsx
  └── (marketing)/
      ├── about/page.tsx
      └── contact/page.tsx

Server Actions(稳定版)

用途:在组件内直接定义服务端逻辑(无需单独 API 路由)。
优势:减少网络请求、简化数据变更流程

// app/actions.ts
"use server";
export async function createPost(data: FormData) {
  await db.post.create({ data });
  revalidatePath('/posts'); // 刷新缓存
}
// 客户端调用
import { createPost } from '@/app/actions';
export default function Form() {
  return (
    <form action={createPost}>
      <input name="title" />
      <button>Submit</button>
    </form>
  );
}

开发体验优化

1. Turbopack 构建引擎(Beta)

  • 性能提升:本地启动速度 ↑53%,热更新 ↑94%

  • 启用命令next dev --turbo

2. 部分预渲染(Partial Prerendering - 预览)

  • 原理:静态骨架 + 动态内容流式注入。

  • 优势:兼顾静态页面速度与动态数据灵活性。

3. 元数据(Metadata API)

替代 next/head,在布局中配置 SEO:

// app/layout.tsx
export const metadata: Metadata = {
  title: 'My App',
  description: 'Built with Next.js 14',
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值