当前位置: 首页 > article >正文

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 页面的头部和底部,同时保持代码的整洁和可维护性。

    相关文章:

    next.js实现项目搭建

    一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目&#xff1a; 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...

    Redisson 四大核心机制实现原理详解

    一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…...

    云鼎入鼎系统:一站式电商管理解决方案

    个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…...

    Leetcode134加油站

    题目链接 134 题意图解&#xff1a; 题目给了n个节点&#xff0c;这些节点呈现环状&#xff0c;每次到一个低点要消耗cost[i]的油量。 从中我们可以得出一个结论&#xff1a;看一个点能不能到下一个点&#xff0c;就要用当前的油量减去消耗的量&#xff0c;那么gas[i] - cost…...

    关于Android Studio for Platform的使用记录

    文章目录 简单介绍如何使用配置导入aosp工程配置文件asfp-config.json 简单介绍 Android Studio for Platform是google最新开发&#xff0c;用来阅读aosp源码的工具 详细的资料介绍&#xff1a; https://developer.android.google.cn/studio/platform 将工具下载下来直接点击…...

    Linux的内存泄漏问题及排查方法

    内存泄漏是指在计算机程序中&#xff0c;已不再被使用的内存未被正确释放&#xff0c;导致内存占用随时间累积&#xff0c;进而引发系统内存不足、性能下降甚至崩溃的问题。在Linux系统中&#xff0c;开发者和运维人员可通过以下方法排查和解决内存泄漏问题&#xff1a; 1. 使…...

    uniapp 微信小程序 获取openId

    嗨&#xff0c;我是小路。今天主要和大家分享的主题是“uniapp 微信小程序 获取openId”。 一、主要属性 1.uni.login 二、实例代码 1、前端代码 uni.login({provider: weixin,success: (res) > {uni.showLoading({title: 登录中...,mask: true})let code res.…...

    隧道结构安全在线监测系统解决方案

    一、方案背景 隧道是地下隐蔽工程&#xff0c;会受到潜在、无法预知的地质因素影响。随着我国公路交通建设的发展&#xff0c;隧道占新建公路里程的比例越来越大。隧道属于线状工程&#xff0c;有的规模较大&#xff0c;可长达几公里或数十公里&#xff0c;往往穿越许多不同环境…...

    Docker 运维管理

    Docker 运维管理 一、Swarm集群管理1.1 Swarm的核心概念1.1.1 集群1.1.2 节点1.1.3 服务和任务1.1.4 负载均衡 1.2 Swarm安装准备工作创建集群添加工作节点到集群发布服务到集群扩展一个或多个服务从集群中删除服务ssh免密登录 二、Docker Compose与 Swarm 一起使用 Compose 三…...

    【Redis】快速列表结构

    目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 redis的quicklist&#xff08;快速列表&#xff09;是一个双向链表&#xff0c;其中每个节点都是一个ziplist&#xff08;压缩列表&#xff09;。这中结构结合了双向链表和压缩列表的优点&#xff0c;在内存…...

    阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统

    在电商行业数据驱动决策的趋势下&#xff0c;高效获取商品详情数据成为企业洞察市场、优化运营的关键。通过阿里巴巴 1688 数据接口构建自动化商品详情采集系统&#xff0c;能够快速、精准地采集海量商品信息。本文将从开发准备、接口分析、代码实现等方面&#xff0c;详细介绍…...

    [SpringBoot]Spring MVC(2.0)

    紧接上文&#xff0c;这篇我们继续讲剩下的HTTp请求 传递JSON数据 简单来说&#xff1a;JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换 JSON的语法 1. 数据在 键值对(Key/Value) …...

    Golang的网络安全策略实践

    Golang的网络安全策略实践 一、理解网络安全的重要性 当今的网络环境中&#xff0c;安全问题日益突出&#xff0c;各种类型的攻击如雨后春笋般涌现&#xff0c;给个人和组织的信息资产造成了严重威胁。因此&#xff0c;制定和实施有效的网络安全策略至关重要。 二、Golang在网络…...

    STM32外设AD-轮询法读取模板

    STM32外设AD-轮询法读取模板 一&#xff0c;什么是轮询&#xff1f;1&#xff0c;轮询法的直观理解2&#xff0c;轮询法缺点 二&#xff0c;CubeMX配置三&#xff0c;模板移植1&#xff0c;adc_app.c文件2&#xff0c;变量声明1&#xff0c;adc_app.c中2&#xff0c;mydefine.h…...

    C++编程this指针练习

    这段代码是用 C 编写的&#xff0c;定义了一个 Car 类&#xff08;类是 C 中用于创建对象的蓝图&#xff09;&#xff0c;并通过 main() 函数创建和使用了该类的对象。下面是对整个程序的逐行解释&#xff0c;并在关键部分加上注释说明。 ✅ 代码整体功能&#xff1a; 定义一个…...

    iOS音视频解封装分析

    首先是进行解封装的简单的配置 /// 解封装配置 class KFDemuxerConfig {// 媒体资源var asset: AVAsset?// 解封装类型&#xff0c;指定是音频、视频或两者都需要var demuxerType: KFMediaType .avinit() {} }然后是实现解封装控制器 import Foundation import CoreMedia i…...

    突破智能驾舱边界,Imagination如何构建高安全GPU+AI融合计算架构

    日前&#xff0c;“第十二届汽车电子创新大会暨汽车芯片产业生态发展论坛&#xff08;AEIF 2025&#xff09;”在上海顺利举办。大会围绕汽车前沿性、关键性和颠覆性技术突破&#xff0c;邀请行业众多专家学者&#xff0c;分享与探讨了汽车电子产业的技术热点与发展趋势。在5月…...

    DeepSeek 如何实现 128K 上下文窗口?

    DeepSeek 如何实现 128K 上下文窗口&#xff1f;长文本处理技术揭秘 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 DeepSeek 如何实现 128K 上下文窗口&#xff1f;长文本处理技术揭秘摘要引言技术架构解析1. 动态…...

    云计算简介:从“水电”到“数字引擎”的技术革命

    云计算简介&#xff1a;从“水电”到“数字引擎”的技术革命 在当今数字化浪潮中&#xff0c;云计算早已从一个技术概念演变为支撑现代社会运转的核心基础设施。无论是你手机里的天气预报、电商购物的推荐系统&#xff0c;还是企业内部的ERP系统&#xff0c;背后都离不开云计算…...

    计算圆周率 (python)

    使用模特卡罗方法&#xff08;模拟法&#xff09;&#xff0c;模拟撒点100000次&#xff0c;计算圆周率π 输入格式: 一个整数&#xff0c;表示随机数种子 输出格式: 计算的π值&#xff0c;结果小数点后保留5位数字 输入样例: 在这里给出一组输入。例如&#xff1a; 10…...

    Python 实现图片浏览和选择工具

    实现将截图预览&#xff0c;并按照顺序加入一个pdf文件中&#xff0c;实现照片管理尤其对于喜欢看教程截图做笔记的网友们。 C:\pythoncode\new\python-image-pdf-processor.py 界面展示 &#x1f9f1; 一、核心结构概述 主类 ImageViewer(wx.Frame) 是主窗口类&#xff0c;…...

    Python实现的在线词典学习工具

    Python实现的在线词典学习工具 源码最初来自网络&#xff0c;根据实际情况进行了修改。 主要功能&#xff1a; 单词查询 通过Bing词典在线获取单词释义&#xff08;正则提取网页meta描述&#xff09;&#xff0c;支持回车键快速查询 内置网络请求重试和异常处理机制 在线网页…...

    ES常识9:如何实现同义词映射(搜索)

    在 Elasticsearch&#xff08;ES&#xff09;中实现同义词映射&#xff08;如“美丽”和“漂亮”&#xff09;&#xff0c;核心是通过 同义词过滤器&#xff08;Synonym Token Filter&#xff09; 在分词阶段将同义词扩展或替换为统一词项&#xff0c;从而让搜索时输入任意一个…...

    BGP综合实验(2)

    一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

    java实现poi-ooxml导出Excel的功能

    文章目录 1. 添加poi-ooxml依赖2. Excel导出工具类3.核心逻辑说明4.扩展建议5.HSSF、XSSF、SXSSF 的核心原则和场景建议&#xff0c;帮助你在不同需求下快速决策&#xff1a; 以下是一个基于 Apache POI 实现的简单、通用的Java导出Excel工具类&#xff0c;代码逻辑清晰且注释详…...

    代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

    图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图&#xff0c;若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问&#xff0c;在这个陆地的基础上进行 DFS 方法&#xff0c;或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…...

    【占融数科-注册/登录安全分析报告】

    前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

    【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)

    C. Nikita and LCM 题目&#xff1a; 思路&#xff1a; 非常好的思维题&#xff0c;顺便复习了一下快速枚举因数和lcm的性质 我们先来看答案的上界&#xff0c;即全选&#xff0c;此时说明 lcm(a1,a2,a3,...) > a_max 其中 a_max 为 a 中最大的数&#xff0c;那么如果答案不…...

    基于requests_html的python爬虫

    前言&#xff1a;今天介绍一个相对性能更高的爬虫库requests_html&#xff0c;会不会感觉和requests有点联系&#xff1f;是的。为什么开始不直接介绍呢&#xff1f;因为我觉得requests是最基本入门的东西&#xff0c;并且在学习过程中也能学到很多东西。我的python老师在介绍这…...

    循环神经网络:捕捉序列数据中的时间信息

    目录 循环神经网络&#xff1a;捕捉序列数据中的时间信息 一、循环神经网络的基本概念 &#xff08;一&#xff09;RNN 的基本结构 &#xff08;二&#xff09;RNN 的工作原理 &#xff08;三&#xff09;RNN 的优势 &#xff08;四&#xff09;RNN 的局限性 二、循环神…...