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

nextjs15简要介绍以及配置eslint和prettier

目录

一、Next.js 何时使用服务器端渲染(SSR)?何时使用静态生成(SSG)?

1、服务器端渲染(SSR - getServerSideProps)

2、 静态生成(SSG - getStaticProps)

3、什么时候使用 ISR(增量静态生成)?

🎯 SSR vs SSG vs ISR 对比

4、总结

二、nextjs15的优势

1. Turbopack 开发模式

2. React 19 支持

3. Hydration 错误改进

4. 静态路由指示器

5. 实验性功能

6.组件

三、nextjs15配置eslint和prettier

1、安装eslint和prettier所需依赖:

2、生成eslint和prettier的配置文件

3、vscode编辑器eslint配置检查


Next.js 是一个基于 React全栈框架,用于构建 高性能 Web 应用。它由 Vercel 开发和维护,提供了 服务器渲染(SSR)静态生成(SSG)API 路由自动路由全栈功能 等特性。

自问世以来,一直受到众多前度开发者的青睐,其版本也在不断地更新当中,如已经更新到了nextjs15

一、Next.js 何时使用服务器端渲染(SSR)?何时使用静态生成(SSG)?

Next.js 提供了 两种主要的页面渲染方式

  1. 服务器端渲染(SSR - Server-Side Rendering)
  2. 静态生成(SSG - Static Site Generation)

此外,还有 增量静态生成(ISR - Incremental Static Regeneration) 作为 SSG 的增强版。


1、服务器端渲染(SSR - getServerSideProps

📌 什么时候用 SSR?

  • 页面数据依赖于请求时的最新数据
  • 用户个性化内容(如用户登录状态、账户信息)
  • SEO 友好,并且内容实时变化
  • 数据必须在请求时获取,不能提前生成

✅ 适用场景

  • 动态新闻/社交媒体页面
  • 用户仪表盘(Dashboard)
  • 库存管理(需要最新库存数据)
  • A/B 测试(不同用户看到不同的内容)

📌 SSR 代码示例

export async function getServerSideProps(context) {const res = await fetch("https://api.example.com/data");const data = await res.json();return {props: { data }, // 这个 `data` 会被传递给组件};
}export default function Page({ data }) {return <div>{JSON.stringify(data)}</div>;
}

📌 SSR 发生的时间

  • 每次请求 时都会运行 getServerSideProps
  • 页面不会被 缓存,每次访问都会请求 API

2、 静态生成(SSG - getStaticProps

📌 什么时候用 SSG?

  • 数据在构建时就可以确定
  • 数据不会频繁变化
  • SEO 友好,且性能要求高
  • 减少服务器负载,提升访问速度

✅ 适用场景

  • 博客文章
  • 产品详情页
  • 文档、帮助中心
  • 营销页面(Landing Page)

📌 SSG 代码示例

export async function getStaticProps() {const res = await fetch("https://api.example.com/data");const data = await res.json();return {props: { data },revalidate: 60, // ISR: 60秒后重新生成页面};
}export default function Page({ data }) {return <div>{JSON.stringify(data)}</div>;
}

📌 SSG 发生的时间

  • 只在 构建时 运行 getStaticProps
  • 生成的 HTML 是静态的,用户访问时不再请求 API
  • 可以配合 ISR(增量静态生成) 让部分数据自动更新(revalidate

3、什么时候使用 ISR(增量静态生成)?

如果你需要 SSG 的性能,但数据又偶尔更新,可以使用 ISR(Incremental Static Regeneration)。

✅ 适用场景

  • 产品价格、库存信息
  • 新闻列表(不是实时新闻,但会定期更新)
  • 带有 SEO 的动态内容

📌 ISR 代码示例

export async function getStaticProps() {const res = await fetch("https://api.example.com/data");const data = await res.json();return {props: { data },revalidate: 60, // 每 60 秒更新一次数据};
}
  • 页面会在首次构建时生成
  • 访问页面后,如果超过 revalidate 时间,Next.js 会后台重新生成
  • 用户访问不会等更新完成,只会在下次请求时看到新页面

🎯 SSR vs SSG vs ISR 对比

渲染方式何时渲染?数据是否实时?适用场景
SSR(服务器端渲染)每次请求时✅ 实时数据账户信息、仪表盘、个性化页面
SSG(静态生成)构建时❌ 数据不会变博客、产品页、文档
ISR(增量静态生成)构建时生成,之后按 revalidate 更新⏳ 定期更新新闻、商品库存、SEO 友好的动态页面

4、总结

  • 如果数据是动态的,并且需要最新的内容SSR
  • 如果数据可以在构建时确定,且不会频繁变化SSG
  • 如果数据不会实时更新,但仍然需要定期刷新ISR

二、nextjs15的优势

Next.js 15 发布后,带来了多项重要更新,旨在提升开发者体验和应用性能。以下是主要改进:

1. Turbopack 开发模式

next dev --turbo 现已稳定,可加速开发体验。在大型 Next.js 应用中,如 vercel.com,使用 Turbopack 开发模式可实现:

  • 本地服务器启动速度:提升高达 76.7%
  • Fast Refresh 代码更新速度:提升高达 96.3%

citeturn0search0

2. React 19 支持

Next.js 15 与即将发布的 React 19 保持一致:

  • App Router:使用 React 19 RC
  • Pages Router:保持对 React 18 的向后兼容性,允许在准备就绪时升级到 React 19

3. Hydration 错误改进

改进了 hydration 错误视图,错误信息更清晰,并提供解决建议,提升调试效率。

4. 静态路由指示器

在开发过程中显示静态路由指示器,帮助识别哪些路由是静态的或动态的,便于优化性能。

5. 实验性功能

  • unstable_after API:允许在响应流式传输完成后处理任务,使次要任务在不阻塞主要响应的情况下运行。
  • instrumentation.js:提供 register() API,允许接入 Next.js 服务器生命周期,以监控性能、追踪错误源头,并深度集成如 OpenTelemetry 等可观测性库。

6. <Form> 组件

新的 <Form> 组件扩展了 HTML <form> 元素,增加了预获取、客户端导航和渐进增强功能,适用于需要导航到新页面的表单。

这些更新使 Next.js 15 成为一个更高效、更强大的框架,进一步提升了开发者的工作流程和应用性能。

三、nextjs15配置eslint和prettier

在前端开发项目当中使用eslint进行语法检查,prettier进行代码美化几乎已经成为一个标配。nextjs15默认支持eslint 9版本,跟之前8版本有很大的不同。

  • ESLint 8 及之前:使用 .eslintrc.eslintrc.js.eslintrc.json 或在 package.json 中配置。

  • ESLint 9:引入了全新的扁平化配置文件 eslint.config.js,取代了之前的配置方式。这种新格式更灵活,支持模块化配置。

最近在github找了一个依赖插件eslint-prettier-next-15,执行一条命令,即可配置帮你的项目配置好eslint和prettier。

首先,创建一个nextjs项目:

pnpm dlx create-nextjs-app my-app

创建完成后,再执行:

pnpm dlx eslint-prettier-next-15

这条命令会帮助项目做两件事情:

1、安装eslint和prettier所需依赖:

  • @eslint/eslintrc@3.2.0
  • @eslint/js@9.18.0
  • @ianvs/prettier-plugin-sort-imports@4.4.0
  • @typescript-eslint/eslint-plugin@8.19.1
  • @typescript-eslint/parser@8.19.1
  • eslint@9.18.0
  • eslint-config-next@15.1.4
  • eslint-config-prettier@9.1.0
  • eslint-plugin-prettier@5.2.1
  • prettier@3.4.2
  • prettier-plugin-sort-json@4.1.1

2、生成eslint和prettier的配置文件

.prettierrc.json

{"printWidth": 120,"singleQuote": false,"tabWidth": 2,"trailingComma": "es5","plugins": ["@ianvs/prettier-plugin-sort-imports","prettier-plugin-sort-json"],"importOrder": ["^(react/(.*)$)|^(react$)","^(next/(.*)$)|^(next$)","<THIRD_PARTY_MODULES>","","^@/(.*)$","^[./]"],"importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy"]
}

eslint.config.mjs

import path from "node:path";
import { fileURLToPath } from "node:url";
import { FlatCompat } from "@eslint/eslintrc";
import js from "@eslint/js";
import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin";
import tsParser from "@typescript-eslint/parser";
import prettier from "eslint-plugin-prettier";const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({baseDirectory: __dirname,recommendedConfig: js.configs.recommended,allConfig: js.configs.all,
});export default [...compat.extends("next", "next/core-web-vitals", "prettier"),{plugins: {prettier,},rules: {"prettier/prettier": "error",camelcase: "off","import/prefer-default-export": "off","react/jsx-filename-extension": "off","react/jsx-props-no-spreading": "off","react/no-unused-prop-types": "off","react/require-default-props": "off","react/no-unescaped-entities": "off","import/extensions": ["error","ignorePackages",{ts: "never",tsx: "never",js: "never",jsx: "never",},],},},...compat.extends("plugin:@typescript-eslint/recommended", "prettier").map((config) => ({...config,files: ["**/*.+(ts|tsx)"],})),{files: ["**/*.+(ts|tsx)"],plugins: {"@typescript-eslint": typescriptEslintEslintPlugin,},languageOptions: {parser: tsParser,},rules: {"@typescript-eslint/explicit-function-return-type": "off","@typescript-eslint/explicit-module-boundary-types": "off","no-use-before-define": [0],"@typescript-eslint/no-use-before-define": [1],"@typescript-eslint/no-explicit-any": "off","@typescript-eslint/no-var-requires": "off",},},
];

还有prettier美化忽略文件:prettierignore

完成以上配置后,重新启动vscode就可以正常使用;

3、vscode编辑器eslint配置检查

但是,我在完成这个以后,发现eslint不起作用,代码中出现错误,也不提示红色波浪线。检查发现vscode的eslint模块总是爆出一下错误:

eslint Config (unnamed): Key "env": This appears to be in eslintrc format rather than flat config format.

这个错误提示是因为你的 ESLint 配置文件格式不符合 Flat Config(扁平配置)的要求。

检查发现我的vscode的settings.json配置文件当中存在:

settings.json

 "eslint.options": {"overrideConfig": {"env": {"browser": true,"es6": true},"parserOptions": {"ecmaVersion": 2019,"sourceType": "module","ecmaFeatures": {"jsx": true}},"rules": {"no-debugger": "off"}}},

 以上是eslint 8版本的写法,在eslint 9版本当中env等属性都不存在了,因此与eslint9版本的写法发生了冲突。解决方法是将settings.json当中的eslint配置改用eslint9版本的写法,或者直接注释掉即可。

 

相关文章:

nextjs15简要介绍以及配置eslint和prettier

目录 一、Next.js 何时使用服务器端渲染&#xff08;SSR&#xff09;&#xff1f;何时使用静态生成&#xff08;SSG&#xff09;&#xff1f; 1、服务器端渲染&#xff08;SSR - getServerSideProps&#xff09; 2、 静态生成&#xff08;SSG - getStaticProps&#xff09; …...

存储过程和自定义函数在银行信贷业务中的应用(oracle)

数据校验和清洗 例如&#xff0c;检查客户的年龄是否在合理范围内&#xff0c;贷款金额是否符合规定的上下限等。 对于不符合规则的数据&#xff0c;可以进行清洗和修正。比如&#xff0c;将空值替换为默认值&#xff0c;或者对错误的数据进行纠正。 CREATE OR REPLACE PROC…...

基于Ollama平台部署的Qwen大模型实现聊天机器人

文章目录 基于Ollama平台部署的Qwen大模型实现聊天机器人1 概述2 技术栈2.1 开发技术2.2 环境 3 技术架构4 实现步骤4.1 环境搭建4.1.1 WSL配置及Ubuntu安装4.1.2 Ollama安装及模型部署 4.2 模块安装4.2.1 安装Streamlit 1.42.24.2.2 安装requests 2.32.34.2.3 安装ollama 0.4.…...

在 JDK 1.8 的 ConcurrentHashMap 中,为什么存在两种插入方式?

在 JDK 1.8 的 ConcurrentHashMap 中&#xff0c;之所以对“容器为空”和“计算位置为空”采取不同的处理方式&#xff0c;主要是因为 并发场景下的性能优化和并发安全保证。我们可以分开来看这两种情况&#xff1a; 1. 容器为空时&#xff0c;使用 volatile CAS 初始化 原因…...

如何让powershell的界面变成全屏显示?

刚打开powershell&#xff0c;原来的样子&#xff1a; 全屏&#xff1a;可以按一下键盘上的alt enter 键&#xff0c;效果&#xff1a;...

语音识别踩坑记录

本来想在原来的语音识别的基础上增加本地扩展本地词典&#xff0c; 采用的语音识别是Vosk识别器&#xff0c;模型是 vosk-model-small-cn-0.22 // 初始化Vosk识别器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…...

图片查看器:用PyQt5实现本地图片预览工具

通过python代码&#xff0c;基于PyQt5实现本地图片预览查看工具。 我们对窗口进行了圆角设计&#xff0c;图片的翻页按钮半透明处理&#xff0c;当鼠标移动至按钮上的动画效果&#xff0c;当选择某一张图片&#xff0c;进行左右翻页则轮播同目录所有支持的图片格式。 import …...

Deepin通过二进制方式升级部署高版本 Docker

一、背景&#xff1a; 在Deepin系统中通过二进制方式升级部署高版本 Docker&#xff0c;下面将详细介绍二进制方式升级部署高版本 Docker 的具体步骤。 二、操作步骤 1.根据需求下载二进制文件&#xff0c;下载地址如下&#xff1a; https://mirrors.tuna.tsinghua.e…...

车架号VIN查询 API 接口用JAVA如何调用?

以下是车架号VIN查询 API 接口用JAVA如何调用的示例代码&#xff1a; package com.shuxun.data.impl.demo;import com.shuxun.common.core.util.HttpUtil; import org.apache.commons.codec.digest.DigestUtils;import java.util.HashMap; import java.util.Map;public class …...

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权 一、信息收集 1、首先拿到靶场先扫一下ip arp-scan -l 3、 2、指纹扫描 nmap -sS -sV 192.168.66.178nmap -p- -sV -A 192.168.66.253 PORT STATE SERVICE VERSION 22…...

爬虫的精准识别:基于 User-Agent 的正则实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解&#xff0c;力求通过例子让新同学学习用法&#xff0c;帮助老同学快速回忆知识点 可视化系列&#xff1a; Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…...

【免费】2004-2020年各省货运量数据

2004-2020年各省货运量数据 1、时间&#xff1a;2004-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、货运量(万吨) 4、范围&#xff1a;31省 5、指标解释&#xff1a;货运量指在一定时期内&#xff0c;各种运输工具实际运…...

【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>

std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档&#xff0c;请参见链接。 限制&#xff1a; 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...

Java 集合框架大师课:集合框架源码解剖室(五)

&#x1f525;Java 集合框架大师课&#xff1a;集合框架源码解剖室&#xff08;五&#xff09; &#x1f4a3; 警告&#xff1a;本章包含大量 裸码级硬核分析&#xff0c;建议搭配咖啡因饮料阅读&#xff01;☕️ 第一章 ArrayList 的扩容玄学 1.1 动态扩容核心代码大卸八块 …...

llamafactory 微调教程

文章目录 llamlafactory微调deepseekr1-0.5b1.1 说明1.2 搭建环境创建GPU实例连接实例部署llama_factory创建隧道&#xff0c;配置端口转发访问llama_factory 1.3 微调大模型从huggingface上下载基座模型查看模型是否下载成功准备数据集微调评估微调效果导出合并后的模型 释放实…...

代码随想录|二叉树|04二叉树的统一迭代法

一刷我这里放了。。。 代码随想录...

【教学类-43-25】20240311 数独3宫格的所有可能(图片版 12套样式,空1格-空8格,每套510张,共6120小图)

背景需求&#xff1a; 有一位客户买3宫格所有可能&#xff08;WORD表格版&#xff09; 【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换-用时少报错少&#xff08;12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09;_数独三…...

Manus AI:多语言手写识别的技术革命与未来图景

摘要&#xff1a;在全球化浪潮下&#xff0c;跨语言沟通的需求日益迫切&#xff0c;但手写文字的多样性却成为技术突破的难点。Manus AI凭借其多语言手写识别技术&#xff0c;将潦草笔迹转化为精准数字文本&#xff0c;覆盖全球超百种语言。本文从技术原理、应用场景、行业价值…...

领域驱动设计(DDD)是什么?

领域驱动设计&#xff08;DDD&#xff09;是什么&#xff1f; 在软件开发的世界里&#xff0c;我们总在寻找那把打开业务之门的钥匙。有人迷恋MVC的简洁&#xff0c;有人追逐微服务的潮流&#xff0c;而DDD&#xff08;领域驱动设计&#xff09;则像一位沉默的智者&#xff0c;…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...