Next.js框架入门笔记

news2025/1/11 2:47:11

内置组件

‘pages/_document.js’ 文件,自定义document
DOC: https://www.nextjs.cn/docs/advanced-features/custom-document

<Head>组件

<Head>是一个内置在 Next.js 中的 React 组件。它允许您修改页面的<head>。
Docs: https://www.nextjs.cn/docs/api-reference/next/head

<Link>组件

import Link from '/next/link'
  • <Link>组件切换路由,不会刷新浏览器。
  • 而<a>标签切换链接时浏览器会进行完全刷新。

Next.js 会自动进行代码拆分,因此每个页面只加载该页面所需的内容。这意味着在呈现主页时,最初不会提供其他页面的代码。
即使您添加数百个页面,这也可以确保主页快速加载。
仅加载您请求的页面的代码也意味着页面变得孤立。如果某个页面抛出错误,应用程序的其余部分仍然可以工作。
此外,在 Next.js 的生产版本中,每当Link组件出现在浏览器的视口中时,Next.js 都会自动在后台预取链接页面的代码。当您单击链接时,目标页面的代码已经在后台加载,页面转换几乎是即时的!
Next.js 通过代码拆分、客户端导航和预取(在生产中)自动优化您的应用程序以获得最佳性能。

  1. 链接到站点外的页面,请使用 标签。
  2. 给链接添加样式,添加属性时,‘className’ 是添加在 标签上的。

2. 资源、元数据和css

2.1 样式

Next.js 内置了对 CSS 和 Sass 的支持。支持导入:导入.css和.scss文件。

  1. 内联写法:
<style jsx>{`
  …
`}</style>

上面代码使用一个名为 styled-jsx 的库。意思是“css-in-js” 库 —— 允许你在 React 组件中编写 CSS。这时 CSS 样式被限制只在当前组件有效。Next.js 内置对 styled-jsx 的支持,但也可以使用其他流行的 CSS-In-JS库,如:styled-components或Emotion。

  1. 独立样式文件

📢:1. 使用Css Modules, 文件名必须以 .module.css
2. Css Module会自动生成唯一类型, 不用担心 className 冲突。
3. Next.js代码拆分也对 Css Module 适用,为每个页面加载最少的Css。这导致更小的包。

  1. 全局样式
    在 pages 文件下创建一个 _app.js 文件。这个 APP 组件是通用顶级组件,对所有页面通用。可以用这个组件在页面之间导航时保存状态。

📢:添加 pages/_app.js 后需要重启开发服务。
创建顶级目录 styles,里面创建一个 global.css 文件。

  1. 使用 classnames 库切换样式
// 安装
npm install classnames  
// or
yarn add classnames

Docs: https://github.com/JedWatson/classnames

  1. 自定义 PostCSS 配置
    Next.js使用 PostCSS 编译CSS。 可以通过自定义postcss.config.js去配置。

  2. 使用Sass
    在您可以使用 Next.js 的内置 Sass 支持之前,请务必安装sass:

npm install sass

2.2 静态资源

静态资源放置在 Next.js 项目根目录下的 public 文件夹下。
Docs: 静态文件服务

2.3 元数据

通过内置 组件修改。

2.4 布局组件

根目录下新建 components 文件夹。在里面,新建一个名为 layout.js 文件。

3. 预渲染和数据获取

3.1 预渲染

默认情况下,Next.js 预渲染每个页面。这意味着 Next.js会提前为每个页面生成 HTML,而不是全部由客户端 JavaScript 完成。预渲染可以带来更好的性能和SEO。
“预渲染”与“无预渲染”:
在这里插入图片描述
在这里插入图片描述

3.2 两种形式预渲染:静态生成和服务端渲染

两种预渲染形式的区别:何时为页面生成HTML。

`静态生成服务端渲染
何时生成Html构建时请求时
适用场景内容固定,不会频繁更新的页面页面会显示频繁更新的数据时,或页面内容会随每个请求而改变时。
速度更快 (构建一次并存储在CDN服务上,比每次请求时生成 Html 要更快)更慢 (但预渲染的页面将始终是最新的)

在这里插入图片描述
在这里插入图片描述

注意: 开发模式下,每个页面都是在请求时进行预渲染。即使使用静态生成也是如此!

3.3 “混合”Next.js应用程序

即 Next.js 允许在一个应用中,不同页面同时使用两种预渲染方式,如下图所示:
在这里插入图片描述

我们可以为大多数页面使用静态生成,部分其他页面使用服务端渲染。

3.4 静态生成

静态生成可以在有数据和没有数据的情况下完成。

  1. 静态生成——不带数据
    当页面中不需要获取外部数据时,在生产构建时,会被自动静态生成。在这里插入图片描述

  2. 带数据的静态生成
    针对的场景:呈现HTML之前需要先获取数据。如,构建时访问文件系统、获取外部API、查询数据库。
    Next.js 开箱即用的支持这种情况 —— 即带数据的静态生成。在这里插入图片描述

3.5 getStaticProps 函数

在 Next.js 组件中,加上名为 getStaticProps 的 async 函数。

  • getStaticProps 会在生产构建时被执行。
  • 在该函数里,可以获取外部数据,并将数据作为 props 发送给页面。
export default function Home(props) { ... }

export async function getStaticProps() {
  // Get external data from the file system, API, DB, etc.
  const data = ...

  // The value of the `props` key will be
  //  passed to the `Home` component
  return {
    props: ...
  }
}

注意:

  1. 开发模式下, getStaticProps会自动改为在页面请求时运行。
  2. getStaticProps 仅在服务端运行。它永远不会在客户端运行。甚至不会包含在浏览器的 JS 包中。
  3. getStaticProps 只能从页面导出。不能从非页面文件中导出。

3.6 在请求时获取数据 —— 服务端渲染在这里插入图片描述

  1. getServerSizeProps
    如你所见,getServerSideProps 类似于 getStaticProps,但两者的区别在于 getServerSideProps 在每次页面请求时都会运行,而在构建时不运行。
  2. 客户端渲染
    可以选择,同一个页面中不需要获取外部数据的部分在构建时直接 “静态生成”。其他部分在浏览器加载时 JS 请求获取后渲染。
  3. SWR
    swr是一个 React 数据获取 hook。
import useSWR from 'swr'

function Profile() {
  const { data, error } = useSWR('/api/user', fetch)

  if (error) return <div>failed to load</div>
  if (!data) return <div>loading...</div>
  return <div>hello {data.name}!</div>
}

4. 部署 Next.js 应用程序

4.1 代码提交到Github

4.2 部署到 Vercel

Vercel 是什么?
Vercel (之前也叫 Zeit 或 now.sh) 是一家提供静态网站托管的云平台,支持从 Github, GitLab, Bitbucket 等代码仓库中自动拉取代码 然后进行项目打包和部署等功能。

  1. 创建一个 Vercel 账号。
  2. 导入你的 nextjs-blog 存储库。
    • 需要为你的额 GitHub 安装 Vercel。
    • 部署时,你的 Next.js 应用程序将开始构建。

4.3 Next.js 和 Vercel

Learn | Next.js

4.4 其他托管选项

Next.js 可以部署到任何支持 Node.js 的托管服务提供商。

其他文章与教程

  • 从 React 转换到 Next.js 的五个理由
  • React服务器端渲染之NextJS实战 | 千峰教育
  • Next.js+React+Node系统实战,搞定SSR服务器渲染 | 实战课程_慕课网
  • React服务器渲染原理解析与实践
  • React SSR 服务端渲染原理解析与同构实践

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

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

相关文章

JVM理论(四)运行时数据区--堆/方法区

堆(heap) 堆内存逻辑上分为三部分 一个JVM实例只存在一个堆内存,JVM启动时创建堆区&#xff0c;通常情况下也是最大的内存空间&#xff0c;几乎所有的对象实例都要在堆中分配内存&#xff0c;所以堆也是垃圾回收的重点区域堆是被所有线程共享的,在堆里面也可以划分线程私有的缓…

肝!熬夜到天明,阿里顶配级 Spring Security 笔记

Spring Security Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是 Spring 生态系统中的一员&#xff0c;因此它伴随着整个 Spring 生态系统不断修正、升级&#xff0c;在 spring boot 项目中加入 springsecurit…

Ubuntu下安装Miniconda

下载 到根据自己本地python版本到官网下载 https://docs.conda.io/en/latest/miniconda.html#linux-installers 我本地是python3.8 然后上传到Ubuntu服务器上&#xff0c;或者直接使用wget下载&#xff1a; wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5…

WebSocket理论和实战

一 WebSocket理论 1.1 什么是http请求 http链接分为短链接、长链接&#xff0c;短链接是每次请求都要三次握手才能发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持链接&#xff08;但是是单向的&#xff0c;只能从客户端向服务端发消息&#x…

单例模式、指令重排序、锁、有序性

今天在回顾单例模式时&#xff0c;我们都知道懒汉式单例中有一种叫做双重检查锁的单例模式。 我们来看下下面的代码有没有问题&#xff1a; 这段代码我们可以看到&#xff0c;即优化了性能&#xff0c;在多线程情况下&#xff0c;如果实例不为空了&#xff0c;则直接返回了。…

1766_perl实现readlines功能

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 近段时间写一个Perl程序&#xff0c;中间反反复复用到了文件的读写。虽说是用Perl的基本功能实现读写非常简单&#xff0c;但是写的过程中我不止一次在想Python以及MATLAB的功能…

华为OD机试真题 Java 实现【评论转换输出】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述在这里插入图片描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A…

什么是元学习?外循环和内循环?支持集和查询集?

一、前言 元学习近几年也算是一个比较热门的研究方向&#xff0c;大部分被用来解决低资源少样本零样本学习的任务场景中。 那么为什么元学习可以提升低资源少样本的学习效果呢&#xff1f;活着说元学习到底是一个什么阳的算法呢&#xff1f; 这里做一个简单的概念阐述。元学…

echart之map地图图表使用教程

本文以echarts展示成都地图为例子。 echarts map &#xff08;echarts地图&#xff09;使用教程 效果展示准备阶段获取地图geojson数据安装echarts 开始绘制容器准备js代码 补充事项vue3.0 用ref定义echarts报错toRaw、markRaw 扩展 地图隐藏南海诸岛地图显示提示框地图实现下钻…

Vue项目的启动

前言&#xff1a; 由于最近开始实习&#xff0c;负责人上来就给我丢一个前端vue项目和后端文件&#xff0c;让我在本机完成部署&#xff0c;由于之前学的基本上都是后端相关知识&#xff0c;很少有了解到前端的东西&#xff0c;因此在这里将自己部署Vue项目时遇到的问题和解决过…

编译libtiff库给IOS平台用

打开libtiff官方网 : libtiff / libtiff GitLab 克隆: git clone --recursive https://gitlab.com/libtiff/libtiff.git 克隆成功并打开libtiff目录,发现有autogen.sh 与CMakeLists.txt所以可生成Configure程序来配置并编译,也可直接使用CMake-GUI来配置编译,选择其中一种 …

远程会诊如何实现?

比如&#xff1a;医生遇到复杂病情需要求助院外专家远程会诊过程中&#xff0c;需要将电脑中的病人资料给院外专家看&#xff0c;同时确保医院电脑和网络系统绝对安全&#xff0c;电脑不允许安装任何外部软件&#xff0c;不能被外人控制和操作&#xff0c;外部设备不能接入医院…

【Java技术专题】「攻破技术盲区」带你攻破你很可能存在的Java技术盲点之技术功底指南(鲜为人知的技术)

带你攻破你很可能存在的Java技术盲点之技术功底指南 基本类型的包装类技术盲点&#xff1a;基本类型的比较技术盲点&#xff1a;字符串内部化&#xff08;string interning&#xff09;字符串内部化的示例 技术盲点&#xff1a;类型缓存机制&#xff08;空间换时间&#xff09;…

微信小程序border-radius不圆滑

border-radius可以设置&#xff1a;百分比或者像素值 1.使用像素值比较圆滑 2.使用百分比不够圆滑

习题1.25

对吗?实践出真知,运行看看。代码如下。 (defn square [x] (* x x))(defn fast-expt[b n](println "call iter" n)(cond (= 1 n) b(= 2 n) (square b)(even? n) (square (fast-expt b (/ n 2))):else (* b (fast-expt b (- n 1)))))(defn expmod [base exp m](mod…

pytest 结合logging输出日志保存至文件

API_log.py import loggingclass loger():def logering(self):# 创建logger对象logger logging.getLogger(test_logger)# 设置日志等级logger.setLevel(logging.DEBUG)# 追加写入文件a &#xff0c;设置utf-8编码防止中文写入乱码test_log logging.FileHandler(test.log, a,…

Java:基于JDBC数据连接池方式同步第三方数据库表信息数据

前言 最近遇到一个需求就是要拉取第三方的数据信息&#xff0c;但是第三方那边又没有对外暴露对接接口&#xff0c;只给出了具体的数据库连接信息和具体表信息基于第三方给出的有效信息&#xff0c;我采取了用 JDBC 传统的方式去进行数据拉取注意&#xff1a;前置条件两端的网…

收费站对讲广播系统方案

收费站对讲广播系统方案 收费站对讲广播系统是一种用于收费站内部通信和广播传输的系统。它能够实现不同收费站点之间的语音通信和广播&#xff0c;以便快速、准确地传达信息和指令。该系统通常由以下几个核心组件组成&#xff1a;1. 主控台&#xff1a;主控台是系统的中心控制…

cocos shader在编辑器正常,浏览器上不显示

问题出在需要将图片的package属性取消勾选。如果用的单色精灵&#xff0c;那么可以将系统的白色图片复制一份再取消勾选。 相关链接&#xff1a; shader在浏览器上不显示 - Creator 2.x - Cocos中文社区

Redis高级篇(一)

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a;RDB持久化、AOF持久化 1.1.RDB持久化 什么是RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&am…