Next.js学习笔记

article/2025/11/4 16:07:25

这是一个用于生产环境的React 框架,Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配置。

create-next-app

使用 create-next-app创建新的 Next.js 应用程序,它会自动为你设置所有内容。创建项目,请运行:

npx create-next-app@latest
# or
yarn create next-app

如果你希望使用 TypeScript 开发项目,可以通过 --typescript 参数创建 TypeScript 项目:

npx create-next-app@latest --typescript
# or
yarn create next-app --typescript

安装完成后:

注意:直接运行 run start是不能生效的,需要先run build打包才能start。
生产环境下可以运行 npm run dev 或 yarn dev 来启动开发服务器,访问地址为 http://localhost:3000。
通过 http://localhost:3000 地址访问你的应用程序。
编辑 pages/index.js 文件并在浏览器中查看更新。

页面(Pages)

在 Next.js 中,不需要手动设置路由,一个 page(页面) 就是一个从 .js、jsx、.ts 或 .tsx 文件导出(export)的 React 组件 ,这些文件存放在 pages 目录下。每个 page(页面)都使用其文件名作为路由(route)。
在这里插入图片描述

具有动态路由的页面

Next.js 支持具有动态路由的 pages(页面)。例如,如果你创建了一个命名为 pages/posts/[id].js 的文件,那么就可以通过 posts/1、posts/2 等类似的路径进行访问。

预渲染

默认情况下,Next.js 将 预渲染 每个 page(页面)。这意味着 Next.js 会预先为每个页面生成 HTML 文件,而不是由客户端 JavaScript 来完成。预渲染可以带来更好的性能和 SEO 效果。

每个生成的 HTML 文件都与该页面所需的最少 JavaScript 代码相关联。当浏览器加载一个 page(页面)时,其 JavaScript 代码将运行并使页面完全具有交互性。
注意:这里面的预渲染其实就是服务端渲染,或者是指非客户端渲染。不是预先生成HTML(SSG)的意思。

两种形式的预渲染

Next.js 具有两种形式的预渲染: 静态生成(Static Generation) 和 服务器端渲染(Server-side Rendering)。这两种方式的不同之处在于为 page(页面)生成 HTML 页面的 时机 。

静态生成 (SSG):HTML 在 构建时 生成,并在每次页面请求(request)时重用。
服务器端渲染(SSR):在 每次页面请求(request)时 重新生成 HTML。
在这里插入图片描述

三个和预渲染有关的重要方法:

getStaticProps (Static Generation): Fetch data at build time.
getStaticPaths (Static Generation): Specify dynamic routes to pre-render pages based on data
getServerSideProps (Server-side Rendering): Fetch data on each request

getStaticProps

只要Pages中的文件有export getStaticProps,就认为是SSG

// getStaticProps
// 静态生成,只在打包构建时运行一次
import { GetStaticProps } from 'next'
export const getStaticProps: GetStaticProps = ({params}) => {// params参数是来自于getStaticPaths函数的返回结果...return {props: {...},  // 只能返回这种格式的数据revalidate: sec // 每sec秒生成一次,nouFound: false // 为true时404}
}

getStaticProps几个细节

编译时运行,在用户请求前。dev模式下,在请求时运行
只在服务端/Node.js运行
数据必须和用户无关,和URL参数无关
页面最终会被编译成静态html

SSG应用场景

尽可能使用 静态生成 (带有或不带数据),因为你的所有 page(页面)都可以只构建一次并托管到 CDN 上,这比让服务器根据每个页面请求来渲染页面快得多。

预渲染(SSG):有什么问题?

编译阶段生成HTML,数据变更了怎么办?
HTML和用户/URL参数有关怎么办?
在这里插入图片描述

动态路由的SSG的问题

Dynamic routes 可以匹配近乎是无上限的 pattern,而每一个 pattern 如果在 next build 都要对应到一个页面,这样会产生无上限的 HTML 页面吗?
解决方案:
使用 getStaticPaths 事先定义哪些页面需要产生 HTML 档案。
语法跟 getStaticProps 很像,定义一个async function getStaticPaths ,回传值包含两个 key,分别是 paths 与 fallback。

getStaticPaths

// getStaticPaths
// 静态生成,只在打包构建时运行一次
// 使用于动态路由组件内,根据返回结果生成x.html,需配合getStaticProps函数使用
import { GetStaticPaths } from 'next'
export const getStaticPaths: GetStaticPaths = () => {...return {paths: [{params: {id: '1'}},{params: {id: '2'}},...],fallback: true or false or blocking//最后的数据结果只能返回这种类型的,返回的params会出现在getStaticProps函数的params参数中,/* fallback为true时,对于不在paths中的动态路由也可以渲染,如果为false,对于不在paths中的路由,直接输出404 */}
}

getStaticPaths使用要点:

编译时运行,在用户请求前
动态路由场景
理解fallback很重要

SSG不适用的处理方案

不适用,即数据变化很快。或者说不适合提前渲染。

1、将“静态生成”与 客户端渲染(CSR) 一起使用:你可以跳过页面某些部分的预渲染,然后使用客户端 JavaScript 来填充它们。

2、使用 服务器端渲染(SSR): Next.js 针对每个页面的请求(eg:/post/1.html)进行预渲染。即用户每次请求的时候,服务端动态生成HTML。

SSR:getServerSideProps

// getServerSideProps
// 服务端渲染,每次页面运行时都会运行一次
// 性能上低于静态生成,更推荐上面的
import { GetServerSideProps } from 'next'
export const getServerSideProps: GetServerSideProps = () => {// 使用与上面一致...return {props: {...}}
}

SSR不会在构建时生成静态HTML页面,但会在请求时渲染好再发给服务端,性能没有SSG好,但应用场景更加灵活。

Nextjs编译

yarn build  
# or
npm run build

SSG/SSR 总结

在这里插入图片描述

API开发

在这里插入图片描述

路由跳转——Link组件跳转

import Link from 'next/link'
export default () => {<Link href="/about" > {/* href={pathname:"/about/“, query: {key: value} */}<a>点击跳转</a> {/* href会自动添加到a标签上 */}</Link><Link href="/about" as="/a" > <a>点击跳转</a> {/* 起了个别名,能跳转,且显示跳转到 /a ,但是刷新会404 */}</Link><Link href="/about" passHref><img /> {/* 如果子标签没有href属性,需要在Link中添加强制属性 passHref */}</Link>{/* 还有其他属性:replace: 替换,无法返回;scroll={true/false} 是否跳转后到页面顶部;prefetch:预加载*/}{/* Link标签里面也可以放组件,但是必须是React.forwardRef创建的组件 */}const NewLink = React.forwardRef((props, ref) => {return <a href={props.href} ref={ref}>新标签</a>}) 
}

动态路由 &路由参数

<Link href="/file/[id]" as="/file/123"></Link>
<Link href="/file/[...id]" as="/file/123/456"></Link>router.push('/file/[id]') // "/file/123"
router.push('/file/[...id]') // "/file/123/456"/* 接收路由参数 */
// [id].tsx
import { useRouter } from 'next/router'
const A = () => {const router =  useRouter()console.log(router.query) // {id: ''}return <a>链接{router.query.id}</a>
}
export default A// [...id].tsx
import { useRouter } from 'next/router'
const A = () => {const router =  useRouter()console.log(router.query) // {id: array[]}return <a>链接{router.query.id[0]}</a>
}
export default A

关于404页面与路由重定向

import { GetStaticProps } from 'next'export const getStaticProps: GetStaticProps = () => {// 这里data自己设置一个合适的参数就行,return的是重定向操作if(!data){return {notFound: true, //为404页面,只能用trueredirect: { // 重定向,分开使用destination: "/",permanent: false,}}}
}

读取文件

读取文件与node中操作差不多,但是在目录路径获取上有一点区别
注意!!!nextjs中无法使用 nodejs的__dirname,用以代替的是process.cwd()`,返回的是项目工程的根目录的绝对路径


http://chatgpt.dhexx.cn/article/3KKDesho.shtml

相关文章

搭建vue3项目时出现Cannot read property ‘nextSibling‘ of null报错

记录自己学习中&#xff0c;出现的错误 在搭建vue3项目&#xff0c;配置router&#xff0c;vuex,element-ui后&#xff0c;运行项目页面白屏&#xff0c;控制台出现了Cannot read property nextSibling of null的错误 查看main.ts 文件&#xff0c;此时的写法是&#xff1a; …

hasNext、hasNextLine、next、nextLine保姆级详解

目录 前言 hasNext和hasNextLine的区别 hasNext 和 next组合 hasNext 和 NextLine组合 hasNextLine 和 next组合 hasNextLine 和 nextLine组合 验证hasNext、hasNextLine对输入代码的存储寿命 总结 前言 在查阅了大量网上相关资料都没有一个完整的解释&#xff0c;并且我…

细节!关于Java中的next与nextLine

目录 一、发现问题 二、解决问题 &#xff08;1&#xff09;输入连续字符串 &#xff08;2&#xff09;输入不连续字符&#xff08;含有空格等&#xff09; &#xff08;3&#xff09;nextLine()方法在前&#xff0c;next()方法在后 &#xff08;4&#xff09;next()方法在…

NextJs 学习笔记

NextJs 学习笔记 简述 之前使用过 Nuxt3 基于前端框架 Vue3 来开发网站&#xff0c;因为 Nuxt3 很多地方借鉴了基于 React 的 SSR 框架 Next&#xff0c;因此最近抽时间开始学习一下 Next 这个框架。 创建项目 npx create-next-applatest # or yarn create next-app # or p…

next和nextLine的使用

&#xff08;因为最近在学算法&#xff0c;我只讲实际应用方面的区别&#xff0c;不讲理论&#xff09; 一、hasNext()与hasNextLine()的区别&#xff1f; 1、hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false 2、hasNextLine() 方法会根据行匹配模式…

nextSibling和nextElementSilbing使用以及解决兼容性问题

nextSibling和nextElementSilbing使用以及解决兼容性问题 1、今天学习了 获取兄弟节点 的方法 – nextSibling&#xff08;获取下一个兄弟节点&#xff09;、previousSibling(获取上一个兄弟节点) Node.nextSibling 是一个只读属性&#xff0c;返回其父节点的 childNodes 列表…

电脑同时连接内网和外网的方法

前提 首先电脑要有两个网卡&#xff0c;比如一个有线一个无线&#xff08;常见&#xff0c;本文以此为例&#xff09;&#xff0c;或者两个无线网卡等等。 不论是有线连接内网&#xff08;外网&#xff09;&#xff0c;还是无线连接内网&#xff08;外网&#xff09;&#xff0…

如何设置内网和外网同时使用

工作中&#xff0c;经常需要电脑连接内网服务&#xff0c;内网服务非公网&#xff0c;如果需要电脑连接公网需要进行切换&#xff0c;特别的麻烦。其实&#xff0c;一个电脑可以同时连接两个网络服务。工作中&#xff0c;经常会遇到网络设置的问题。对于工作&#xff0c;一般都…

如何实现在内网和外网同时使用

我们在办公的时候很多情况会遇到内网办公&#xff0c;但是这时候不能够使用外网&#xff0c;今天介绍一种方法解决这个问题&#xff1a; 操作步骤: 01、查看当前的网络配置 通过ipconfig查看当前内网的网络配置&#xff0c;获取到ip、子网掩码、默认网关等信息。 02、完后进…

内网访问外网和外网访问内网的原理

假如设A 和 B 的局域网 IP 相同&#xff08;192.168.31.11&#xff09;&#xff0c;当他们同时访问百度服务器的时候&#xff0c;百度服务器如何区分哪个是 A&#xff0c;哪个是 B 呢&#xff1f; 解决方案&#xff1a;端口映射 什么是端口映射&#xff1f; 端口映射是 NAT …

[NET]什么是公网、私网、内网、外网?

背景&#xff1a;大家可能对什么是公网、私网、内网、外网有疑惑&#xff0c;今天我们来说下它们之前的区别&#xff0c;已经大家耳熟能详的VPN,SNAT,DNAT的作用。 简单理解公网是相对于私网的&#xff0c;而外网是相对于内网的&#xff1a;

竟然还有人不知道什么是内网、外网?快收藏学习吧!

内网 内网又称局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;&#xff0c;是指在某一区域内由多台计算机以及网络设备构成的网络&#xff0c;比如校园网、政府网等&#xff0c;一般方圆几公里。 我们常说的内网&#xff0c;从字面意思上来讲是区别于外网的…

如何理解内网和外网?

如何理解内网和外网&#xff1f; 1.感性上认识 判断内网和外网的重要依据是&#xff1a;是否与广阔的外界网络相连。 在有互联网之前&#xff0c;世界上是先有了局域网&#xff0c;一些公司构建了自己的局域网&#xff0c;供自己公司员工之间进行沟通。对于外来人员来说&…

局域网的主机如何连接外网

一、局域网内主机上外网——NAT 1、内网与外网 &#xff08;1&#xff09;内网 即所说的局域网&#xff0c;比如学校的局域网&#xff0c;局域网内每台计算机的 IP 地址在本局域网内具有互异性&#xff0c;是不可重复的。但两个局域网内的内网 IP 可以有相同的。 &#xff08…

内网外网同时使用

在很多网络环境中&#xff0c;为了安全起见&#xff0c;不允许内网、外网同时使用。但很多时 候&#xff08;比如说远程的时候&#xff09;又需要同时使用外网和内网&#xff0c;下面介绍一下外网、内网 同时使用的操作方法。 环境&#xff1a; 1、电脑的本地网卡设置成内网的…

内网和外网之间的通信

对于初学者而已&#xff0c;我们学习的网络编程&#xff08;如TCP,UDP编程&#xff09;&#xff0c;我们通常都是在局域网内进行通信测试&#xff0c;有时候我们或者会想&#xff0c;我们现在写的内网网络数据和外网的网络数据有什么不同&#xff0c;我们内网的数据是如何走出外…

探秘 | 如何分辨内网和外网?

目录 &#x1f4a1; 什么是外网IP、内网IP&#xff1f; &#x1f4a1; 对于自有路由器上网的用户&#xff0c;可以这样理解外网IP、内网IP &#x1f4a1; 几个大家经常会问的问题 什么是外网IP、内网IP&#xff1f;很多用户都有一个疑惑&#xff0c;如果不使用路由器拨号上网…

实现电脑同时上内网和外网(或通过外网访问到该电脑通过该电脑访问内网)

一、需求描述 目前使用的公司网络只能够上内网,但是又有上外网查资料的需求: ①想要实现电脑既能上内网的同时也可以上外网; ②想要使用其他外网电脑使用外网连接到该电脑,通过该电脑访问内部的网络内容。 二、准备内容 电脑必须具备两个网卡,即:可以同时连接内网和外…

如何理解内网和外网

如何理解内网和外网 写这篇博文的动力来自于&#xff0c;大狗问我什么是内网和外网&#xff08;没错&#xff0c;我就是站在程序猿顶端的有女票的程序猿:p&#xff09;&#xff0c;一个惊讶&#xff0c;为什么她会问这样的问题&#xff0c;在现实生活中&#xff0c;不管你是不…

内网和外网的区别是什么?

内网和外网的区别重要依据主要是判断它是不是与广阔的外界相连。 内网和外网最大的区别 内网IP局域网&#xff0c;网线都是连接在同一个 交换机上面的&#xff0c;也就是说它们的IP地址是由交换机或者路由器进行分配的。而且每一个IP也是有所不同的&#xff0c;并且这些连接在…