Next.js 入门指南
·4 分钟阅读·782 字··作者:SuperLog
Next.js 入门指南
Next.js 是一个基于 React 的全栈框架,提供了服务端渲染(SSR)、静态站点生成(SSG)等强大功能。
什么是 Next.js?
Next.js 是由 Vercel 开发的 React 框架,它解决了传统 React 应用的许多痛点:
- 🚀 自动路由:基于文件系统的路由
- ⚡ 性能优化:自动代码分割、图片优化
- 🎨 灵活渲染:SSR、SSG、ISR 多种渲染方式
- 📦 零配置:开箱即用的 TypeScript、CSS 支持
App Router vs Pages Router
Next.js 13 引入了全新的 App Router,基于 React Server Components。
Pages Router(旧)
// pages/index.js
export default function Home() {
return <h1>Hello World</h1>
}
// pages/about.js
export default function About() {
return <h1>About Us</h1>
}
App Router(新)
// app/page.tsx
export default function Page() {
return <h1>Hello World</h1>
}
// app/about/page.tsx
export default function AboutPage() {
return <h1>About Us</h1>
}
核心概念
1. Server Components
默认情况下,App Router 中的所有组件都是 Server Components:
// app/posts/page.tsx
async function getPosts() {
const res = await fetch('https://api.example.com/posts')
return res.json()
}
export default async function PostsPage() {
const posts = await getPosts()
return (
<div>
{posts.map(post => (
<article key={post.id}>
<h2>{post.title}</h2>
</article>
))}
</div>
)
}
2. Client Components
需要交互的组件使用 'use client' 指令:
'use client'
import { useState } from 'react'
export default function Counter() {
const [count, setCount] = useState(0)
return (
<button onClick={() => setCount(count + 1)}>
Count: {count}
</button>
)
}
3. 动态路由
// app/posts/[slug]/page.tsx
export default function PostPage({ params }: { params: { slug: string } }) {
return <h1>Post: {params.slug}</h1>
}
// 生成静态路径
export async function generateStaticParams() {
const posts = await fetch('https://api.example.com/posts').then(res => res.json())
return posts.map((post) => ({
slug: post.slug,
}))
}
数据获取
服务端数据获取
// 自动缓存
async function getData() {
const res = await fetch('https://api.example.com/data')
return res.json()
}
// 禁用缓存
async function getData() {
const res = await fetch('https://api.example.com/data', { cache: 'no-store' })
return res.json()
}
// 定时重新验证
async function getData() {
const res = await fetch('https://api.example.com/data', { next: { revalidate: 3600 } })
return res.json()
}
客户端数据获取
'use client'
import { useEffect, useState } from 'react'
export default function ClientComponent() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('https://api.example.com/data')
.then(res => res.json())
.then(setData)
}, [])
return <div>{data && JSON.stringify(data)}</div>
}
Metadata 和 SEO
// app/layout.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'My Website',
description: 'Welcome to my website',
}
// app/posts/[slug]/page.tsx
export async function generateMetadata({ params }): Promise<Metadata> {
const post = await getPost(params.slug)
return {
title: post.title,
description: post.description,
openGraph: {
title: post.title,
description: post.description,
images: [post.cover],
},
}
}
样式方案
1. Tailwind CSS(推荐)
export default function Button() {
return (
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
Click Me
</button>
)
}
2. CSS Modules
import styles from './button.module.css'
export default function Button() {
return <button className={styles.button}>Click Me</button>
}
部署
Vercel(推荐)
- 将代码推送到 GitHub
- 在 Vercel 中导入项目
- 自动部署
其他平台
# 构建生产版本
npm run build
# 启动生产服务器
npm run start
最佳实践
- 优先使用 Server Components:除非需要交互,否则默认使用服务器组件
- 合理使用缓存:充分利用 Next.js 的缓存机制
- 代码分割:使用动态导入延迟加载大型组件
- 图片优化:使用
next/image组件 - 字体优化:使用
next/font自动优化字体
总结
Next.js 提供了构建现代 Web 应用所需的一切工具。通过 App Router 和 Server Components,我们可以更高效地构建高性能的应用。
开始使用 Next.js,体验全新的开发方式吧!
相关推荐
欢迎来到 SuperLog
SuperLog 是一个从零构建的现代化静态博客系统,支持 Markdown、代码高亮、全文搜索等功能。
·2 分钟·
#博客#Next.js
高清放大和修复模型
详细介绍 Stable Diffusion 中常用的图片放大和修复模型,包括写实类、二次元类、人脸修复和功能性修复模型的选择指南
·6 分钟·
#Stable Diffusion#图片放大
哆啦A梦讲解知识点的制作流程
使用 AI 工具制作哆啦A梦风格漫画讲解知识点的完整流程,包括角色生成、对话设计和排版技巧
·9 分钟·
#AI绘画#漫画创作