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

文章目录

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

前言

对于那些对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字体(好像是替换英文和阿拉伯数字),只需要在/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(); // 获取路由地址
  // ...
}
// ...

通过Vercel创建数据

首先我们要知道什么是Vercel,这里我找AI介绍了下:

Vercel 是一个平台,提供静态和 Jamstack网站的托管服务。它支持多种前端框架,如Next.js、Nuxt.js、Gatsby等,并且能够实现快速部署、服务器端渲染和自动化的性能优化。Vercel 通过其全球分布式的边缘网络(Edge Network)来加速内容的交付,确保用户能够快速加载网站内容。

Vercel 还提供了集成的连续部署功能,允许开发者在代码推送至GitHub、GitLab或Bitbucket等版本控制系统后自动构建和部署网站。此外,Vercel 还提供了一些高级功能,如路由、重写规则、环境变量管理以及HTTPS证书等,使得开发者可以轻松管理他们的网站。

咱们这个Next.js也是属于Vercel下的!

首先咱们把我们的Next应用推到自己的github仓库。

然后去Vercel网站创建账号,把github上的仓库关联到Vercel中,然后选中我们的Next应用仓库,导入:

在这里插入图片描述

接着部署:

在这里插入图片描述
成功后会有一个这样的页面:

如果出现部署失败,基本上问题就是要去修改一个文件的配置tsconfig.json

    "baseUrl": '.',
    "paths": {
		"@/*" : ["./*"],
		"@/app/*": ["app/*"]
	}

未完待续…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发(二)-项目结构

鸿蒙开发(二)-项目结构 上篇文章我们讲了如何配置鸿蒙开发的基础环境&#xff0c;以及创建了第一个鸿蒙程序。 这篇我们讲述了鸿蒙应用的项目目录结构。 如图所示&#xff1a;我们切换项目project可以看到。 另一种则是Ohos模式: AppScope->app.json5 应用的全局配置 {&q…

华为新发布磁电存储“王炸”,到底是什么?

最近&#xff0c;在巴塞罗那举行的2024年世界移动通信大会&#xff08;MWC24&#xff09;上&#xff0c;华为数据存储产品线总裁周彼得博士介绍了这款即将面世的产品。他向听众表示&#xff0c;与磁带存储相比&#xff0c;该设备可以降低20%的总连接成本&#xff0c;而与硬盘相…

DHCP中继实验(华为)

思科设备参考&#xff1a; 一&#xff0c;技术简介 DHCP中继&#xff0c;可以实现在不同子网和物理网段之间处理和转发DHCP信息的功能。如果DHCP客户机与DHCP服务器在同一个物理网段&#xff0c;则客户机可以正确地获得动态分配的IP地址。如果不在同一个物理网段&#xff0c;…

Web渗透测试流程

什么是渗透测试 渗透测试 (penetration test),是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#xff0c;这个分析是从一个攻击者可能存在的位置来进行的&#xff0c;并且从这个…

机器学习第29周周报 Beyond Dropout

文章目录 week29 Beyond Dropout摘要Abstract一、泛化理论二、文献阅读1. 题目2. abstract3. 网络架构3.1 特征图失真3.2 失真优化 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 全连接层实验4.3.2 卷积网络上的实验 4.4 结论 小结参考文献 week29 Beyond Dropout …

国产硅片膜厚检测仪

硅片膜厚检测仪是半导体行业中一种至关重要的设备&#xff0c;用于精确测量硅片上薄膜的厚度。在半导体制造工艺中&#xff0c;薄膜厚度的控制对于保证器件性能和可靠性具有决定性的作用。因此&#xff0c;硅片膜厚检测仪的研发和应用对于推动半导体技术的发展具有重要意义。 一…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器&#xff0c;可以构建灵活高效的查询条件&#xff0c;可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xf…

苍穹外卖-day01

苍穹外卖-day01 目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了&#xff0c;怎么办&#xff1f;什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏&#xff0c;都是干货满满的。 手撕数据结构专栏…

账号管理支持批量测试资产可连接性,资产管理支持通过标签方式选择资产,JumpServer堡垒机v3.10.4 LTS版本发布

2024年3月4日&#xff0c;JumpServer开源堡垒机正式发布v3.10.4 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.4 LTS版本中&a…

Chrome中如何导出和导入书签

导出书签 如下图所示&#xff1a; 右上角三点->书签和清单->书签管理器->右上角三点->导出书签 然后你选择保存地址即可。打开后如下&#xff1a; 导入书签 如下图所示&#xff1a; 右上角三点->书签和清单->导入书签和设置->选择以前导出的书签&…

基于Vue移动端电影票务服务APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 Vue框架 3 1.2 数据库MongoDB 3 1.3 Axios请求 3 1.4 H5、CSS3和JavaScript 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 5 2.3 用户功能 6 2.4本章小结 6 3 基于Vue电影票务服务APP设计 7 3.1 页面设计 …

DFS和BFS以及练习题目(未完待续)

DFS和BFS 温馨提示&#xff1a;学习dfs之前最好先了解一下递归的思想。 递归思想 斐波那契 题目分析 题目代码 import java.util.Scanner; public class Main{static long dp[]; public static void main(String[] args) {Scanner scanner new Scanner(System.in);int t…

手机号验证码重新发送

前文叙述 很久以前做的一个 demo &#xff0c;纯 HTML 、CSS、js 制作&#xff0c;一定时间段之后才可以重新发送验证码&#xff0c;如 60s 后再次发送验证码&#xff0c;在该时间段内发送验证码按钮为禁用状态&#xff0c;实战开发过程也亦是同理&#xff0c;因此记录一手。 一…

供应商评价与选择改进研究——21年数学建模国赛C题分析

题目描述 问题一分析&#xff08;基于APH、PCA和TOPSIS的供应商评价与选择&#xff09; 问题一需要我们对附件一中的402家供应商的数据进行处理并量化分析&#xff0c;并构建数学模型选择当中最重要的50家供应商。 附件一&#xff1a; 部分订货量 部分供货量 注意&#xff…

Android 9.0 Folder文件夹全屏后文件夹图标列表居中时拖拽app到桌面的优化

1.概述 在9.0的系统rom产品开发中,在Launcher3中在目前的产品需求开发中,对于Launcher3中的文件夹Folder的布局UI 进行了定制化的需求要求把Folder修改为全屏,然后在中间显示文件夹图标的列表,这时候如果Folder是全屏的话,如果拖拽文件夹列表中的app图标,只有拖拽 到屏幕…

csp复习题

最短路&#xff1a;最优灌溉&#xff08;201412-4&#xff09; 题目描述 问题描述 雷雷承包了很多片麦田&#xff0c;为了灌溉这些麦田&#xff0c;雷雷在第一个麦田挖了一口很深的水井&#xff0c;所有的麦田都从这口井来引水灌溉。   为了灌溉&#xff0c;雷雷需要建立一些…

【算法与数据结构】栈的实现详解

文章目录 &#x1f4dd;栈的概念及结构&#x1f309;栈的实现 &#x1f320;栈的接口&#x1f309;初始化栈&#x1f320;入栈&#x1f309;出栈&#x1f320;获取栈顶元素&#x1f309;获取栈中有效元素个数&#x1f309;检测栈是否为空&#x1f309;销毁栈&#x1f309;Stack…

别错过AI 大模型的奇妙世界!让你惊艳不已!

AI大模型的应用已经渐渐渗透到我们生活的方方面面&#xff0c;从语音识别到自然语言处理&#xff0c;从图像识别到智能推荐&#xff0c;无处不在的AI大模型正在改变着我们的生活。其背后隐藏的奇妙世界让人惊艳不已。 一方面&#xff0c;AI大模型在语音识别领域展现出了强大的…

C语言学习笔记,学懂C语言,看这篇就够了!(上)

说明&#xff1a;这是本人在学习C语言的时候整理的笔记&#xff0c;因文字限制&#xff0c;所以分为三篇文章&#xff0c;即上中下来分享这份笔记。 看完这三部分&#xff0c;C语言基础、计算机C语言二级(关于C语言的部分)、期末考试。考研数据结构(如考408的话&#xff0c;数…