Next.js实战:从零构建到高效开发

Next.js 项目演示:从零创建到实战入门

环境准备与项目初始化

确保本地已安装 Node.js(建议版本 ≥16.8),通过以下命令创建新项目:

npx create-next-app@latest nextjs-demo

交互式命令行中选择 TypeScript(可选)、ESLint 等配置。完成安装后进入项目目录:

cd nextjs-demo

项目结构解析

初始化的项目包含以下核心目录:

  • app/:App Router 路由目录(Next.js 13+)
  • pages/:传统页面路由(与 app/ 二选一)
  • public/:静态资源文件
  • components/:自定义组件(需手动创建)
  • next.config.js:Next.js 配置文件

开发模式启动

运行开发服务器:

npm run dev

访问 http://localhost:3000 查看默认页面。修改 app/page.tsxpages/index.tsx 可实时热更新。

路由系统实践

App Router 示例
app/about/page.tsx 创建新页面:

export default function About() {
  return <h1>About Page</h1>
}

访问 http://localhost:3000/about 自动生效。

传统 Pages Router
pages/contact.tsx 创建:

export default function Contact() {
  return <div>Contact Us</div>
}

数据获取方法

服务端组件数据获取
app/blog/page.tsx 中使用 fetch

async function getData() {
  const res = await fetch('https://api.example.com/posts')
  return res.json()
}

export default async function Blog() {
  const posts = await getData()
  return posts.map((post) => <div key={post.id}>{post.title}</div>)
}

客户端数据请求
创建 components/ClientData.tsx

'use client'
import { useEffect, useState } from 'react'

export function ClientData() {
  const [data, setData] = useState(null)
  
  useEffect(() => {
    fetch('/api/data').then(res => res.json()).then(setData)
  }, [])

  return <div>{JSON.stringify(data)}</div>
}

API 路由实现

app/api/hello/route.ts 创建接口:

export async function GET() {
  return Response.json({ message: 'Hello from API' })
}

访问 http://localhost:3000/api/hello 返回 JSON 数据。

样式方案选择

CSS Modules
创建 app/components/Button.module.css

.primary {
  background: #0070f3;
  color: white;
}

在组件中引用:

import styles from './Button.module.css'
export function Button() {
  return <button className={styles.primary}>Click</button>
}

Tailwind CSS
安装后直接在 JSX 中使用:

<h1 className="text-3xl font-bold text-blue-600">Hello Tailwind</h1>

部署准备

生成生产环境构建:

npm run build

输出结果位于 .next 目录。支持多种部署方式:

  • Vercel:零配置自动部署
  • Node.js 服务器:npm start 启动生产服务
  • 静态导出:next export(需配置)

性能优化技巧

  1. 动态加载组件:
import dynamic from 'next/dynamic'
const HeavyComponent = dynamic(() => import('../components/Heavy'))
  1. 图片优化:
import Image from 'next/image'
<Image src="/photo.jpg" alt="Photo" width={500} height={300} priority />
  1. 中间件处理:
// middleware.ts
export function middleware(request) {
  console.log(request.url)
}

通过以上步骤可快速掌握 Next.js 核心功能,实际项目中可结合具体需求扩展 ISR、Edge Functions 等高级特性。

BbS.okacop010.info/PoSt/1120_920148.HtM
BbS.okacop011.info/PoSt/1120_394320.HtM
BbS.okacop012.info/PoSt/1120_465478.HtM
BbS.okacop013.info/PoSt/1120_377187.HtM
BbS.okacop014.info/PoSt/1120_997688.HtM
BbS.okacop015.info/PoSt/1120_757942.HtM
BbS.okacop016.info/PoSt/1120_046206.HtM
BbS.okacop017.info/PoSt/1120_366320.HtM
BbS.okacop018.info/PoSt/1120_122608.HtM
BbS.okacop019.info/PoSt/1120_728612.HtM
BbS.okacop010.info/PoSt/1120_097668.HtM
BbS.okacop011.info/PoSt/1120_450137.HtM
BbS.okacop012.info/PoSt/1120_793809.HtM
BbS.okacop013.info/PoSt/1120_538690.HtM
BbS.okacop014.info/PoSt/1120_700423.HtM
BbS.okacop015.info/PoSt/1120_462761.HtM
BbS.okacop016.info/PoSt/1120_362040.HtM
BbS.okacop017.info/PoSt/1120_390926.HtM
BbS.okacop018.info/PoSt/1120_036163.HtM
BbS.okacop019.info/PoSt/1120_088281.HtM
BbS.okacop010.info/PoSt/1120_992882.HtM
BbS.okacop011.info/PoSt/1120_003253.HtM
BbS.okacop012.info/PoSt/1120_893761.HtM
BbS.okacop013.info/PoSt/1120_514621.HtM
BbS.okacop014.info/PoSt/1120_513473.HtM
BbS.okacop015.info/PoSt/1120_641215.HtM
BbS.okacop016.info/PoSt/1120_639423.HtM
BbS.okacop017.info/PoSt/1120_087155.HtM
BbS.okacop018.info/PoSt/1120_113365.HtM
BbS.okacop019.info/PoSt/1120_698110.HtM
BbS.okacop010.info/PoSt/1120_322158.HtM
BbS.okacop011.info/PoSt/1120_059567.HtM
BbS.okacop012.info/PoSt/1120_444536.HtM
BbS.okacop013.info/PoSt/1120_709683.HtM
BbS.okacop014.info/PoSt/1120_318079.HtM
BbS.okacop015.info/PoSt/1120_525697.HtM
BbS.okacop016.info/PoSt/1120_892991.HtM
BbS.okacop017.info/PoSt/1120_035110.HtM
BbS.okacop018.info/PoSt/1120_094227.HtM
BbS.okacop019.info/PoSt/1120_703813.HtM
BbS.okacop010.info/PoSt/1120_845817.HtM
BbS.okacop011.info/PoSt/1120_094312.HtM
BbS.okacop012.info/PoSt/1120_826827.HtM
BbS.okacop013.info/PoSt/1120_999101.HtM
BbS.okacop014.info/PoSt/1120_379441.HtM
BbS.okacop015.info/PoSt/1120_224771.HtM
BbS.okacop016.info/PoSt/1120_705219.HtM
BbS.okacop017.info/PoSt/1120_645862.HtM
BbS.okacop018.info/PoSt/1120_365473.HtM
BbS.okacop019.info/PoSt/1120_399279.HtM
BbS.okacop010.info/PoSt/1120_975762.HtM
BbS.okacop011.info/PoSt/1120_735811.HtM
BbS.okacop012.info/PoSt/1120_746788.HtM
BbS.okacop013.info/PoSt/1120_412002.HtM
BbS.okacop014.info/PoSt/1120_665028.HtM
BbS.okacop015.info/PoSt/1120_373959.HtM
BbS.okacop016.info/PoSt/1120_418120.HtM
BbS.okacop017.info/PoSt/1120_385753.HtM
BbS.okacop018.info/PoSt/1120_701788.HtM
BbS.okacop019.info/PoSt/1120_652217.HtM
BbS.okacop010.info/PoSt/1120_855462.HtM
BbS.okacop011.info/PoSt/1120_150188.HtM
BbS.okacop012.info/PoSt/1120_961270.HtM
BbS.okacop013.info/PoSt/1120_047324.HtM
BbS.okacop014.info/PoSt/1120_614064.HtM
BbS.okacop015.info/PoSt/1120_501941.HtM
BbS.okacop016.info/PoSt/1120_433572.HtM
BbS.okacop017.info/PoSt/1120_704426.HtM
BbS.okacop018.info/PoSt/1120_502793.HtM
BbS.okacop019.info/PoSt/1120_358018.HtM
BbS.okacop010.info/PoSt/1120_864279.HtM
BbS.okacop011.info/PoSt/1120_391900.HtM
BbS.okacop012.info/PoSt/1120_552112.HtM
BbS.okacop013.info/PoSt/1120_164870.HtM
BbS.okacop014.info/PoSt/1120_959664.HtM
BbS.okacop015.info/PoSt/1120_168710.HtM
BbS.okacop016.info/PoSt/1120_965616.HtM
BbS.okacop017.info/PoSt/1120_366151.HtM
BbS.okacop018.info/PoSt/1120_624759.HtM
BbS.okacop019.info/PoSt/1120_481495.HtM

#牛客AI配图神器#

全部评论

相关推荐

游戏客户端劝退第11...:那我实习一年,去社招,是不是一年经验了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务