Next.js App Router 实战:从官方 Playground 探索现代 Web 开发最佳实践

news2026/5/13 5:23:13
1. 项目概述与定位最近在捣鼓 Next.js 的几个新特性比如 Server Actions、并行路由、拦截路由这些光看文档总觉得隔靴搔痒想找个能上手实操、快速验证想法的环境。这时候Vercel 官方维护的next-app-router-playground项目就成了我的首选“试验田”。这个项目本质上是一个功能齐全的 Next.js 应用示例集但它远不止是一个简单的“Hello World”。它是 Vercel DX开发者体验团队用来探索、测试和演示 Next.js 新特性的内部沙盒。这意味着你在这里看到的每一个路由、组件和交互都可能代表着 Next.js 未来最佳实践的方向或者是某个正在孵化中的功能的早期形态。对于像我这样的一线开发者来说这就像拿到了产品经理和工程师的内部设计稿能提前感知框架的演进脉络在技术选型和架构设计上快人一步。这个 Playground 的价值在于它的“实时性”和“真实性”。它不是为了教学而简化的玩具项目而是一个包含了复杂状态管理、数据获取、缓存策略、错误边界等真实场景的完整应用。通过运行它你可以直观地看到 App Router 下的文件结构如何组织Server Components 和 Client Components 如何混编流式渲染Streaming的实际效果乃至最新的 Partial Prerendering 是如何工作的。无论你是 Next.js 新手想通过一个高质量示例快速上手还是资深用户想深入研究某个特定 API 的边界情况这个仓库都能提供远超官方基础文档的深度视角。接下来我就带你深入这个宝库看看怎么把它跑起来并挖掘其中那些值得细品的实战技巧。2. 环境准备与项目启动2.1 系统与工具链要求在拉取代码之前确保你的本地开发环境已经就绪。这个项目对 Node.js 版本有一定要求因为它通常会使用最新的 Next.js 特性而这些特性可能依赖于较新的 Node API。我建议使用 Node.js 18.17.0 或更高版本最好是 LTS 版本以保证稳定性。你可以通过node -v命令检查当前版本。包管理器方面项目推荐使用pnpm这从它的package.json和锁文件就能看出来。pnpm的优势在于磁盘空间利用率和安装速度并且能严格保证依赖树的一致性这对于这种频繁更新依赖的探索性项目尤为重要。如果你还没有安装pnpm可以通过npm install -g pnpm快速安装。除了运行时一个好的代码编辑器也必不可少。我强烈推荐 VS Code并安装官方的Next.js扩展。这个扩展能提供路由、组件、环境变量等智能感知对于理解 App Router 基于文件系统的路由机制有巨大帮助。另外确保你的终端无论是 macOS 的 Terminal、Windows 的 PowerShell 还是 WSL有足够的权限进行文件操作和网络访问。2.2 克隆项目与依赖安装一切准备就绪后我们就可以把项目拿到本地了。打开终端进入你常用的开发目录执行克隆命令git clone https://github.com/vercel/nextjs-app-router-playground.git cd nextjs-app-router-playground这里有个细节需要注意仓库的主分支名称可能是main但也可能因为开发进度而使用其他分支如canary来测试 Next.js 的每日构建版。克隆后你可以用git branch -a查看所有远程分支。如果你想体验最前沿甚至尚未发布的功能可以尝试切换到canary分支git checkout canary。不过这可能会遇到一些不稳定的情况更适合用于探索而非稳定开发。进入项目根目录后安装依赖就非常简单了pnpm install这个过程会读取package.json下载 Next.js、React 以及一系列开发工具如 TypeScript、ESLint、Tailwind CSS 等。由于是 Playground它的依赖可能比普通项目更丰富包含了用于演示的各种 UI 库和工具。如果网络状况不佳你可以考虑配置pnpm的国内镜像源来加速。安装完成后你会注意到node_modules目录被高效地链接起来这正是pnpm的功劳。2.3 启动开发服务器与初次访问依赖安装成功后启动开发服务器只需要一行命令pnpm dev终端会输出类似下面的信息表明 Next.js 开发服务器已经成功启动通常运行在http://localhost:3000。▲ Next.js 14.2.0 - Local: http://localhost:3000 - Environments: .env.local ✓ Ready in 3.2s现在打开你的浏览器访问http://localhost:3000。你应该会看到一个功能导航页面而不是一个简单的欢迎页。这个导航页本身就是第一个值得学习的范例它很可能是一个 Server Component动态地从文件系统中读取所有的示例路由并生成一个列表。页面风格简洁使用了 Tailwind CSS每个示例链接都清晰地描述了其演示的功能点例如“Dynamic Data Fetching”、“Streaming with Suspense”、“Server Actions Form”等。注意第一次启动时Next.js 会进行一些初始编译可能会稍慢。后续修改文件的热重载Hot Module Replacement会非常快。如果端口 3000 已被占用Next.js 会自动尝试下一个端口如 3001并会在终端明确提示你。3. 项目结构深度解析3.1 App Router 核心目录布局打开项目文件夹你会看到典型的 Next.js 13 项目结构。核心在于app目录这是 App Router 的基石。我们深入看一下它的组织方式/app ├── layout.tsx # 根布局定义全局 HTML 骨架和共享 UI ├── page.tsx # 首页路由/ ├── globals.css # 全局样式 ├── api/ # API 路由示例可选Playground可能包含 ├── (dashboard)/ # 路由组Route Group用于组织路由而不影响URL路径 │ ├── layout.tsx │ ├── page.tsx │ └── analytics/ │ └── page.tsx ├── blog/ │ ├── [slug]/ │ │ └── page.tsx # 动态路由示例 │ └── loading.tsx # 针对 /blog/* 的加载状态UI ├── parallel-routes/ # 并行路由演示 ├── intercepting-routes/ # 拦截路由演示 └── ...layout.tsx和page.tsx是每个路由目录的核心文件。Playground 会充分利用这些约定。例如根目录的layout.tsx可能设置了全局的元数据Metadata、字体和主题提供器。而page.tsx就是我们在第一步访问到的导航首页。路由组Route Group(dashboard)是一个精妙的设计。括号内的文件夹名称不会体现在 URL 中即访问路径仍是/dashboard而非/(dashboard)/dashboard。它的作用是将一组相关的路由如仪表板及其所有子页面在文件系统中逻辑地组织在一起便于管理并且可以为其内部的所有路由共享一个独立的布局layout.tsx而不影响根布局。Playground 里很可能用它来演示如何为应用的不同模块如用户端和管理端创建分离的布局结构。3.2 核心文件功能与代码模式让我们挑几个关键文件看看 Vercel 团队是如何编写它们的。1. 根布局 (app/layout.tsx)这个文件定义了整个应用的 HTML 框架。你会看到它接收{ children }: React.PropsWithChildren作为参数并返回一个完整的 HTML 文档。里面通常会包含html和body标签。head区域通过导出metadata对象或generateMetadata函数来设置 SEO 相关的标题、描述等。全局状态提供器如ThemeProvider、ReactQueryProvider等。全局导航栏或侧边栏组件。错误边界组件ErrorBoundary包裹children。对children的渲染这是嵌套布局和页面的注入点。2. 页面组件 (app/*/page.tsx)每个page.tsx默认是一个 React Server Component。这意味着你可以在里面直接进行异步数据获取而无需使用useEffect和状态。Playground 的示例会大量使用async/await语法来演示服务端数据获取。// 示例一个博客列表页 export default async function BlogPage() { // 直接在Server Component中获取数据代码不会被打包到客户端bundle const posts await fetch(https://api.example.com/posts).then(res res.json()); return ( div h1Blog Posts/h1 ul {posts.map(post ( li key{post.id} Link href{/blog/${post.slug}}{post.title}/Link /li ))} /ul /div ); }3. 加载状态 (app/*/loading.tsx)这是 App Router 引入的基于文件约定的加载 UI。当该路由段及其子段的数据正在加载时Next.js 会自动用这个组件替换page.tsx。Playground 会展示如何设计优雅的骨架屏Skeleton Screen。// app/blog/loading.tsx export default function BlogLoading() { return ( div classNameanimate-pulse div classNameh-8 bg-gray-200 rounded w-1/4 mb-4/div {[...Array(5)].map((_, i) ( div key{i} classNameh-4 bg-gray-200 rounded w-full mb-2/div ))} /div ); }4. 错误处理 (app/*/error.tsx) 和全局错误 (app/global-error.tsx)error.tsx用于捕获并处理其所在路由段及子段的运行时错误是 React 错误边界在文件系统中的体现。global-error.tsx则用于捕获根布局中的错误。Playground 会演示如何利用这些文件提供用户友好的错误反馈和恢复机制。3.3 数据获取与缓存策略演示Playground 会重点演示 App Router 中几种不同的数据获取模式及其缓存策略这是性能优化的关键。1. 服务端数据获取Server Data Fetching在 Server Component 中使用fetch。Next.js 扩展了原生的fetchAPI默认会对请求进行缓存除非明确指定cache: no-store或next: { revalidate: 60 }。Playground 可能会有对比示例展示缓存与不缓存对页面加载速度和服务器负载的影响。// 缓存默认行为force-cache const cachedData await fetch(https://api.example.com/data); // 不缓存动态数据 const dynamicData await fetch(https://api.example.com/data, { cache: no-store }); // 每60秒重新验证缓存 const revalidatedData await fetch(https://api.example.com/data, { next: { revalidate: 60 } });2. 使用 Reactcache函数对于不是用fetch进行的操作如数据库查询、第三方 SDK 调用可以使用 React 的cache函数来手动实现请求去重和记忆化。Playground 可能会展示一个查询数据库的函数如何通过cache避免在同一个渲染周期内被重复调用。import { cache } from react; import db from /lib/db; export const getPost cache(async (slug: string) { // 这个函数在同一个渲染请求中对相同的 slug 只会执行一次 return await db.post.findUnique({ where: { slug } }); });3. 流式渲染与 Suspense这是提升感知性能的利器。Playground 肯定会有一个示例展示如何使用Suspense边界包裹异步组件实现页面的渐进式加载。比如先显示文章标题和作者信息立即服务端渲染然后在一个 Suspense 边界内流式加载评论列表。// app/post/[id]/page.tsx export default async function PostPage({ params }: { params: { id: string } }) { const post await getPost(params.id); // 快速获取的文章数据 return ( article h1{post.title}/h1 pBy {post.author}/p {/* 评论部分单独流式加载 */} Suspense fallback{CommentsSkeleton /} Comments postId{post.id} / /Suspense /article ); } async function Comments({ postId }: { postId: string }) { // 这个获取可能较慢 const comments await fetchComments(postId); return CommentList comments{comments} /; }4. 核心特性实战演示拆解4.1 Server Actions 深度应用Server Actions 是 Next.js 14 的明星功能它允许你在服务端定义函数并在客户端组件中直接调用无需创建单独的 API 路由。Playground 会提供从简单到复杂的完整示例。基础表单提交一个最典型的例子是联系表单。在app/actions.ts或任何文件中使用use server指令定义一个动作// app/actions.ts use server; import { revalidatePath } from next/cache; import { redirect } from next/navigation; export async function createPost(formData: FormData) { const title formData.get(title); const content formData.get(content); // 验证数据 if (!title || !content) { return { error: Missing required fields }; } // 写入数据库模拟 await db.post.create({ data: { title, content } }); // 使博客列表页的缓存失效触发重新验证 revalidatePath(/blog); // 重定向到新文章页 redirect(/blog/${newPost.slug}); }然后在客户端组件中你可以通过action属性或formAction来绑定这个动作// app/blog/create/page.tsx (这是一个Client Component因为用了useState和事件处理) use client; import { createPost } from /app/actions; import { useActionState } from react; // 或从 react-dom 导入 useFormState export default function CreatePostPage() { // useActionState 用于管理表单状态和动作结果 const [state, formAction, isPending] useActionState(createPost, null); return ( form action{formAction} input nametitle / textarea namecontent / button typesubmit disabled{isPending} {isPending ? Submitting... : Create Post} /button {state?.error p classNameerror{state.error}/p} /form ); }Playground 的示例会进一步展示渐进式增强即使 JavaScript 被禁用表单仍能通过传统的 HTML 表单提交工作。乐观更新Optimistic Updates在动作提交的同时立即在 UI 上显示预期的结果提升用户体验。这通常需要结合useOptimistichook。使用useFormStatus在表单的子组件中获取提交状态比如禁用提交按钮或显示加载指示器。4.2 并行路由与拦截路由这两个是 App Router 中用于构建复杂 UI 布局和导航模式的高级特性。并行路由Parallel Routes允许你同时且独立地渲染同一个布局下的多个页面。想象一下仪表板侧边栏、主内容区、通知面板可以同时加载。Playground 会有一个类似app/analytics/page.tsx和app/notifications/page.tsx的结构它们与app/page.tsx在同一个布局 (app/layout.tsx) 中被并行渲染。layout.tsx会通过props接收这些“插槽”// app/dashboard/layout.tsx export default function DashboardLayout({ children, analytics, notifications, }: { children: React.ReactNode; analytics: React.ReactNode; notifications: React.ReactNode; }) { return ( div Sidebar / main{children}/main aside {analytics} {notifications} /aside /div ); }拦截路由Intercepting Routes用于在当前上下文中“拦截”一个导航并以模态框Modal、抽屉Drawer或新页面等形式展示目标路由而不是进行完整的页面跳转。典型场景是点击照片列表中的一张图在当前页面弹出一个模态框显示大图而不是跳转到单独的详情页。Playground 的示例结构可能如下/app ├── photo/ │ └── [id]/ │ └── page.tsx # 独立的详情页 (e.g., /photo/1) └── modal/ └── (.)photo/ # (.) 表示拦截同一层级的 photo 路由 └── [id]/ └── page.tsx # 以模态框形式展示的拦截页当用户从/页面点击链接进入/photo/1时会被modal/(.)photo/[id]/page.tsx拦截并在当前页面以模态框形式打开。如果用户直接访问/photo/1则会渲染独立的详情页。Playground 会清晰地展示这种文件命名约定(.),(..),(...)用于表示相对路径拦截和实现逻辑。4.3 中间件与高级路由控制Playground 可能还会包含middleware.ts的示例它运行在路由匹配之前用于处理身份验证、重定向、路径重写、设置请求头等全局逻辑。例如一个简单的认证中间件// middleware.ts import { NextResponse } from next/server; import type { NextRequest } from next/server; export function middleware(request: NextRequest) { const token request.cookies.get(auth-token)?.value; // 如果未登录且不在登录页重定向到登录页 if (!token !request.nextUrl.pathname.startsWith(/login)) { const loginUrl new URL(/login, request.url); loginUrl.searchParams.set(from, request.nextUrl.pathname); return NextResponse.redirect(loginUrl); } // 如果已登录且访问登录页重定向到首页 if (token request.nextUrl.pathname.startsWith(/login)) { return NextResponse.redirect(new URL(/, request.url)); } return NextResponse.next(); } // 配置匹配路径避免对静态资源等不必要的请求执行中间件 export const config { matcher: [/((?!api|_next/static|_next/image|favicon.ico).*)], };通过 Playground 的示例你可以学习如何高效地使用中间件进行 A/B 测试、区域设置、机器人检测等。5. 开发、构建与部署实战5.1 开发工作流与调试技巧运行pnpm dev后你就进入了高效的开发循环。Next.js 提供了强大的开发工具快速刷新Fast Refresh修改组件代码几乎实时可见。Playground 的示例组件众多是体验这一特性的好机会。错误覆盖层Error Overlay当编译或运行时出错浏览器中会显示一个详细的错误覆盖层直接定位到源码行并给出修复建议。React 开发者工具确保其已安装并启用。在组件树中你可以清晰地区分 Server Components可能显示为AsyncComponent或带有特殊标志和 Client Components这对于理解应用的渲染流至关重要。一个实用的调试技巧是在 Server Component 中你可以直接使用console.log输出会在运行 Next.js 的终端中显示而不是浏览器控制台。这对于调试数据获取逻辑非常方便。5.2 构建分析与优化当你准备将类似 Playground 中的模式应用到生产项目时构建分析是关键一步。在项目根目录运行pnpm build构建完成后Next.js 会输出一个包含每个路由大小、首次加载 JavaScript 体积、缓存优化情况等信息的报告。但更直观的是使用next/bundle-analyzer安装pnpm add -D next/bundle-analyzer在next.config.js中配置。运行ANALYZEtrue pnpm build。这会在浏览器中打开一个交互式图表展示每个依赖包对最终打包体积的贡献。通过 Playground你可以观察哪些示例引入了较大的依赖并思考在实际项目中如何通过动态导入dynamic import来优化。优化点示例动态导入客户端组件如果一个大的 UI 库如图表库只在特定页面使用使用next/dynamic进行动态导入避免其包含在主包中。const HeavyChart dynamic(() import(/components/HeavyChart), { ssr: false });优化图片Playground 肯定使用了next/image组件。确保你理解sizes、priority等属性的配置以实现响应式图片和优先级加载。5.3 部署到 Vercel及其他平台由于是 Vercel 的官方项目部署到 Vercel 自然是最顺畅的体验。将你的代码仓库连接到 Vercel 后它能够自动识别 Next.js 项目并完成以下工作自动构建和部署每次推送到连接的分支如main都会触发自动部署。环境变量管理在 Vercel 项目设置中安全地配置环境变量。边缘网络分发你的应用会被部署到全球的边缘网络实现极快的访问速度。Serverless 函数API 路由和 Server Actions 会被自动打包并部署为独立的 Serverless 函数按需运行和缩放。注意Playground 项目可能包含一些仅为演示而设的、不适用于生产环境的配置或代码如内联的敏感信息、过于宽松的 CORS 设置。在基于此模式创建自己的生产项目时务必进行安全审查。如果你选择部署到其他平台如 AWS、Google Cloud、Netlify 或你自己的服务器需要确保平台支持 Next.js 所需的运行环境Node.js 或 Edge Runtime。通常需要自定义构建命令和输出目录.next和public。许多平台都提供了 Next.js 的部署指南。6. 常见问题与排查实录在运行和借鉴 Playground 项目时你可能会遇到一些典型问题。以下是我在实际操作中总结的排查清单问题现象可能原因解决方案pnpm install失败提示peer dependency冲突Next.js canary 版本或某些演示库依赖特定版本的 React/其他包。1. 尝试删除node_modules和pnpm-lock.yaml后重新安装。2. 使用pnpm install --force谨慎可能破坏依赖树。3. 查看仓库的 Issue 或讨论看是否有已知的版本问题。开发服务器启动后页面空白或报错Module not found文件命名或路径引用错误。App Router 对page.tsx,layout.tsx等文件名是强约定的。1. 检查文件是否放在正确的app目录下且名称拼写完全正确。2. 检查组件导入路径是否正确特别是使用别名如/*时确认tsconfig.json中的paths配置。Server Component 中调用useState,useEffect等 Hook 报错在默认为 Server Component 的文件中错误地使用了客户端 Hook。1. 在文件顶部添加use client指令将其转换为 Client Component。2. 或者将使用 Hook 的逻辑提取到一个子组件中并在该子组件顶部添加use client。动态路由 ([slug]) 页面无法正确匹配动态参数未在page.tsx的函数参数中正确解构或generateStaticParams返回的数据格式不对。1. 确保page.tsx函数定义为export default function Page({ params }: { params: { slug: string } })。2. 如果使用静态生成确保generateStaticParams返回的是{ slug: string }[]格式的数组。Server Action 提交后页面无反应或报 405 错误表单未正确绑定action或 Server Action 函数定义有误。1. 确保表单的action属性绑定的是导入的 Server Action 函数。2. 确保 Server Action 文件顶部有use server指令。3. 检查浏览器控制台网络标签查看表单提交请求的响应状态和内容。4. 在 Server Action 内部使用console.log调试日志输出在终端。样式Tailwind CSS未生效Tailwind 的 CSS 文件未正确导入或内容类名不在扫描范围内。1. 确保根布局app/layout.tsx中导入了app/globals.css。2. 检查tailwind.config.js中的content配置确保它包含了所有模板文件路径如./app/**/*.{js,ts,jsx,tsx}。部署后图片或静态资源 404next/image未配置远程图片域名或public目录下的文件路径引用错误。1. 对于外部图片在next.config.js的images.remotePatterns中配置允许的域名。2. 对于public下的文件使用绝对路径/logo.png引用而不是相对路径。个人实操心得从模仿到理解不要只是运行 Playground而是尝试修改它。比如改动一个 Server Action 的逻辑看看错误如何传递或者在一个并行路由示例中新增一个“插槽”。在破坏和修复的过程中学习最快。关注控制台与终端Next.js 的开发服务器会在终端输出非常有用的信息包括缓存状态、编译警告、Server Component 的console.log。养成同时观察浏览器控制台和终端窗口的习惯。善用 TypeScriptPlayground 项目是强类型化的。当你自己编写代码时充分利用 TypeScript 的类型提示和错误检查它能提前发现许多潜在的路由参数错误、组件属性不匹配等问题。循序渐进App Router 的概念密度很高。不要试图一次性掌握所有特性并行路由、拦截路由、中间件、Server Actions。先从最核心的page、layout、loading、error和 Server Components 数据获取开始构建一个简单的 CRUD 应用。等这些概念内化后再逐步引入更高级的特性。Playground 的价值就在于当你准备学习某个新特性时它总有一个现成的、可运行的例子在等你。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…