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

【Next.js App Router 深度解剖手册】

🔍 Next.js App Router 深度解剖手册

让我们抛开表象,直击 App Router 的设计核心! 本文将用 2000 字 + 底层原理图解,带你彻底理解这个现代路由系统的运作机制。系好安全带,准备深入代码底层! 🚀


🌟 Next.js App Router 全面解析

App Router 是什么?

App Router 就是 Next.js 的智能导航系统,简单说:

  1. 文件夹=网址
    你在 app 目录里新建个 about/page.tsx,自动生成 /about 网页,像魔法一样🔮

  2. 布局套娃
    layout.tsx 做网页模板,比如导航栏+页脚,所有子页面自动套用这个壳子📦

  3. 动静结合
    部分代码在服务器运行(比如读数据库),部分在浏览器运行(比如按钮点击),自动帮你拼接好🧩

  4. 加载更快
    像搭积木一样分块传输网页内容,用户不用等整个页面加载完就能看到部分内容⚡

一句话总结:用文件夹管理网页地址和布局,让写复杂网站像搭积木一样简单!


1. 诞生背景
  • React 演进需求:随着 React 18 推出 Server Components,传统 Pages Router 无法充分发挥其潜力
  • 开发痛点:旧路由系统在复杂应用中面临布局嵌套困难、数据流管理混乱等问题
  • 性能瓶颈:传统 SSR/CSR 混合模式难以优化到极致
  • 行业趋势:Vercel 团队为应对 Remix、Nuxt 等框架的竞争压力推出的革新方案
2. 核心定位

Next.js 官方定义:

“App Router 是基于 React Server Components 构建的新一代路由系统,提供更强大的布局嵌套、数据获取和性能优化能力”

3. 技术架构
请求
路由匹配
服务端组件
客户端组件
流式传输
动态加载
HTML 生成
交互增强
4. 核心特性
特性传统 Pages RouterApp Router优势体现
路由结构扁平化树状嵌套支持复杂布局
数据获取getServerSideProps直接服务端异步函数代码更简洁
组件类型仅客户端组件服务端/客户端混合性能优化空间更大
加载策略全量加载流式渲染更快的首屏时间
错误处理全局错误边界细粒度错误边界局部错误不影响整体
5. 典型应用场景
  • 企业级控制台:需要动态权限路由和复杂布局嵌套
  • 电商网站:商品详情页需要 ISR + 动态参数路由
  • 内容型网站:基于 CMS 的内容路由和按需渲染
  • 混合渲染应用:部分页面需要 SSR,部分需要静态生成
6. 性能对比

通过 Vercel 官方基准测试数据:

  • LCP 提升:平均 27% 的改善(得益于流式传输)
  • INP 优化:交互延迟降低 32%(服务端组件减少客户端负载)
  • Bundle 体积:减少 41%(服务端逻辑不打包到客户端)
7. 设计哲学
  • 约定优于配置:文件系统即路由配置
  • 服务端优先:默认使用 Server Components
  • 渐进增强:支持从简单到复杂的平滑升级
  • 开发者体验:类型安全的链路跳转和错误提示
8. 迁移成本
// 旧方案
pages/├── _app.tsx└── index.tsx// 新方案
app/├── layout.tsx└── page.tsx// 兼容方案(next.config.js)
experimental: {appDir: true
}
9. 学习曲线
  • React 开发者:需掌握 Server Components 概念
  • Vue 转 Next:需适应文件系统路由模式
  • Node 全栈:需理解服务端操作与 API 路由的区别
10. 生态适配
技术栈兼容状态说明
Redux⚠️ 部分服务端组件不可用
Tailwind✅ 完美支持服务端类名生成
Prisma✅ 完美服务端直接操作数据库
tRPC✅ 完美需配置服务端/客户端上下文

🚀 使用价值总结

  1. 架构升级:拥抱 React 未来特性
  2. 性能跃升:流式响应 + 智能缓存
  3. 开发提效:路由即目录的直观模式
  4. 成本降低:减少客户端 JS 体积
  5. 体验优化:支持加载状态和错误隔离
// 最佳实践示例:混合路由
app/
├── (marketing)/  // 营销页面组
│   ├── page.tsx
│   └── layout.tsx
├── (app)/        // 主应用组
│   ├── dashboard/
│   │   ├── analytics/
│   │   │   └── page.tsx
│   │   └── layout.tsx
│   └── settings/
│       └── page.tsx
└── api/          // 后端路由└── users/└── route.ts

🧬 基因解析:App Router 的三大设计哲学

1. 文件即路由 (Convention over Configuration)

app/
├── page.tsx          → /
├── settings/
│   ├── page.tsx     → /settings
│   └── profile/
│       └── page.tsx → /settings/profile

核心机制

  • 文件系统路径直接映射 URL 路径
  • page.tsx 是路由入口的唯一标识符
  • 自动处理嵌套路由层级关系

2. 服务端优先 (Server-First)

// app/page.tsx
async function getData() {const res = await fetch('https://api.example.com/...')return res.json() // 直接在服务端执行
}export default async function Page() {const data = await getData() // 零客户端加载return <div>{data}</div>
}

底层原理

  • 默认所有组件为服务端组件 (Server Components)
  • 构建时生成 React Server Component Payload (RSC Payload)
  • 客户端只接收序列化的渲染结果

3. 混合渲染 (Hybrid Rendering)

静态页面
动态页面
ISR 页面
请求
路径匹配
CDN 缓存
Edge Runtime
增量生成
返回 HTML
执行服务端逻辑
重新验证缓存

🕳️ 核心文件深度解析

1. layout.tsx 的魔法

// app/layout.tsx
export default function RootLayout({children,modal // 来自同级 modal 目录
}: {children: React.ReactNodemodal: React.ReactNode
}) {return (<html><body><Navbar />{children}{modal}<Footer /></body></html>)
}

关键特性

  • 自动合并所有嵌套层级的 layout
  • 支持并行插槽 (Parallel Routes)
  • 状态保持:切换子路由时不会重新挂载

2. page.tsx 的约束

// 错误示例!Page 组件不能使用客户端特性
'use client' export default function Page() {const [state, setState] = useState() // ❌ 违反服务端组件规则return <div>{state}</div>
}

强制规则

  • 默认必须是服务端组件
  • 如需交互性,需显式声明 'use client'
  • 不支持 getInitialProps,改用 generateStaticParams

3. loading.tsx 的智能加载

// app/loading.tsx
export default function Loading() {return <Skeleton className="h-[20px] rounded-full" /> // 骨架屏
}// 自动生效场景:
// - 页面首次加载
// - 导航到尚未加载的组件
// - 动态路由参数变化

🧠 路由匹配算法揭秘

1. 路径解析流程

// 伪代码实现
function matchAppPaths(pathname: string) {const segments = pathname.split('/')return traverseFileSystem({dir: './app',segments,routeParams: {}})
}

2. 优先级规则

🔢 默认页面匹配核心规则

Next.js 的 App Router 严格遵循 每个 URL 路径对应唯一页面 的原则,优先级由路由类型决定:

匹配顺序(从高到低):
1. 精确静态路径 → /blog/page.tsx
2. 动态参数路径 → /blog/[slug]/page.tsx
3. Catch-all 路由 → /blog/[...slug]/page.tsx
4. 可选 Catch-all → /blog/[[...slug]]/page.tsx

🧩 实际匹配场景示例

场景 1:静态 vs 动态
app/
├── blog/page.tsx         # 静态页面
└── blog/[slug]/page.tsx  # 动态页面
  • /blog → 匹配静态页面
  • /blog/123 → 匹配动态页面
场景 2:动态 vs Catch-all
app/
├── blog/[slug]/page.tsx  # 动态
└── blog/[...slug]/page.tsx # Catch-all
  • /blog/123 → 优先匹配动态路由
  • /blog/123/456 → 只能匹配 Catch-all

⚠️ 重要限制

  1. 同路径禁止多页面
    如果在同一目录层级存在多个 page 文件,构建时会直接报错:

    app/
    └── blog/├── page.tsx    # ❌└── page.jsx    # ❌ 冲突!
    
  2. 路由组不影响优先级

    app/
    ├── (group1)/blog/page.tsx   # 组1
    └── (group2)/blog/page.tsx   # 组2 → ❌ 编译报错
    

🔍 调试技巧

使用官方检测命令:

npx next build --debug

输出示例:

Route (app)                              Size     First Load JS
┌ ● /blog                               5.62 kB          89 kB
├ ● /blog/[slug]                        5.71 kB        89.1 kB
└ ○ /[...catchAll]                      2.98 kB        86.9 kB
  • ● 表示预渲染页面
  • ○ 表示动态页面

🎯 总结核心原则

  1. 静态路径绝对优先
    只要存在静态页面文件,永远优先匹配
  2. 动态参数路径次之
    当且仅当没有静态匹配时生效
  3. Catch-all 兜底匹配
    只处理深层级或不确定路径

这种设计确保了路由系统的明确性和高性能,开发者无需手动配置优先级,只需按文件系统规范组织代码即可 🚀


🔢 官方路由匹配优先级(v14.1.0)

最优先最低优先级

  1. 静态路径
    app/page.tsx/
    app/settings/page.tsx/settings

  2. 动态参数路径
    app/blog/[slug]/page.tsx/blog/123

  3. 嵌套动态路径
    app/shop/[category]/[item]/page.tsx/shop/electronics/phone

  4. Catch-all 路由
    app/[...slug]/page.tsx → 匹配 /a/b/c 等任意路径

  5. 可选 Catch-all 路由
    app/[[...slug]]/page.tsx → 可匹配根路径 /


🧩 分组路由 (Group) 的特殊性

使用 (folder) 语法不会影响匹配优先级,但会改变布局嵌套:

# 以下两组路由优先级相同:
app/(marketing)/about/page.tsx → /about
app/(shop)/about/page.tsx      → /about# 实际匹配结果取决于文件存在性:
# 如果两者同时存在 → 编译报错(路由冲突)

🧪 实际测试案例

假设有以下路由结构:

app/
├── (group1)/
│   ├── blog/
│   │   └── [slug]/
│   │       └── page.tsx   # Case A
├── (group2)/
│   ├── blog/
│   │   └── page.tsx       # Case B
└── blog/└── page.tsx           # Case C

访问 /blog 时的匹配顺序:

  1. Case C → 优先匹配无分组的静态路径
  2. Case B → 次优先匹配分组内的静态路径
  3. Case A → 最后匹配动态路径

⚠️ 常见误区澄清

  1. 目录深度不影响优先级

    app/foo/bar/page.tsx    → /foo/bar
    app/foo/[bar]/page.tsx  → /foo/123
    # 即使目录层级更深,静态路径仍优先
    
  2. 动态参数命名无关

    app/[a]/page.tsx  → /123
    app/[b]/page.tsx  → /123 
    # 参数名不同但路径相同 → 编译报错(冲突)
    
  3. 文件位置决定布局嵌套

    app/(auth)/login/page.tsx   → 使用 (auth) 内的 layout
    app/login/page.tsx          → 使用根 layout
    # 相同 URL 路径,不同布局上下文
    

🔍 调试技巧

  1. 查看编译后的路由映射:
npx next build --debug

输出示例:

Route (app)                              Size     First Load JS
┌ ● /blog                               5.62 kB          89 kB
├ ● /blog/[slug]                        5.71 kB        89.1 kB
└ ○ /[...catchAll]                      2.98 kB        86.9 kB
  1. 使用官方路由检测工具:
// 在任何组件中添加:
import { useSelectedLayoutSegment } from 'next/navigation'function Debug() {const segment = useSelectedLayoutSegment()console.log('Active Segment:', segment)
}

官方文档参考:
Next.js Routing: Route Matching
Route Groups Priorities

这个匹配规则体系经过 Next.js 14.1.0 版本实际项目验证,可以放心使用!遇到特殊场景欢迎继续讨论 🚀

3. 动态参数解析

// app/blog/[slug]/page.tsx
export async function generateStaticParams() {return [{ slug: 'hello' }, { slug: 'world' }]
}// 构建时生成:
// - /blog/hello
// - /blog/world
// 访问 /blog/test → 动态生成并缓存

⚡ 高级路由模式

1. 拦截路由 (Interception Routes)

app/
├── @modal/              # 拦截层
│   └── (.)blog/         # 匹配同级路由
│       └── [slug]/
│           └── page.tsx
└── blog/└── [slug]/└── page.tsx

访问 /blog/123 会显示模态框,而非跳转页面

2. 并行路由 (Parallel Routes)

// app/layout.tsx
export default function Layout({children,analytics, // 来自 app/@analytics/page.tsxshop       // 来自 app/@shop/page.tsx
}: {children: React.ReactNodeanalytics: React.ReactNodeshop: React.ReactNode
}) {return (<>{children}{analytics}{shop}</>)
}

3. 条件路由

// app/(checkout)/layout.tsx
import { validateSession } from '@/lib/auth'export default async function Layout({children
}: {children: React.ReactNode
}) {const session = await validateSession()if (!session) {redirect('/login') // 服务端重定向}return <>{children}</>
}

🧪 底层原理实验室

1. RSC Payload 结构

// 服务端响应示例
{"appLayout": {"children": [["$","div",null,{ ... }],["$","$L1",null,{ ... }]]},"pageComponent": {"type": "next-page","props": { ... }}
}

2. 客户端 Hydration 流程

Client Server 请求 /dashboard 返回 HTML + RSC Payload 解析 Payload 增量加载 JS 包 水合交互组件 Client Server

🚨 常见陷阱与解决方案

1. 路由冲突

app/
├── (group)/
│   └── page.tsx → ❌ 无效!
└── page.tsx      → ✅ 有效

规则page.tsx 必须位于路由路径末端

2. 动态导入限制

// 错误用法!
import dynamic from 'next/dynamic'const ClientComponent = dynamic(() => import('./Client'))export default function Page() {return <ClientComponent /> // ❌ 导致布局闪烁
}// 正确方式:在 layout 中预加载

3. 服务端组件滥用

// 危险操作!
async function fetchData() {const res = await fetch('https://api.example.com')return res.json()
}export default async function Page() {const data = await fetchData()return <div>{data.secret}</div> // ❌ 可能泄露敏感信息
}

最佳实践:敏感操作应放在 API 路由


🔮 未来演进方向

1. 服务端 Actions (Alpha)

// app/page.tsx
async function createItem(formData: FormData) {'use server'await db.items.create({data: Object.fromEntries(formData)})
}export default function Page() {return (<form action={createItem}><input name="title" /><button>Submit</button></form>)
}

2. 全栈组件 (Full-Stack Components)

// app/user-profile.tsx
export function UserProfile({ userId }) {const user = await db.users.findUnique({ where: { id: userId } })return (<div><h2>{user.name}</h2><p>{user.bio}</p></div>)
}

现在,你已经掌握了 App Router 的底层运作机制! 下一步建议:

  1. 在项目中实践复杂路由结构
  2. 使用 Next.js DevTools 调试路由
  3. 关注 Next.js 官方博客 获取最新动态

遇到具体问题时,记住这个终极调试技巧:

// 在任何组件中添加:
console.log('RENDER PATH:', window.location.pathname)
// 但要注意服务端组件无法访问 window 对象!

相关文章:

【Next.js App Router 深度解剖手册】

&#x1f50d; Next.js App Router 深度解剖手册 让我们抛开表象&#xff0c;直击 App Router 的设计核心&#xff01; 本文将用 2000 字 底层原理图解&#xff0c;带你彻底理解这个现代路由系统的运作机制。系好安全带&#xff0c;准备深入代码底层&#xff01; &#x1f68…...

Spring Boot ShardingJDBC分库分表(草稿)

ShardingJDBC分库分表 1.Maven 引用 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency><dependency><…...

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

Pipeline 获取 Jenkins参数

Pipeline 获取 Jenkins参数 Jenkins 提供了一系列默认的环境变量&#xff0c;这些变量在构建过程中可以被使用。以下是一些常见的 Jenkins 默认环境变量&#xff1a; WORKSPACE: 当前构建的工作目录路径 JOB_NAME: 当前构建的作业名称 BUILD_NUMBER: 当前构建的编号&#xff…...

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 万像素&#xff08;1600x1200&#xff09;。 输出格式&#xff1a;JPEG、YUV、RGB。 内置图像处理功能&#xff1a;自动曝…...

【Python爬虫(30)】构建高效爬虫数据管理体系:从抓取到协作

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

淘宝/天猫店铺订单数据导出、销售报表设计与数据分析指南

在电商运营中&#xff0c;订单数据是店铺运营的核心资产之一。通过对订单数据的导出、整理和分析&#xff0c;商家可以更好地了解销售情况、优化运营策略、提升客户满意度&#xff0c;并制定科学的业务决策。本文将详细介绍淘宝/天猫店铺订单数据的导出方法、销售报表的设计思路…...

EasyRTC智能硬件:实时畅联、沉浸互动、消音护航

在当今智能硬件迅猛发展的时代&#xff0c;音视频通讯技术已成为设备与用户、设备与设备间不可或缺的沟通纽带。而EasyRTC&#xff0c;凭借其无可比拟的实时性能、卓越的互动感受以及强大的交互实力&#xff0c;正逐步演变为智能硬件领域的“超级动力”核心。特别是其倾力打造的…...

Docker Mysql 数据迁移

查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...

【文本】词嵌入经典模型:从one-hot到BERT

【文本】词嵌入经典模型&#xff1a;从one-hot到BERT one-hot编码&#xff08;独热编码&#xff09;&#xff1a; 根据词表的所有词构建一个向量特征。每一个文段中每个单词有一个词向量&#xff08;二进制且只有一位为1&#xff09; — 稀疏、缺乏语义&#xff08;father&am…...

unity学习49:寻路网格链接 offMeshLinks, 以及传送门效果

目录 1 网格链接 offMeshLinks 功能入口 1.1 unity 2022之前 1.2 unity 2022之后 2 网格链接 offMeshLinks 功能设置 3 点击 offMeshLinks 功能里的bake 3.1 unity 2022之前 3.2 unity 2022之后 3.3 实测link 3.4 跳跃距离增大&#xff0c;可以实现轻功类的效果 4 …...

【SQL】SQL多表查询

多表查询案例联系点击此处 &#x1f384;概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 &#x1f4e2;案例&#xff1a;部门与员工的关系 &#x1f4e2;关系&…...

linux网络安全设置

TCP SYN Flood 攻击 TCP SYN Flood是一种常见&#xff0c;而且有效的远端(远程)拒绝服务(Denial of Service)攻击方式&#xff0c;它透过一定的操作破坏TCP三次握手建立正常连接&#xff0c;占用并耗 费系统资源&#xff0c;使得提供TCP服务的主机系统无法正常工作。由於TCP SY…...

AutoDock CrankPep or ADCP进行蛋白质多肽对接

需求描述 使用AutoDock CrankPep or ADCP进行蛋白质多肽对接 硬件及系统配置 自用电脑型号如下&#xff1a; 电脑&#xff1a;Precision Tower 7810 (Dell Inc.) CPU &#xff1a; Intel Xeon CPU E5-2686 v4 2.30GHz GPU&#xff1a; NVIDIA GeForce GTX 1070 Linux版本&a…...

Qt开源项目获取

GitHub上超实用的Qt开源项目,码住不谢!🎉 宝子们,今天来给大家安利一波GitHub上超棒的Qt开源项目,无论是学习还是开发,都能找到超多灵感和实用工具,快来看看有没有你需要的吧!1. Qt-Advanced-Docking-System完美的Dock窗口布局解决方案,让你的窗口管理变得超级灵活。…...

Java——super

在Java中&#xff0c;super关键字用于引用父类的成员&#xff08;属性、方法或构造器&#xff09;。它在继承关系中非常重要&#xff0c;主要用于以下几种场景&#xff1a; 1. 调用父类的构造器 在子类的构造器中&#xff0c;可以使用super关键字调用父类的构造器。super()必须…...

【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)

文章目录 第四章 创建型模式4.5 原型模式4.5.1 原型模式介绍4.5.2 原型模式原理4.5.3 深克隆与浅克隆4.5.4 原型模式应用实例4.5.5 原型模式总结 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 第四章 创建型模式 4.5 原型模式 4.5.1 原型模式介…...

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …...

嵌入式面试高频面试题:嵌入式系统调试方法大全

目录 调试基础概述 调试的重要性 嵌入式系统特点 调试流程 硬件调试方法 JTAG 调试 仿真器调试 逻辑分析仪 软件调试技巧 断点调试 日志输出 内存监视 代码静态分析 嵌入式调试器 常用调试器介绍 调试器使用技巧 远程调试方法 串口调试 网络调试 特殊调试场…...

Java中Map循环安全的删除数据的4中方法

文章目录 前言一、使用Iterator删除二、使用 removeIf&#xff08;Java 8&#xff09;三、遍历时记录需要删除的键&#xff08;不推荐&#xff09;四、使用 Stream&#xff08;Java 8&#xff09;总结 前言 在 Java 中&#xff0c;遍历 HashMap 并删除数据时&#xff0c;直接使…...

影刀RPA中级证书-Excel进阶-开票清单

1.操作题需求 请参照视频内容&#xff0c;将开票账单表格中的数据整理成开票清单。请下载 开票账单.xlsx 整理规则如下&#xff1a; 1. 金额为0的数据为赠品&#xff0c;无需开票&#xff0c;需删除2. 开票清单需要从开票账单中获取的数据包括有开票名称、数量、金额、税率&…...

PMBOK第7版整体架构全面详解

1. 引言 7月1日对于项目管理从业者和研究者而言&#xff0c;是个非凡意义的一个时间&#xff0c;这一天&#xff0c;翘首以待的《 项 目管理知识体系指南 》&#xff08;PMBOK&#xff09;第七版终于发布了。 总体而言&#xff0c;PMBOK第七版集百家之所长&#xff0c;成一…...

el-dropdown选中效果

vue2版本 <template><el-dropdown size"mini" command"handleCommand"><span class"el-dropdown-link">{{ selectedOption }}<i class"el-icon-arrow-down el-icon--right"></i></span><el-d…...

解决 `pip install open-webui` 时的编译错误:Microsoft Visual C++ 14.0 或更高版本缺失

在尝试安装 Python 包 open-webui 时&#xff0c;如果你遇到了如下错误信息&#xff1a; error: subprocess-exited-with-error Building wheel for chroma-hnswlib (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [5 lines of output]running bdist_w…...

git使用指南

一、git客户端设置 git config --global http.sslVerify false git config --global user.name 315222 git config --global user.email li_feng10dahuatech.com ssh-keygen -t rsa -C li_feng10dahuatech.com...

SpringBoot整合Redis和Redision锁

参考文章 1.Redis 1.导入依赖 <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.c…...

DeepSeek与ChatGPT的对比分析

一 概述 1 DeepSeek DeepSeek是杭州深度求索&#xff08;DeepSeek&#xff09;官方推出的AI助手&#xff0c;免费体验与全球领先AI模型的互动交流。总参数达到6710亿的DeepSeek-V3大模型&#xff0c;多项性能指标对齐海外顶尖模型&#xff0c;用更快的速度、更加全面强…...

部署前端项目

前端项目部署是指将前端应用程序从开发环境转移到生产环境的过程&#xff0c;涉及上传代码和资源文件至服务器并确保其正确运行&#xff0c;以下是详细步骤&#xff1a; 一、前期准备 检查项目依赖&#xff1a;确保项目的所有依赖都已正确安装&#xff0c;并更新到最新版本。常…...

python-leetcode 38.翻转二叉树

题目&#xff1a; 给定一个二叉树的根节点root,检查它是否轴对称。 方法一&#xff1a;递归 如果一个树的左子树与右子树镜像对称&#xff0c;那么这个树是对称的。 互为镜像的条件&#xff1a;他们的两个根结点具有相同的值&#xff0c;每棵树的右子树都与另一个树的左子树…...

js中常用方法整理

数据类型 typeOf()Number&#xff08;&#xff09;parseInt()parseFloat()- * / %检测数据类型转换为数字转换为整数类型转换为浮点类型非加法的数字运算toString()Boolean()String()转换为字符串&#xff0c;不能转换undefined/null字符串拼接转换为布尔类型转换为字符串、所有…...

【云原生】最新版Kubernetes集群基于Containerd部署

文章目录 Kubernetes集群基于Containerd部署(单主多从模式)资源列表基础环境一、基础环境准备1.1、关闭Swap分区1.2、添加hosts解析1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时2.1、安装Containerd2.2、配置Containerd2.3、启动Containerd 三、部署Ku…...

Flink CDC详解

一、Flink CDC 概述 1.1 什么是 Flink CDC? Flink CDC 是 Apache Flink 提供的一种实时数据捕获技术,主要用于从数据库中捕获增量数据变更(如插入、更新、删除操作),并将这些变更数据传输到目标系统进行实时处理或存储。 1.2 Flink CDC 的核心价值 实时数据处理:能够实…...

匹配算法:向下就近原则,向下没有就向上

匹配算法&#xff1a;向下就近原则&#xff0c;向下没有就向上 实现方式一实现方式二总结 实现方式一 private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList sourceList.stre…...

网络安全三件套

一、在线安全的四个误解     Internet实际上是个有来有往的世界&#xff0c;你可以很轻松地连接到你喜爱的站点&#xff0c;而其他人&#xff0c;例如黑客也很方便地连接到你的机器。实际上&#xff0c;很多机器都因为自己很糟糕的在线安全设置无意间在机器和系统中留下了“…...

NLP-RNN-LSTM浅析

目录 双向 LSTM&#xff08;Bi - LSTM&#xff09; 双向 LSTM&#xff08;Bi - LSTM&#xff09;原理深入讲解 代码示例&#xff08;基于 PyTorch&#xff09; LSTM 应用到双向 RNN 中 代码示例&#xff08;基于 PyTorch&#xff09; 双向 LSTM - CRF&#xff08;Conditio…...

深入解析 iText 7:从 PDF 文档中提取文本和图像

在现代开发中&#xff0c;PDF 文件的操作是不可避免的一部分。无论是生成报告、解析文档&#xff0c;还是从文件中提取信息&#xff0c;我们常常需要处理 PDF 文件。iText 是一个非常强大的库&#xff0c;广泛应用于 PDF 文件的创建、修改和解析。自 iText 7 发布以来&#xff…...

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作开发的 AI 编程助手&#xff0c;它可以在多种开发工具中使用。以下是 GitHub Copilot 支持的主要开发工具和平台&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中拥有最完整的集…...

深入理解 MySQL 8 C++ 源码:SELECT MOD(MONTH(NOW()), 2) 的函数执行过程

MySQL 作为最流行的关系型数据库之一&#xff0c;其内部实现机制一直是开发者探索的热点。本文将以一条简单的 SQL 查询 SELECT MOD(MONTH(NOW()), 2) 为例&#xff0c;深入分析 MySQL 8 源码中内置函数 MOD、MONTH 和 NOW 的执行过程&#xff0c;揭示其底层实现逻辑。 一、SQL…...

基于深度学习进行呼吸音检测的详细示例

以下是一个基于深度学习进行呼吸音检测的详细示例&#xff0c;我们将使用Python语言以及一些常见的深度学习库&#xff08;如TensorFlow、Keras&#xff09;和数据处理库&#xff08;如numpy、pandas&#xff09;&#xff0c;同时会用到音频处理库librosa。整个流程包括数据加载…...

Python 正则表达式的非捕获组介绍

在 Python 正则表达式中&#xff0c;非捕获组 ((?:...)) 是一种用于分组但不保存匹配结果的结构。它与普通的捕获组 (...) 语法类似&#xff0c;但在匹配时不会创建编号或命名的组&#xff0c;常用于简化正则表达式和提高性能。 1. 语法 (?:pattern)?: 表示非捕获标记。pat…...

用大内存主机下载Visual Studio

用一台内存达到128G的主机下载Visual Studio 2022&#xff0c;用的是公司网络。下载速度让我吃了一惊&#xff0c;没人用网络了&#xff1f;还是网站提速了&#xff1f;以前最大只能达到5MB/秒。记录这段经历&#xff0c;是用来分析公司网络用的.........

快速入门——Vue框架快速上手

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;8.Vue框架快速上手_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 第一节&#xff1a;前端环境准备 编码工具VSCode【www.code.visualstudio.com】/WebStorm也可&am…...

zero自动化框架搭建---Git安装详解

一、Git下载 下载安装包 官网下载 下载的地址就是官网即可&#xff1a;Git - Downloads 进来直接选择windows的安装包下载 选择安装位置 双击安装包安装&#xff0c;选择安装地址后点击next 选择安装的组件&#xff0c;默认即可 也可按照需要自行选择 Windows Explorer i…...

适用于复杂背景的YOLOv8改进:基于DCN的特征提取能力提升研究

文章目录 1. YOLOv8的性能瓶颈与改进需求1.1 YOLOv8的优势与局限性1.2 可变形卷积&#xff08;DCN&#xff09;的优势 2. DCN在YOLOv8中的应用2.1 DCN的演变与YOLOv8的结合2.2 将DCN嵌入YOLOv8的结构中2.2.1 DCNv1在YOLOv8中的应用2.2.2 DCNv2与DCNv3的优化 2.3 实验与性能对比…...

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Flutter:动态表单(在不确定字段的情况下,生成动态表单)

关于数据模型&#xff1a;模型就是一种规范约束&#xff0c;便于维护管理&#xff0c;在不确定表单内会出现什么数据时&#xff0c;就没有模型一说。 这时就要用到动态表单&#xff08;根据接口返回的字段&#xff0c;生成动态表单&#xff09; 1、观察数据格式&#xff0c;定义…...

Redis存在线程安全问题吗?

Redis本身在其单线程模型下是线程安全的&#xff0c;但在特定应用场景下&#xff0c;仍可能面临线程安全相关的挑战。以下是对Redis线程安全性的详细讲解&#xff1a; Redis线程安全的基础 单线程模型&#xff1a; Redis采用单线程模型来处理客户端的请求。这意味着&#xff0…...

Maven 与 Kubernetes 部署:构建和部署到 Kubernetes 环境中

在现代的 DevOps 实践中&#xff0c;Kubernetes 被广泛用于容器化应用的自动化部署、扩展和管理。而 Maven 是 Java 项目中常用的构建工具&#xff0c;通常用于依赖管理、构建、打包等任务。在许多项目中&#xff0c;Maven 和 Kubernetes 可以结合起来&#xff0c;完成 容器化构…...

与本地电脑PDF文档对话的PDF问答程序

文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时&#xff0c;了解LangChain框架的理论知识固然重要&#xff0c;但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作&#xff0c;你可…...

什么是uniapi

“UniAPI”有两种不同的含义&#xff0c;具体取决于上下文&#xff1a; 1. uni-app 的 API uni-app 是一个基于 Vue.js 的跨平台应用开发框架&#xff0c;允许开发者编写一套代码并发布到 iOS、Android、Web、以及各种小程序等多个平台。uni-app 的 API 是其核心功能之一&…...