【react框架】跟我一起速读Next.js官方入门教学课程文档

news2025/6/19 9:30:04

文章目录

  • 前言
  • 目录结构
  • 样式方案
    • 正常引入样式文件
    • Tailwind方案
    • CSS Modules方案
    • clsx方案
  • 文字和图片优化
    • 文字
    • 图片
  • Pages和Layout的机制
    • Pages
    • Layout
  • 通过Link组件改变路由并且拆分打包
  • 提供Hooks
  • 未完待续...

前言

对于那些对Next.js一无所知的前端伙伴来说,最佳的快速入门方法无疑是官方提供的交互式入门教程文档。尽管如此,由于官方教程至今未提供中文版本,这无疑增加了中文用户的学习难度。为了帮助大家节省宝贵的时间,我决定亲自深入学习这些材料,并将我所学到的关键信息整理成文。通过阅读我的文章,你也能迅速掌握Next.js的核心要点。

当然学Next.js之前你必须会CRA创建的React项目。

官方入门文档地址:https://nextjs.org/learn/dashboard-app/getting-started

文档如果有错误欢迎指正!


目录结构

如何去初始化一个Next.js项目我就不记录了,很简单。我们还是先看目录结构吧。

初始化工程的目录为:

在这里插入图片描述
/app 这个文件夹里放的是我们开发中大部分手写的代码。内部还可以继续细化为:

  • /app/lib 放js文件,例如一些工具函数,API文件等
  • /app/ui 放组件,例如公共组件、业务组件等

/public 放静态资源,例如图片

/script 放一些数据有关的脚本

/next.config.mjs 在里头可以添加或者修改Webpack设置

其他文件咱们下面讲到对应章节再补充说明~


样式方案

Next对样式的编写提供和推荐了一些方案。

正常引入样式文件

Next给默认设置了路径别名,所以你只需要这样引入样式文件:

import '@/app/ui/global.css';

Tailwind方案

这个库有多火就不说了,不是文章重点学习部分,大概意思就是这个库帮你编写了很多类名的css样式,例如你想要某个h1标签的文字颜色为蓝色且字重为500,那么你就可以这样写:

<h1 className="text-blue-500">I'm blue!</h1>

这样就会自动加上css规则。

感兴趣的自己去看吧,官方文档地址为:https://tailwindcss.com/

CSS Modules方案

这个是CRA创建时默认的CSS隔离方案,就不多说了。

clsx方案

这个库就是方便我们在写class的时候做一些条件判断,例如文档中的例子:

import clsx from 'clsx';
 
export default function InvoiceStatus({ status }: { status: string }) {
  return (
    <span
      className={clsx(
        'inline-flex items-center rounded-full px-2 py-1 text-sm',
        {
          'bg-gray-100 text-gray-500': status === 'pending',
          'bg-green-500 text-white': status === 'paid',
        },
      )}
    >
    // ...
)}

是不是比写什么三元表达式清晰很多。感兴趣的可以查看官方文档:https://www.npmjs.com/package/clsx

综上所述,在Next应用中,使用这些样式方案基本能满足我们的需求了。


文字和图片优化

Next自动的对文字和图片做了很好的优化,减少我们平时对这方面的处理工作。

文字

假如我们需要用自定义的字体,那么会有两个问题:

  • 页面第一次加载资源的时候,需要拉取和加载自定义文字的文件。
  • 当文字文件解析完后,页面会有一个文字替换的过程。但因为文字的行高、独特的大小与字重,从旧文字切换到新文字的时候,页面的布局或多或少会发生偏移。

Next帮我们处理了上述的问题,并且能够做到第一次加载页面不会拉取文字文件的同时直接显示的就是我们的自定义字体。

做法是,首先创建一个文件来引入教程给我们预装好的字体文件/app/ui/fonts.ts

import { Inter, Lusitana } from 'next/font/google'; // 如果是我们自己的字体如何引入?这点我后续有空了尝试下,先按照教材的理解即可
 
export const inter = Inter({ subsets: ['latin'] }); // 这个意思是从这个字体中提取latin这一个模块的字体

export const lusitana = Lusitana({ // 还可以设定一些属性
  weight: ['400', '700'],
  subsets: ['latin'],
});

然后我们给全局的latin文字替换成我们自定义的latin字体,只需要在/app/layout.tsx中引入并使用:

import '@/app/ui/global.css';
import { inter } from '@/app/ui/fonts';
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={`${inter.className} antialiased`}>{children}</body>
    </html>
  );
}

同时官方还推荐使用Tailwind的antialiased类名,让文字看起来更加平滑清晰。在其他子组件使用也是一样的方式。

字体属性的设定有很多,具体可以参考官方文档:https://nextjs.org/docs/app/api-reference/components/font#font-function-arguments

还有文档中提到好像有些属性对谷歌某些字体是没有用的,具体要上谷歌字体官网上去查看(需翻墙):https://fonts.google.com/

图片

首先图片资源官方要求放在/public目录里。Next提供了Image组件供我们使用,例如:

import Image from 'next/image';
 
export default function Page() {
  return (
    // ...
    <div className="flex items-center justify-center p-6 md:w-3/5 md:px-28 md:py-12">
      <Image
        src="/hero-desktop.png"
        width={1000}
        height={760}
        className="hidden md:block"
        alt="Screenshots of the dashboard project showing desktop version"
      />
    </div>
    //...
  );
}

通过这种使用方式,Next会帮我们做好几件事:

  • 图片从无到加载出来的过程,页面布局不会出现变化
  • 能够适配不同视口的大小
  • 自带懒加载
  • 如果浏览器支持webp,自动提供webp格式

不过我看这个设备屏幕大小适配的问题是通过Tailwind的hidden md:block去解决的?默认隐藏,当视口达到设定的md大小就显示。这点我以后有空验证下。


Pages和Layout的机制

Pages

Next设置了一个由文件结构决定路由地址的机制。例如文章中给的例子:
在这里插入图片描述
这个路由会顺着文件夹里的invoices中找到page.ts文件,文件里面就写组件代码即可,会自动的渲染到页面上。

所以当页面创建多了后,关系参考如下:
在这里插入图片描述
看明白了吧~

Layout

这个组件的作用就是可以把子页面的page组件嵌套在里面,你可以这么理解,Next的路由文件查找机制其实是这样的:

  • 首先沿着路由地址一路过一遍文件夹,例如url=/dashboard/invoices
  • 如果一路都是page.ts,那么找invoices里的page.tsx当做对应的页面。
  • 如果路上有layout.tsx,那么其实是把layout.tsx当做对应的父级页面,然后layout.tsx里的children props变量就是子层级文件夹里page.tsx这个组件。这样page.tsx被嵌在layout.tsx显示在页面上。

来看看layout.tsx代码官方的示例:

import SideNav from '@/app/ui/dashboard/sidenav';
 
export default function Layout({ children }: { children: React.ReactNode }) {
  return (
    <div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
      <div className="w-full flex-none md:w-64">
        <SideNav /> // 公共组件
      </div>
      <div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div> // = page.tsx
    </div>
  );
}

同理其他子页面也是一样的,梳理他们之间的关系如下:
在这里插入图片描述
这种方式去渲染页面能够做到子组件更新时,父组件不会更新的好处。

所以我的理解是,当你一个页面需要嵌套子组件的时候,就适合用layout组件,当然最大的layout组件在/app里,和他平级的page.ts应该是嵌套在layout组件里(有空时我去验证下)。


通过Link组件改变路由并且拆分打包

Next给我们提供了Link组件去修改路由地址,使用方式:

import Link from 'next/link';
 
// ...
 
export default function NavLinks() {
  return (
    <>
      {links.map((link) => {
        const LinkIcon = link.icon;
        return (
          <Link
            key={link.name}
            href={link.href}
            className="..."
          >
            <LinkIcon className="w-6" />
            <p className="hidden md:block">{link.name}</p>
          </Link>
        );
      })}
    </>
  );
}

这个组件的好处是:Next打包的时候,会自动的通过路由去拆分文件,并且不会一下子全部拉取。如果当前页面有Link组件,那么会在背后偷偷预拉取对应的组件代码,等用户点击后直接渲染。


提供Hooks

Next提供了很多hooks供我们使用,例如与路由有关的示例:

'use client'; // 这个意思好像是说这个文件只在浏览器端加载,不作为SSR
 
import { usePathname } from 'next/navigation';
 export default function NavLinks() {
  const pathname = usePathname(); // 获取路由地址
  // ...
}
// ...

未完待续…

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

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

相关文章

IPsec VPN配置方式

一、手工方式建立 手工方式建立IPsec的场景&#xff0c;全部参数需要手工配置&#xff0c;工作量大&#xff0c;适用于小型静态网络。 当企业总部与分支通过FW1和FW2之间建立的IPsec隧道进行安全通信。 手工配置步骤主要有四个&#xff1a; ①定义需要保护的数据流&#xff1…

使用 Mendix 中的 OIDC 模块集成 Azure AD SSO

前言 在当今快速发展的数字化世界中&#xff0c;企业追求高效率和灵活性已成为常态。Mendix&#xff0c;作为一个先进的低代码开发平台&#xff0c;正是企业快速响应市场需求、加速数字化转型过程的利器。通过其直观的可视化开发环境&#xff0c;即使是非技术背景的用户也能设…

c#触发事件

Demo1 触发事件 <Window x:Class"WPFExample.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"WPF Example" Height"600" Wi…

谷歌 Gemma 安装教程

目录 一、概述 二、安装 Ollama 三、安装 Docker 四、安装 Open WebUI 五、测试 结束 一、概述 Gemma 是谷歌推出了全新的开源模型。Gemma 是免费的&#xff0c;模型权重也一并开源了&#xff0c;并且允许商用&#xff0c;支持安装在本地&#xff0c;即使了断网依然使用…

PyQt5开发基础知识【一】

零.前言&#xff1a; 作者写这篇博客的目的主要在于巩固PyQt5的基础知识&#xff0c;例如PyQt5的几个核心模块&#xff0c;分别有什么功能&#xff0c;PyQt5的所有控件的使用方法等。 一.PyQt5的常见模块 1.1QtCore&#xff1a; 该模块包含了非GUI的功能设计。 这个模块被…

二 centos 7.9 磁盘挂载

上一步 一 windso10 笔记本刷linux cent os7.9系统-CSDN博客 笔记本有两个盘,系统装在128G的系统盘上,现在把另外一个盘挂载出来使用 lsblk 发现磁盘已经分好了,直接挂载就好了,参考文章:Centos7.9 挂载硬盘_centos7.9挂载硬盘-CSDN博客 永久挂载 lsblk -f分区格式化 mkfs…

图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)

目录 效果展示 游玩链接&#xff08;无需安装图形库及VS&#xff09; 开发环境及准备 1.VS2022版本 2.图形库 游戏初始化 1.头文件 2.创建窗口 3.主函数框架 开始界面函数 1.初始化 1-1.设置背景颜色及字体 1-2.处理背景音乐及图片素材 1-3.处理背景图位置 2.选…

数据结构从入门到精通——队列

队列 前言一、队列1.1队列的概念及结构1.2队列的实现1.3队列的实现1.4扩展 二、队列面试题三、队列的具体实现代码Queue.hQueue.ctest.c队列的初始化队列的销毁入队列出队列返回队头元素返回队尾元素检测队列是否为空检测元素个数 前言 队列是一种特殊的线性数据结构&#xff…

141 Linux 系统编程18 ,线程,线程实现原理,ps –Lf 进程 查看

一 线程概念 什么是线程 LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下) 进程&#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的PCB&#xff0c;但没有独立的地址空间(共享) 区别&#xff1a;在于是否共…

1、Ajax、get、post、ajax,随机颜色

一、Ajax初始 1、什么是Ajax&#xff1f; 异步的JavaScript和xml 2、xml是什么&#xff1f; 一种标记语言&#xff0c;传输和存储数据----------现在用JSON传输数据 3、Ajax的作用 局部加载 可以使网页异步更新 4、Ajax的原理或者步骤(6步) 创建Ajax对象 if (window.X…

【BUG】删除git本地仓库/远程仓库历史版本中的大文件以减少仓库大小

目录 前言排查过程解决过程通过如下命令查找历史大文件删除大文件&#xff0c;重构历史版本提交添加.ignore文件 总结 前言 某天像往常一样提交代码到gitee仓库&#xff0c;出现代码提交卡住不到的情况 2. 我百思不得姐&#xff0c;坚信bug会自己修复自己的原则等待了5分钟&am…

Python 一步一步教你用pyglet仿制鸿蒙系统里的时钟

目录 鸿蒙时钟 1. 绘制圆盘 2. 创建表类 3. 绘制刻度 4. 刻度数值 5. 添加指针 6. 转动指针 7. 联动时间 8. 时钟走动 鸿蒙时钟 本篇将用python pyglet库复刻华为手机鸿蒙系统闹钟程序的时钟&#xff0c;先在上图中抓取出时分秒针及刻度、表盘的颜色RGB值&#xff1a…

分布式解决方案

目录 1. 分布式ID1-1. 传统方案1-2. 分布式ID特点1-3. 实现方案1-4. 开源组件 1. 分布式ID 1-1. 传统方案 时间戳UUID 1-2. 分布式ID特点 全局唯一高并发高可用 1-3. 实现方案 方案总结&#xff1a; 号段模式 有两台服务器&#xff0c;给第一台服务器分配0-100&#xff0…

考虑局部遮阴的光伏PSO-MPPT控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 简介 光伏电池阵列的输出特性曲线不是线性变化的。当光伏电池遮荫时&#xff0c;产生的功 率会不断变化&#xff0c;致使光伏电池阵列的输出功率不断变化&#xff0c;其输出特性曲线呈现多峰值的现象。 多峰…

外包干了30天,技术明显退步。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这次来聊一个大家可能也比较关心的问题&#xff0c;那就是就业城市选择的问题。而谈到这个问题&a…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…

Day24:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

目录 文件管理模块-上传-过滤机制 文件管理模块-显示-过滤机制 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技术&#xff1a;输入输出&#…

示波器探头的使用

无源探头(Tektronix P2220) 阻抗&#xff1a;1Mhz 衰减&#xff1a;10:1/1:1(与探头上的档位X10/X1相关&#xff0c;如果探头没有档位默认为10:1) 探头型号&#xff1a;电压 高压差分探头&#xff08;Tektronix P5200A) 阻抗&#xff1a;1Mhz 衰减&#xff1a;50:1/500:1(…

深入理解python之self

首先明确的是self只有在类的方法中才会有&#xff0c;独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的&#xff0c;虽然在调用时不必传入相应的参数。 self名称不是必须的&#xff0c;在python中self不是关键词&#xff0c;你可以定义成a或b或其它名字都可…

Qt 定时器事件

文章目录 1 定时器事件1.1 界面布局1.2 关联信号槽1.3 重写timerEvent1.4 实现槽函数 启动定时器 2 定时器类 项目完整的源代码 QT中使用定时器&#xff0c;有两种方式&#xff1a; 定时器类&#xff1a;QTimer定时器事件&#xff1a;QEvent::Timer&#xff0c;对应的子类是QTi…