next.js实现项目搭建

一、创建 Next.js 项目的步骤

1、安装

npx create-next-app@latest
# 或
yarn create next-app
# 或
pnpm create next-app

按照交互式提示配置你的项目:

  • 输入项目名称

  • 选择是否使用 TypeScript

  • 选择是否启用 ESLint

  • 选择是否启用 Tailwind CSS

  • 选择是否使用 src/ 目录

  • 选择是否启用实验性 App 路由功能

  • 选择是否自定义导入别名

1、运行

npm run dev

项目将在 http://localhost:3000 启动。

2、常用命令

  • npm run dev - 启动开发服务器

  • npm run build - 构建生产版本

  • npm run start - 启动生产服务器

  • npm run lint - 运行 ESLint

3. 额外配置

添加 TypeScript(如果初始未选择)

1、创建空 tsconfig.json:

touch tsconfig.json

2、安装 TypeScript 依赖

npm install --save-dev typescript @types/react @types/node

3、重新运行 npm run dev,Next.js 会自动配置 tsconfig.json

添加样式

Next.js 支持多种样式解决方案:

  • CSS Modules(内置支持)

  • Tailwind CSS(推荐)

  • Sass(需要安装 sass

  • CSS-in-JS(如 styled-components, emotion)

    二、Next.js (TypeScript) 配置多个页面的方法

    在 Next.js 中配置多个页面非常简单,主要取决于你使用的是传统的 pages 路由还是新的 app 路由(Next.js 13+)。以下是两种方式的配置方法:

    方法一:使用传统的 pages 路由

    1、创建页面文件

    在 pages 目录下,每个文件都会自动成为一个路由:

    pages/
    ├── index.tsx        // 对应路径 /
    ├── about.tsx       // 对应路径 /about
    ├── blog/
    │   ├── index.tsx   // 对应路径 /blog
    │   └── [slug].tsx  // 动态路由 /blog/:slug
    └── users/└── [id].tsx    // 动态路由 /users/:id

    2、基本页面示例

    pages/about.tsx:

    import React from 'react';const AboutPage: React.FC = () => {return (<div><h1>关于我们</h1><p>这是关于我们的页面</p></div>);
    };export default AboutPage;

    3、动态路由页面

    pages/blog/[slug].tsx:

    import { useRouter } from 'next/router';const BlogPost: React.FC = () => {const router = useRouter();const { slug } = router.query;return (<div><h1>博客文章: {slug}</h1><p>这是关于 {slug} 的文章内容</p></div>);
    };export default BlogPost;

    方法二:使用新的 app 路由 (Next.js 13+)

    1. 创建页面结构

    app/
    ├── page.tsx        // 对应路径 /
    ├── about/
    │   └── page.tsx   // 对应路径 /about
    ├── blog/
    │   ├── page.tsx   // 对应路径 /blog
    │   └── [slug]/
    │       └── page.tsx  // 动态路由 /blog/:slug
    └── users/└── [id]/└── page.tsx  // 动态路由 /users/:id

    2. 基本页面示例

    app/about/page.tsx:

    export default function AboutPage() {return (<div><h1>关于我们</h1><p>这是关于我们的页面</p></div>);
    }

    3. 动态路由页面

    app/blog/[slug]/page.tsx:

    export default function BlogPost({params,
    }: {params: { slug: string };
    }) {return (<div><h1>博客文章: {params.slug}</h1><p>这是关于 {params.slug} 的文章内容</p></div>);
    }

    【1】页面间导航

    使用 Next.js 的 Link 组件实现页面间导航:

    import Link from 'next/link';export default function Navigation() {return (<nav><Link href="/">首页</Link><Link href="/about">关于</Link><Link href="/blog">博客</Link><Link href="/blog/first-post">第一篇文章</Link></nav>);
    }

    【2】获取路由参数

    在 pages 路由中:

    import { useRouter } from 'next/router';// 在组件内
    const router = useRouter();
    const { id } = router.query;

    在 app 路由中:

    // 直接从组件的 props 中获取
    export default function Page({ params }: { params: { id: string } }) {return <div>ID: {params.id}</div>;
    }

    【3】注意事项

    1. 确保文件名正确:

      • pages 路由:直接使用 .tsx 文件

      • app 路由:必须在文件夹内创建 page.tsx

    2. 动态路由参数:

      • pages 路由:使用 [param].tsx 格式

      • app 路由:使用 [param]/page.tsx 格式

    3. 如果你同时使用 pages 和 app 路由,Next.js 会优先使用 app 路由。

    4. 对于 API 路由:

      • pages 路由:放在 pages/api 目录下

      • app 路由:放在 app/api 目录下

    这样配置后,你的 Next.js 应用就可以支持多个页面和动态路由了。

    三、复用 Header 和 Footer 组件

    登录是一个页面,其他首页,个人中心,关于我们等页面,头部和底部配置好,不需要在每个使用的页面中引用。

    方法一、创建可复用组件(推荐)

    1、创建共享组件

    首先,将 Header 和 Footer 拆分为独立组件:

    // components/Header.tsx
    export default function Header() {return (<header className="w-full h-12 bg-pink-500 flex items-center justify-center"><h1 className="text-white font-bold">头部导航</h1></header>);
    }
    // components/Footer.tsx
    export default function Footer() {return (<footer className="w-full h-12 bg-yellow-300 flex items-center justify-center"><p className="text-gray-800">© 2023 版权所有</p></footer>);
    }

    2、创建布局组件(可选但推荐)

    // components/Layout.tsx
    import Header from './Header';
    import Footer from './Footer';export default function Layout({ children }: { children: React.ReactNode }) {return (<div className="min-h-screen flex flex-col"><Header /><main className="flex-1 p-4">{children}</main><Footer /></div>);
    }

    3、在页面中使用

    home 页面:

    // app/home/page.tsx
    import Layout from '@/components/Layout';export default function HomePage() {return (<Layout><section className="max-w-4xl mx-auto"><h2 className="text-2xl font-bold mb-4">首页内容</h2><p>这里是首页的内容...</p></section></Layout>);
    }

    about 页面:

    // app/about/page.tsx
    import Layout from '@/components/Layout';export default function AboutPage() {return (<Layout><section className="max-w-4xl mx-auto"><h2 className="text-2xl font-bold mb-4">关于我们</h2><p>这里是关于我们的内容...</p></section></Layout>);
    }

    方法二、使用根布局 (App Router 特有)

    1、修改根布局

    // app/layout.tsx
    import Header from '@/components/Header';
    import Footer from '@/components/Footer';export default function RootLayout({children,
    }: {children: React.ReactNode;
    }) {return (<html lang="zh-CN"><body className="min-h-screen flex flex-col"><Header /><main className="flex-1">{children}</main><Footer /></body></html>);
    }

    2、页面内容会自动嵌入

    这样所有页面都会自动包含 Header 和 Footer,无需在每个页面单独引入。

    方法三、使用模板组件

    如果你需要某些页面有不同的布局:

    // app/template.tsx
    'use client';import Header from '@/components/Header';
    import Footer from '@/components/Footer';export default function Template({ children }: { children: React.ReactNode }) {return (<div className="min-h-screen flex flex-col"><Header /><main className="flex-1 p-4">{children}</main><Footer /></div>);
    }

    然后在页面中使用:

    // app/about/page.tsx
    import Template from '@/app/template';export default function AboutPage() {return (<Template><section className="max-w-4xl mx-auto"><h2 className="text-2xl font-bold mb-4">关于我们</h2><p>这里是关于我们的内容...</p></section></Template>);
    }

    【1】最佳实践建议

    1. 推荐使用方法一(独立组件+布局组件):

      • 灵活性最高

      • 可以轻松在某些页面中隐藏 Header/Footer

      • 便于维护和更新

    2. 如果 Header/Footer 在所有页面都相同

      • 可以使用方法二(根布局)

      • 最简单直接

    3. 需要不同变体时

      • 可以创建多个布局组件(如 LayoutWithNavSimpleLayout

      • 根据页面需求选择不同布局

    这样配置后,你的 about 页面将自动复用 home 页面的头部和底部,同时保持代码的整洁和可维护性。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/80950.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    PHP基础知识

    【学习资料】 视频&#xff1a; https://www.bilibili.com/video/BV1Xh411S7G1?spm_id_from333.788.videopod.episodes&vd_sourcebe26b82da70367069ab00d6db4f4ffc0 文档&#xff1a;https://www.runoob.com/php/php-tutorial.html 目录 1&#xff0c;PHP是什么2&#xff…

    国内MCP服务平台推荐 AIbase推出MCP服务器客户端商店

    在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度发展&#xff0c;不断改变着我们的生活和工作方式。2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP(Model Context Protocol&#xff0c;模型上下文协议)的广泛应用。这一技术…

    在文件检索方面doris和elasticsearch的区别

    apache Doris 与 Elasticsearch 在文件检索领域的差异源于技术架构与定位目标的本质区别,以下从核心维度对比分析二者的技术特性: 一、 ‌架构设计与定位差异‌ ‌维度‌‌Apache Doris‌‌Elasticsearch‌‌核心架构‌分布式 MPP 列式分析引擎,面向 OLAP 优化分布式倒排索…

    鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

    使用UniApp打造多功能图表展示组件 在当前移动应用开发领域&#xff0c;数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标&#xff0c;一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架&#xff0c;如何在其中实现…

    AI Agent开发第67课-彻底消除RAG知识库幻觉-文档分块全技巧(1)

    开篇 在上篇《AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG》放出后,网友们反响很大。有得告诉我:原来还有Rewrite这么一招?早知道这一招很多之前的一些遗留问题都能解决了。不过在上一篇结尾我已经提到了,要真正解决一个AI Agent在响应时产生的幻觉我们用提示语…

    NHANES指标推荐:OBS

    文章题目&#xff1a;Association between oxidative balance score and all-cause and cancer-specific mortality among cancer survivors DOI&#xff1a;10.3389/fimmu.2025.1541675 中文标题&#xff1a;癌症幸存者氧化平衡评分与全因死亡率和癌症特异性死亡率之间的关联 …

    主流快递查询API横向对比:快递100快递鸟菜鸟物流接口差异解析

    主流快递查询API横向对比&#xff1a;快递100/快递鸟/菜鸟物流接口差异解析 一、核心功能与适用范围 菜鸟API 核心功能&#xff1a;物流信息查询、电子面单打印、智能仓储管理、跨境物流服务&#xff0c;整合阿里生态资源&#xff08;如淘宝、天猫订单直接对接&#xff09;。…

    解决:npm install报错,reason: certificate has expired

    目录 1. 问题分析2. 问题解决2.1 查看配置的镜像2.2 修改镜像源 种一棵树最好的时间是10年前&#xff0c;其次就是现在&#xff0c;加油&#xff01; --by蜡笔小柯南 1. 问题分析 启动前…

    缓存(5):常见 缓存数据淘汰算法/缓存清空策略

    主要的三种缓存数据淘汰算法 FIFO(first in first out)&#xff1a;先进先出策略&#xff0c;最先进入缓存的数据在缓存空间不够的情况下&#xff08;超出最大元素限制&#xff09;会被优先被清除掉&#xff0c;以腾出新的空间接受新的数据。策略算法主要比较缓存元素的创建时…

    Spring框架的事务管理

    引言 在企业级应用开发中&#xff0c;事务管理是一个至关重要的环节&#xff0c;它确保了数据的一致性和完整性。Spring 框架为我们提供了强大而灵活的事务管理功能&#xff0c;能够帮助开发者更轻松地处理复杂的事务场景。本文将深入探讨 Spring 框架的事务管理&#xff0c;包…

    FPGA: UltraScale+ bitslip实现(ISERDESE3)

    收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…

    用 wireshark 解密 SIP over TLS 以及 SRTP 解密

    --todo 有空再搞 MicroSIP 向 FreeSWITCH 注册&#xff0c;transport 设置为 tls 同时 Media Encryption 设置为强制 FreeSWITCH 做一个这样的路由&#xff1a; <action application"set" data"rtp_secure_mediaoptional"/> <action applicat…

    Delphi 12.3调用Chrome/edge内核实现DEMO源码

    DELPHI使用调用Chrome/Edge内核浏览器&#xff0c;虽然旧的WebBrowser也还可以用&#xff0c;但大势所趋&#xff0c;新版的已经不需要使用第三方的组件了&#xff0c;算是全内置的开发了&#xff0c;不废话 Unit1 源码 Form 源码 unit Unit1;interfaceusesWinapi.Windows, W…

    快速搭建一个electron-vite项目

    1. 初始化项目 在命令行中运行以下命令 npm create quick-start/electronlatest也可以通过附加命令行选项直接指定项目名称和你想要使用的模版。例如&#xff0c;要构建一个 Electron Vue 项目&#xff0c;运行: # npm 7&#xff0c;需要添加额外的 --&#xff1a; npm cre…

    26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述

    26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述 文章目录 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述1.1 计算机的发展1.2 计算机硬件和软件1.2.1 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结构1.2.5 计算机系统…

    01-数据结构概述和时间空间复杂度

    数据结构概述和时间空间复杂度 1. 什么是数据结构 数据结构&#xff08;Data Structure&#xff09;是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法 算法&#xff08;Algorithm&#xff09;就是定义良好的计算…

    大数据架构选型全景指南:核心架构对比与实战案例 解析

    目录 大数据架构选型全景指南&#xff1a;核心架构对比与实战案例解析1. 主流架构全景概览1.1 核心架构类型1.2 关键选型维度 2. 架构对比与选型矩阵2.1 主流架构对比表2.2 选型决策树 3. 案例分析与实现案例1&#xff1a;电商实时推荐系统&#xff08;Lambda架构&#xff09;案…

    (51单片机)LCD显示红外遥控相关数字(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)

    前言&#xff1a; 本次Timer0模块改装了一下&#xff0c;注意&#xff01;&#xff01;&#xff01;今天只是简单的实现一下&#xff0c;明天用次功能显示遥控密码锁 演示视频&#xff1a; 在审核 源代码&#xff1a; 如上图将9个文放在Keli5 中即可&#xff0c;然后烧录在…

    网络实验-防火墙双机热备份

    实验目的 了解防火墙双机热备份配置&#xff0c;提供部署防火墙可靠性。 网络拓扑 左侧为trust域&#xff0c;右侧为untrust域。防火墙之间配置双机热备份。 配置内容 master VRRP 由于防火墙是基于会话表匹配回程流量&#xff0c;流量去向和回程必须通过同一个防火墙。…

    【2025最新】VSCode Cline插件配置教程:免费使用Claude 3.7提升编程效率

     2025年最新VSCode Cline插件安装配置教程&#xff0c;详解多种免费使用Claude 3.7的方法&#xff0c;集成DeepSeek-R1与5大实用功能&#xff0c;专业编程效率提升指南。 Cline是VSCode中功能最强大的AI编程助手插件之一&#xff0c;它能与Claude、OpenAI等多种大模型无缝集…