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

Nuxt 3 面试题合集(中高级)

文章目录

    • 问题1:Nuxt 3 的项目结构是怎样的?各主要目录有何作用?
    • 问题2:Nuxt 3 的路由机制如何运作?如何定义动态路由和嵌套路由?
    • 问题3:Nuxt 3 提供了哪些生命周期钩子?它们如何分类运作?
    • 问题4:如何在 Nuxt 3 中定义和使用插件?如何控制插件的运行环境?
    • 问题5:Nuxt 3 的模块(Module)机制是什么?它与插件有何区别?如何开发自定义模块?
    • 问题6:什么是服务端渲染(SSR)?Nuxt 3 默认如何实现 SSR,带来哪些好处?
    • 问题7:什么是 Nuxt 3 的 Nitro 引擎?它在 SSR 中扮演什么角色,有何独特优势?
    • 问题8:什么是 Composables?Nuxt 3 中如何使用 Composables,有何特点?
    • 问题9:Nuxt 3 中的自动导入(Auto Imports)机制是怎样的?它能自动导入哪些内容,带来哪些好处?
    • 问题10:什么是 Nuxt 3 的运行时配置(Runtime Config)?如何使用它?Public 和 Private 配置有何区别?
    • 问题11:Nuxt 3 中如何使用 Middleware?路由中间件有哪些类型,作用是什么?它和服务端 Middleware 有何区别?
    • 问题12:`useAsyncData` 和 `useFetch` 有何区别?在 Nuxt 3 中分别适用于哪些场景?


问题1:Nuxt 3 的项目结构是怎样的?各主要目录有何作用?

参考答案:
Nuxt 3 采用“约定优于配置”的项目结构,各目录名称和功能是框架预先规定好的。主要目录包括:

  • pages/:页面文件目录,根据文件自动生成对应的路由。例如 pages/index.vue 会映射为主页路径 /
  • components/:组件目录,存放可复用的 Vue 组件,Nuxt 会自动注册这里的组件,无需手动导入。
  • layouts/:布局目录,定义应用的布局模板(如通用的页眉页脚)。可在页面组件中指定使用某个布局。默认存在全局布局 app.vue 作为应用入口。
  • composables/:组合式函数目录(即封装的 Composition API 功能),可在组件中直接使用,这里的函数也会被自动导入。
  • plugins/:插件目录,存放在应用启动时运行的插件文件(可扩展 Vue 功能或注册全局资源),Nuxt 会在构建应用时自动加载顶层的插件文件。
  • middleware/:路由中间件目录,用于存放定义导航守卫的文件,在页面导航前执行,可用于权限校验等。其中以.global结尾的文件为全局中间件,会在每次路由切换时运行。
  • assets/public/:静态资源目录。assets 下的资源会由构建工具处理(例如打包、哈希等),而 public 下的文件会原样复制到最终部署包中,可以通过根路径直接访问(例如 public/favicon.ico 对应访问路径 /favicon.ico)。
  • server/:服务端目录,用于编写后端逻辑,包括 API 路由 (server/api) 和服务器中间件 (server/middleware) 等,Nuxt 会扫描该目录自动注册服务端接口处理函数。
  • nuxt.config.ts: Nuxt 配置文件,在其中定义 Nuxt 应用的全局配置(如模块、插件、运行时配置等)。

解析:
Nuxt 3 的目录结构遵循固定的约定,每个目录承担特定功能,开发者按照约定放置代码即可享受框架提供的自动化配置能力。例如,在 pages 目录中新建页面组件,会自动生成对应的前端路由,无需手写路由配置。这体现了 Nuxt “文件即路由”的理念,使得路由配置更直观简单。类似地,components 目录下的 Vue 组件会被自动导入到应用中,开发时可以直接使用组件标签,而不必每次 import

app.vue 文件是 Nuxt 3 应用的根组件(全局布局)。如果存在 pages 目录,那么 app.vue 通常用来包裹页面内容,需要包含 <NuxtPage/> 来渲染具体页面组件。layouts 目录则可定义多个可选布局,供页面声明使用。如果没有创建 pages 目录,Nuxt 会认为这是一个单页面应用,不启用路由系统(也可以在配置中强制开启)。

通过划分 assetspublic 两个目录,Nuxt 将需要经过构建管线处理的资源(如需通过 Webpack/Vite 打包的样式、图片)与无需处理的静态资源区分开。放在 assets 的资源可以通过 ~@ 别名引用,构建时会优化打包;而 public 下的文件会直接复制到最终部署的静态文件夹,适合于例如 robots.txt、favicon 等无需修改的文件。

总体而言,这种项目结构体现了 Nuxt 3 “约定优于配置”的设计哲学。开发者只需遵循 Nuxt 既定的目录规范,框架就能自动完成路由注册、组件注册、代码拆分等繁琐工作,让开发专注于业务逻辑而非重复配置。

问题2:Nuxt 3 的路由机制如何运作?如何定义动态路由和嵌套路由?

参考答案:
Nuxt 3 使用文件系统路由机制:pages/ 目录下的所有 .vue 文件会自动生成对应的前端路由,无需手动配置。路由规则基于文件和目录结构,例如:

  • 文件名决定基础路径:如 pages/about.vue 自动映射为路径 /aboutpages/blog/post.vue 则映射为 /blog/post
  • 动态路由通过方括号定义参数:例如文件 pages/users/[id].vue 对应路径 /users/:id。在组件中可通过 $route.params.id 或组合式 API 的 useRoute() 获取该参数。若参数是可选的,可用双括号,例如 pages/[[slug]].vue 匹配有无参数两种情况(既匹配 / 又匹配 /test 路径)。使用 [...] 三点展开还可以捕获跨层级的通配路由,例如 pages/[...slug].vue 能匹配所有后续路径并将其作为数组参数提供。
  • 嵌套路由通过嵌套目录实现:将页面文件放入子目录,并在父级目录下创建同名 .vue 文件作为容器。例如目录结构:pages/parent.vuepages/parent/child.vue 会生成父子嵌套路由 /parent/parent/child。父组件需在模板中使用 <NuxtPage/> 作为占位符来渲染其子路由组件。
  • 路由优先级根据文件结构自动确定:例如存在 pages/foo.vuepages/foo/[slug].vue 时,请求 /foo/hello 优先匹配静态的 foo.vue 页面。为避免冲突,一般通过在 foo/ 子目录下放置 index.vue 来作为 /foo 路由,让 foo/[slug].vue 专管 /foo/*

解析:
Nuxt 3 的路由系统建立在 Vue Router 之上,但通过文件系统抽象,开发者无需直接编写路由配置,提升了开发效率和一致性。框架会扫描 pages 目录结构生成等价的路由表。例如上述嵌套路由示例将被转换为嵌套的路由配置对象,父路由的组件为parent.vue,其 children 列表包含子路由parent/child.vue。开发者在父组件中插入 <NuxtPage/>,Nuxt 会根据当前子路由动态加载并渲染相应的子组件,从而实现嵌套结构。需要注意,父组件中只能有一个根元素包裹 <NuxtPage/>,否则页面切换时过渡效果可能异常。

对于动态路由,Nuxt 通过文件名中的方括号将其转换为路径参数。例如 pages/posts/[slug].vue 会匹配 /posts/ 下任意参数,并将其值传递给页面组件。双括号(如 [[slug]])允许参数可选存在,这是 Nuxt 3 新增的灵活性。在实际应用中,动态参数通常用于详情页等场景,Nuxt 还支持通配符路由(使用 ...)来捕获未知深度的路径,这对于构建404页面或多级路由非常有用。

值得一提的是,Nuxt 3 引入了路由分组概念,可以使用括号将目录名包裹,如 (admin),使之不参与URL路径。例如 pages/(admin)/dashboard.vuepages/(admin)/settings.vue 最终路由为 /dashboard/settings(而非 /admin/dashboard),用于对路由进行分组组织而不影响实际路径。这在大型项目中有助于分类管理路由文件。

此外,Nuxt 3 路由机制与中间件系统联动:在页面组件中可通过 definePageMeta 指定需要运行的路由中间件列表(包括匿名函数或命名中间件)。路由切换时,Nuxt 会先执行中间件逻辑,再决定是否进入目标页面。总的来说,Nuxt 文件路由机制使路由配置直观明了,大大减少了手工配置出错的可能,并提供了丰富的语法支持动态、可选、嵌套等各种场景。

问题3:Nuxt 3 提供了哪些生命周期钩子?它们如何分类运作?

参考答案:
Nuxt 3 引入了一套**生命周期钩子 (Lifecycle Hooks)**系统,可在应用运行的不同阶段注入自定义逻辑。按照钩子触发阶段和作用范围,可分为三类:

  • Nuxt Hooks(构建时钩子):在 Nuxt 应用构建过程触发,主要供 模块(Module) 使用。在应用初始化和构建的关键节点(如模块注册完成、构建完成等)触发,可用于扩展构建流程。例如 modules:done 钩子会在所有模块加载完毕后触发。
  • App Hooks(应用运行时钩子):在前端应用运行过程中(包括SSR渲染期间)触发,常在 插件(Plugin) 中使用,用于页面渲染流程中的操作。比如 page:start 在开始导航到某页面时触发,可以用于加入加载指示;app:error 在应用遇到未捕获错误时触发,可用于统一错误处理。
  • Nitro Hooks(服务端运行时钩子):在服务端引擎 Nitro 运行过程中触发,常在 服务端插件 中使用,用于定制服务器端行为。例如 render:html 钩子会在服务器完成页面 HTML 渲染后、发送给客户端前触发,可用来修改 HTML(如插入额外的脚本)。

解析:
Nuxt 3 的生命周期钩子系统极大提升了框架的可扩展性。它允许开发者在 Nuxt 内部不同阶段插入逻辑:从构建、启动到渲染、关闭,每个阶段都有对应的钩子。比如 构建时钩子 常用于 Nuxt 模块开发,可以通过 nuxt.hook('xxx')nuxt.config.ts 或模块的 setup 函数里注册。在模块中调用 nuxt.hook('close', () => { ... }) 可监听 Nuxt 应用关闭事件,执行清理操作。相比之下,应用运行时钩子是在应用实例创建后可用,通过 nuxtApp.hook('event', callback) 注册。例如在插件内使用 nuxtApp.hook('page:start', () => {...}) 可以在每次页面导航开始时运行代码。这些运行时钩子可以感知前端应用的生命周期事件,如应用挂载、错误抛出、页面渲染完成等。

值得注意的是,Nuxt 3 底层使用 Hookable 库实现了钩子系统。所有钩子的注册和调用均是基于事件发布/订阅模式,不同模块和插件可以向同一钩子注册监听,从而在特定阶段协同工作。这种设计使 Nuxt 框架本身的许多行为也通过钩子暴露出来,开发者可以“拦截”或扩展框架功能。例如 pages:extend 钩子允许在 Nuxt 收集完页面路由后,自行添加或修改路由。再比如服务端 Nitro 提供 nitro:build:before 等钩子,可以在构建 Nitro 服务端包之前执行自定义逻辑。通过这些钩子,开发者可以深度定制 Nuxt 的构建和运行流程。

需要区分的是,Nuxt 提供的这些钩子不同于 Vue 组件的生命周期钩子。组件的 onMountedonUnmounted 等仍然存在,但在 SSR 环境下有特殊行为(如 onMounted 不会在服务端执行)。Nuxt Lifecycle Hooks 则作用于更高层级的 Nuxt 应用和服务端引擎生命周期。当我们开发 Nuxt 模块或插件时,善用这些钩子可以在恰当的时机注入代码,了解这三类钩子的区别并灵活运用,是掌握 Nuxt 3 原理机制的关键。

问题4:如何在 Nuxt 3 中定义和使用插件?如何控制插件的运行环境?

参考答案:
在 Nuxt 3 中,可以通过在 plugins/ 目录下新建文件来创建插件。每个插件通常导出一个 defineNuxtPlugin 函数,用于在应用初始化时注入自定义功能。定义插件的基本步骤和要点如下:

  • 创建插件文件:plugins/ 目录放置 .ts.js 文件(顶层文件会被 Nuxt 自动加载)。文件名可决定其加载顺序和环境。若只希望在客户端运行,可命名为 xxx.client.ts,仅服务端运行则命名为 xxx.server.ts。未加后缀的插件会在客户端和服务端两端执行。

  • 编写插件内容: 使用 defineNuxtPlugin() 包裹插件逻辑。框架会将 nuxtApp 实例传入,可以通过它扩展应用功能。例如,注入全局方法:

    export default defineNuxtPlugin(nuxtApp => {nuxtApp.provide('hello', (name: string) => `Hello, ${name}!`)
    })
    

    这样插件会为 Nuxt 应用提供一个 $hello 方法,可通过 useNuxtApp() 在组件中获取并使用。

  • 自动注册与顺序: Nuxt 会自动注册 plugins/ 目录下的插件文件,无需在配置中手动引入。多个插件的加载顺序默认为按文件名的字母顺序。如果插件间有依赖关系,可以通过文件名排序或在插件配置中声明依赖:例如将文件命名为 01.first.ts02.second.ts 来确保 first 插件优先执行。也可以在插件对象定义中使用 enforce(pre/post)或 dependsOn 来调整执行顺序。

解析:
Nuxt 3 的插件系统让我们可以在应用创建阶段插入自定义逻辑,典型用途包括:引入第三方库(如Vue插件)并进行配置、为 nuxtApp 挂载全局函数或变量、注册全局组件或指令等。与传统 Vue 项目不同,Nuxt 插件自动加载,且可选择运行环境,这使我们能够方便地根据需求拆分插件。例如,UI 库相关插件只在浏览器执行(避免服务端渲染报错),而数据获取相关插件可以两端运行。通过文件名中的 .client / .server 后缀,Nuxt 会在构建时分别打包处理,确保插件代码只在指定环境注入。

插件内部可以通过返回一个对象的形式来简化注入。例如上面示例也可写成:

export default defineNuxtPlugin(() => {return { provide: { hello: (msg: string) => `Hello, ${msg}!` } }
})

Nuxt 接收到这个返回对象后,会自动将 hello 函数注入到应用实例,组件中访问时形式为 $hello(msg)。需要注意,如果多个插件都注入了内容,应避免命名冲突。同时,对于依赖于其它插件提供内容的情况,要确保加载顺序正确。可以利用命名排序策略(在文件名或插件元数据中指定顺序)来解决插件依赖问题。Nuxt 3 也支持将插件定义为并行加载,即不等待前一个插件执行完就开始下一个,以加快启动速度——除非插件间存在依赖关系,否则可将某些插件标记为 parallel 提高性能。

另外,插件的另一个作用是注册应用级的生命周期钩子NuxtApp 钩子。例如,我们可以在插件中调用 nuxtApp.hook('app:mounted', ...) 来监听应用挂载事件,或者直接在 defineNuxtPlugin 的对象写法中通过 hooks 字段来注册钩子。插件加载发生在页面渲染之前,因此非常适合用于设置一些全局前置逻辑。总结来说,Nuxt 3 插件机制提供了在应用启动时运行代码的入口,我们可以借此拓展Nuxt功能、集成第三方插件,并灵活控制其在服务端或客户端的执行。

问题5:Nuxt 3 的模块(Module)机制是什么?它与插件有何区别?如何开发自定义模块?

参考答案:
Nuxt 模块是一种扩展 Nuxt 功能的机制,可以看作是对框架核心的可插拔扩充。模块通常在构建阶段执行,用来注册新功能、修改配置或集成第三方库。与插件不同,模块更偏向编译时/构建时,对 Nuxt 本身的构建过程和资源进行扩展。Nuxt 3 支持本地模块外部模块

  • 本地模块: 将模块文件置于项目的 modules/ 目录下即可自动注册加载。支持两种文件模式:modules/模块名/index.ts 或直接 modules/xxx.ts。例如在 modules/ 下创建 foo/index.ts,Nuxt 启动时会执行此模块代码。多个本地模块会按字母顺序加载(可通过目录名前加数字调整顺序)。
  • 外部模块: 通过安装 NPM 包并在 nuxt.config.tsmodules 数组中引入。Nuxt 会在初始化时先加载配置里列出的模块,再加载本地模块。外部模块通常由社区提供,实现如 PWA、CSS 框架集成等功能。

编写模块通常使用 Nuxt 提供的工具库,例如 defineNuxtModule 方法。模块可以配置钩子、添加插件或中间件、注册组件等。简单示例:

// modules/example.ts
export default defineNuxtModule({setup (options, nuxt) {// 添加一个服务端API路由 /api/hellonuxt.hook('nitro:init', () => {nuxt.options.nitro.routes.push({ route: '/api/hello', handler: '~/server/api/hello.ts' })})}
})

这个模块在 Nuxt 初始化 Nitro 引擎时插入一个 API 路由(等效于在 server/api 下创建文件)。实际开发中,模块有自己的运行时目录,可通过 addPlugin 注入插件代码,或使用 addServerHandler 更方便地注册服务端处理器。

解析:
Nuxt 模块机制让我们可以在更底层、框架构建阶段对 Nuxt 进行扩展。与应用级的插件相比,模块的作用范围和能力更大——它可以改写 Nuxt 配置、注册新的构建步骤,甚至影响打包输出。例如官方的一些模块(如 @nuxtjs/tailwindcss)会在构建时注入 Webpack/Vite 插件、扩展 Vue 的加载器配置,从而实现对 Tailwind 的支持。这些都是插件无法做到的,因为插件在运行时才执行,而模块在构建时已经介入了。

模块 vs 插件区别:模块在 Nuxt 启动之前或构建过程中运行,通常不直接操作 DOM 或 Vue 实例,而是通过 hooks 和 Nuxt 内部机制实现框架层面的改造。插件则在应用运行时执行,典型用途是扩展 Vue 应用功能(如添加全局方法)。简单来说,模块更偏向后端和构建阶段,插件偏向前端和运行阶段。举个例子,若要全局引入一个第三方库并在每个页面渲染前调用,其初始化最好放在插件中;但如果要提供一组 Nuxt 可用的选项配置,或在构建时根据配置生成文件,则适合用模块实现。

开发自定义模块可以利用 Nuxt 提供的 @nuxt/kit 工具库。通过 defineNuxtModule 定义模块时,可以声明元数据(如模块名、默认配置等)并提供 setup 函数进行实际操作。在 setup 中可以使用诸如 addPlugin(), addServerHandler(), extendViteConfig() 等帮助方法,来达到增加插件、注册服务器端接口、修改构建配置等效果。例如上面的例子使用了 addServerHandler(或直接操作 nuxt.options)把自定义 API 路由挂载到 Nitro 引擎上,这样构建后在 .output 的服务器中就包含了新的 API。

模块的加载顺序也很重要:Nuxt 会先加载 nuxt.config 中声明的模块(通常是外部模块包),再加载本地 modules/ 目录下的模块。为了让某些模块先于另一些执行,我们可以在本地模块目录命名时加序号前缀(例如 1.first-module/)。模块还能互相引用依赖,一个模块可以调用 nuxt.hook('ready', ...) 等等待 Nuxt 就绪或其他模块动作完成后再执行自己的逻辑。

总之,Nuxt 模块提供了一种封装可重用功能的方式,适用于搭建 Nuxt 应用的基础设施层。例如,如果我们想把 Nuxt 接入某云服务、或封装公司内部的一套框架配置,都可以做成模块,这样不同项目之间可以方便地共享集成方案。在面试中,可以强调模块是对 Nuxt 框架本身的扩展点,而插件是对应用实例的扩展点,这一区别体现了 Nuxt 扩展体系的层次划分。

问题6:什么是服务端渲染(SSR)?Nuxt 3 默认如何实现 SSR,带来哪些好处?

参考答案:
服务端渲染 (SSR) 指在服务器端就把 Vue 组件渲染为 HTML 字符串,并将完整 HTML 直接返回给客户端浏览器,随后在浏览器端再将这些静态标记“激活 (hydrate)”为可交互的 Vue 应用。Nuxt 3 默认开启 SSR:当客户端首次请求页面时,Nuxt 的 Node.js 服务会运行 Vue 应用逻辑,生成对应页面的 HTML,然后发送给浏览器。浏览器加载到完整 HTML 后再执行客户端 JavaScript,接管页面变为 SPA。

相比纯客户端渲染 (CSR),SSR 模式有多项优点:

  • 首屏渲染更快: 服务端直接输出完整HTML,浏览器无需等待所有 JS 下载执行就能呈现页面内容,因而在慢网速或低性能设备上首次加载更迅速。用户可以更早看到页面,大幅改善首屏体验。
  • SEO 友好: 返回给搜索引擎爬虫的是渲染完成的HTML内容,爬虫能直接读取页面文本。相比CSR需要爬虫执行JS才能拿到内容,SSR 提供了更好的搜索引擎优化效果,利于页面收录和排名。
  • 更好的性能及可访问性: SSR 减少了客户端需要处理的 JS 体积和计算,提高低端设备上的性能和响应速度。同时完整HTML的输出使屏幕阅读器等辅助技术更容易读取初始内容,提高可访问性。
  • 页面可缓存: SSR 的页面在服务器生成后可以缓存起来,以后相同请求直接返回缓存HTML,降低服务器负载并进一步加速响应(Nuxt 3 提供了静态化和边缘缓存等支持)。

Nuxt 3 的 SSR 通过新的 Nitro 引擎实现,可以将 SSR 应用部署在 Node 服务、无服务器函数甚至边缘环境,保证渲染快速而灵活。

解析:
Nuxt 作为一个服务端渲染友好的框架,在内部集成了 Vue 的 SSR 能力并做了许多优化。当浏览器发起页面请求时,Nuxt 服务端会创建一个 Vue 应用实例并执行组件的 setup()asyncData() 等逻辑,将获取到的数据和组件模板一起渲染成HTML。这意味着在服务端执行时,Vue 组件只走到创建和渲染阶段,不会触发浏览器特有的生命周期(如 onMounted 在 SSR 时不会被调用,只会在客户端激活时执行)。服务端生成的 HTML 发给浏览器后,客户端的 Vue 接管页面,对比服务端输出做“水合”挂载,将事件监听等绑定上去。整个过程对用户是无感知的,但首屏已经由服务端渲染完成。

Nuxt 3 默认开启 SSR,如果需要也可以通过配置关闭(切换为纯 SPA 模式)或者使用 nuxt generate 进行静态站点生成 (SSG)。不过 SSR 带来的上述首屏性能和 SEO 优势是很多应用选择 Nuxt 的原因。特别是在需要快速内容呈现和爬虫友好的场景(例如电商首页、博客文章等),SSR 能显著提升体验和效果。

需要注意的是,SSR 也有一定的权衡:它增加了服务器渲染开销,对部署环境要求更高(需要 Node.js 运行环境,而纯静态站点不需要)。同时开发中要小心避免在代码里直接使用诸如 windowdocument 这类浏览器环境对象,因为服务端没有 DOM。这些访问应放在 onMounted 等客户端生命周期中,以防 SSR 阶段报错。Nuxt 对此也提供了环境检测工具(如 process.client / process.server 判断运行环境)来帮助开发者编写通用(isomorphic)代码

总结来说,Nuxt 3 通过 SSR 实现了更快的首屏渲染、更好的SEO和性能,同时借助其灵活的 Nitro 引擎支持多环境部署。了解 SSR 的工作原理和优劣,有助于在面试中解释为什么使用 Nuxt 这样的框架来改进应用体验。

问题7:什么是 Nuxt 3 的 Nitro 引擎?它在 SSR 中扮演什么角色,有何独特优势?

参考答案:
Nitro 引擎是 Nuxt 3 全新的服务端引擎,它负责运行 Nuxt 的服务端代码和处理 SSR 请求。Nitro 将 Nuxt 应用的服务端部分打包成一个独立可部署的产物,具有以下特点和优势:

  • 跨平台 & 多环境: Nitro 架构使得 Nuxt 应用不仅能运行于 Node.js 服务器,也能无缝部署到无服务器函数(Serverless)、Edge 边缘节点,甚至浏览器 Service Worker 环境。这是通过对应用进行适当封装和模拟,使其不依赖特定平台的 Node 核心模块来实现的。
  • 内置 Serverless 支持: 开箱即用地支持 Serverless 部署。Nuxt 3 构建时会产出一个独立的 .output 目录,其中的服务器代码已去除了对 Node.js 环境的依赖(例如不会包含庞大的 node_modules),因此这个输出非常轻量。你可以直接将 .output 部署到任意支持 JavaScript 执行的平台,如 Vercel、Netlify 的无服务器环境,或 CloudFlare Workers 等。
  • API 路由与中间件: Nitro 会自动扫描 server/apiserver/middleware 目录,把每个文件注册为 API 处理函数或中间件。开发者无需额外搭建 Express 等服务器,就能在 Nuxt 中直接写后端接口。Nitro 基于高性能的 H3 框架处理请求,并支持直接返回 JS 对象作为 JSON 响应、自动处理异步和请求上下文等,使构建 API 十分简便。
  • 更快的构建与冷启动: Nitro 使用 Rollup 对服务器代码进行打包优化,使得输出体积小、启动快。Nuxt 2 时代服务器端依赖整个 Nuxt 运行时,而 Nuxt 3 借助 Nitro 将运行时精简到了最小。例如,Nuxt 3 应用在 Node 环境下可以通过 node .output/server/index.mjs 一键启动,不再需要繁重的构建步骤,冷启动性能提升明显。
  • 混合模式与静态输出: Nitro 支持 Nuxt 应用进行预渲染按需服务端渲染相结合的混合部署。它甚至允许在 Service Worker 中运行(实验特性)。同时,Nuxt 3 利用 Nitro 实现了对静态资源缓存的统一管理,内置了 Key-Value 存储层,可配置多种后端(如内存、Redis 等)用于缓存数据,提高应用性能。

解析:
Nitro 的引入可以说是 Nuxt 3 相比 Nuxt 2 最大的架构升级之一。以前 Nuxt 2 的服务端渲染紧耦合在 Nuxt CLI,本质上是一个基于 Node.js 的服务器。而 Nuxt 3 + Nitro 将服务端逻辑抽象成独立模块:通过构建,所有的服务器代码(包括页面渲染所需的server bundle、API处理代码等)被汇总到 .output 目录,使其成为与前端分离的可部署单元。这一做法的直接好处是部署灵活性大大提高——只要能运行 JavaScript 的地方都能部署 Nuxt 3 应用。例如,在无服务器环境中,Nitro 输出可以被封装成一个 AWS Lambda 函数;在边缘环境(如 Cloudflare Workers)中,也能跑起来并发挥SSR能力。这种“编译一次,到处运行”的特性让 Nuxt 3 真正成为一个跨平台的全栈框架

Nitro 本身具备很多性能优化:在开发模式下,它采用多线程 (Node Worker) + HMR 热重载来快速响应代码修改;在生产构建中,它借助 Rollup 等工具将不需要的 Node 模块剔除,只保留必要的 polyfill,从而极大减小服务器包大小。例如,一个简单 Nuxt 3 应用构建后的 .output 目录可能只有数十MB,甚至更小,而且里面不含庞大的 node_modules。这意味着冷启动一个 Nuxt SSR 实例非常快,很适合无服务器函数对启动时间敏感的场景。同时,小体积也利于在边缘分发。可以说,Nitro 针对无服务器和边缘渲染做了专门优化,这迎合了现代部署趋势。

对于开发者来说,Nitro 的另一大意义在于统一了前后端开发体验。过去我们在 Nuxt 2 中如果要添加一个后端 API,需要额外引入服务器框架或在 serverMiddleware 中编写。而现在有了 Nitro,直接在 server/api 写一个处理函数即可自动暴露为 API 接口,返回对象会被序列化为 JSON。你甚至可以在页面组件中用 $fetch('/api/xxx') 调用它——如果在服务器端调用,Nitro 会内部短路直接执行对应函数而不发起 HTTP 请求,提高效率。这种机制让前后端融为一体:前端调用后端接口就像本地函数一样,并且类型还可以通过 Nitro 自动生成(利用 TypeScript 类型声明)得到提示。

简而言之,Nitro 引擎赋予了 Nuxt 3 更强的服务端能力和更广的部署适应性。对于SSR相关的问题,我们可以强调 Nitro 如何让 Nuxt SSR 更快(独立打包,冷启动快)、更灵活(支持多环境)、更易用(零配置 API 路由),从而体现出 Nuxt 3 在架构上的进步。

问题8:什么是 Composables?Nuxt 3 中如何使用 Composables,有何特点?

参考答案:
Composables 是指 Vue 3 组合式 API 下的可复用函数。在 Nuxt 3 中,我们可以在项目的 composables/ 目录编写这些复用逻辑函数,然后在组件中直接调用而无需显式导入(因为 Nuxt 会自动注册并导入该目录下的组合函数)。通常 Composable 函数以 use 前缀命名,例如定义一个 useAuth() 用于封装认证逻辑,或 useFetchData() 用于数据获取。这样在组件的 <script setup> 中直接调用 const user = useAuth() 即可使用其返回的状态和方法。Composables 可以返回 reactive 对象、ref、函数等,以共享封装的状态或功能。

Nuxt 提供了一些内置的 Composables(如 useStateuseFetchuseAsyncData 等),开发者也可以自由编写自己的 Composables 来封装业务逻辑。需要注意的是,Composables 本身并不会自动产生响应式效果,它们内部还是通过 Vue 的响应式 API(如 ref()reactive())来管理状态。另外,composables/ 目录下顶层的文件才会被自动扫描导入,嵌套子目录中的文件需要通过在根目录 re-export 或在配置中扩展扫描目录来使用。

解析:
Composables 是结合 Vue 3 组合式 API 和 Nuxt 自动导入机制的产物。本质上,Composable 就是一个普通的函数,利用 Vue 3 的 setup上下文,可以在其中使用组合式 API(refcomputedwatch 等)来封装一段可复用的状态逻辑。比如我们可能会封装一个 useToggle(initialValue),内部用 ref 定义布尔值和切换函数,然后返回它们供组件使用。与传统的 Mixins 不同,Composables 更加灵活,没有命名冲突的问题,且类型更明确。

Nuxt 3 通过约定让开发者在 composables/ 目录下组织这些函数,并且自动导入它们。自动导入意味着我们不需要在每个使用的地方手动 import { useXYZ } from '~/composables/xyz',Nuxt 会在构建时静态分析代码,把对应的 import 插入。这种机制提升了开发体验,同时保留了良好的类型支持和 Tree-shaking(只引入实际用到的函数)。因此使用 Composables 十分简洁,就像在组件内直接调用一个全局函数一样。

值得一提的是,Nuxt 3 扩充了 Vue 自身的 Composition API,一些 Nuxt 特有的功能也通过 Composable 提供。例如 useRoute()useRouter() 可以获取路由信息,useHead() 用于管理页面 <head> 信息,useFetch()/useAsyncData() 用于数据请求等,这些在 Nuxt 中都被自动导入。还有一个重要的 Nuxt Composable 是 useState:它类似于全局的 useRef,可以在服务端安全地创建跨组件共享的状态。通过给 useState 提供一个唯一 key,例如 const count = useState('counter', () => 0), 不同组件中使用同样的 key 会拿到同一个状态(在 SSR 时每个请求各自独立)。这提供了一种轻量级替代 Vuex 的状态管理思路。

使用 Composables 时也需注意调用场景:大部分组合式函数需要在 Vue 组件的 setup 或 Nuxt 的插件、middleware 中调用,不能在普通的 JS 模块顶层调用,否则会因为缺少上下文导致错误(例如 “Nuxt instance is unavailable”)。Nuxt 文档中特别强调了这一点,即组合式函数应当在正确的生命周期内使用。这个原则跟 Vue 3 本身一致:必须在有 Vue 应用上下文时才能使用其 API。

总的来说,Composables 让我们能够按照功能将代码模块化,充分发挥 Composition API 的威力。在面试中,可以通过举例说明如“如何封装一个 Composable 来抽离组件间公用逻辑”来展现对这种模式的理解,并强调 Nuxt 3 对 Composables 提供的自动导入和 SSR 支持(如 useState)是框架的一大提升。

问题9:Nuxt 3 中的自动导入(Auto Imports)机制是怎样的?它能自动导入哪些内容,带来哪些好处?

参考答案:
Nuxt 3 引入了强大的自动导入机制,能够自动导入组件、组合式函数(Composables)、工具函数以及 Vue 的 Composition API 等,无需手动通过 import 语句引入。具体来说:

  • 放在 components/ 目录下的 Vue 组件会被自动注册,模板中直接以其 PascalCase 名称使用即可。比如有组件文件 components/MyButton.vue,可直接在任何页面模板中写 <MyButton/> 使用。
  • 定义在 composables/ 目录下的组合式函数会自动导入到上下文。例如在代码中调用 useFoo(),Nuxt 会寻找并引入 composables/useFoo.ts 或其中导出的同名函数。开发时无需显式导入语句,IDE 也可识别类型。
  • 此外,Nuxt 将 Vue 3 提供的常用 Composition API 函数(如 refcomputedonMounted 等)和 Nuxt 自身提供的一些辅助函数(如 useRouteruseHead 等)都设为自动导入。因此在 <script setup> 中直接使用 ref()useRoute() 也是可以的,无需从 Vue 或 Nuxt 包手动导入。

自动导入由 Nuxt 的编译器在构建时静态解析,实现按需引入类型安全。这带来的好处是:开发体验优化(减少样板代码),同时保证产物中只包含实际用到的代码,不会因为自动导入而把没用的模块打包进去。

解析:
自动导入是 Nuxt 3 提升开发者体验的一个重要特性。它让我们在编写代码时可以忽略许多重复的导入声明,从而聚焦于业务逻辑。例如,在一个典型的 Vue 3 项目里,使用 ref 前需要 import { ref } from 'vue',使用某个组件前要 import 组件等等。而在 Nuxt 3 中,这些步骤都被省略了。Nuxt 在编译阶段会扫描代码,凡是检测到未定义但又能在预设目录或Vue/Nuxt API中找到对应名称的变量时,就自动替我们添加 import。这样既减少了编码量,也降低了出错的可能。

需要强调的是,Nuxt 的自动导入并非全局变量的概念。它仍然遵循模块化原理,仅对用到的符号注入 import,因此不会造成变量污染,也不会无故增加打包大小。同时它保留了类型支持——Nuxt 会在 .nuxt/imports.d.ts 中生成自动导入内容的类型声明。所以在 IDE 中使用这些自动导入的函数/组件时,仍然有完整的自动补全和类型检查体验。

默认情况下,Nuxt 自动导入 components/, composables/, utils/ 三个目录的内容,以及前述的 Vue/Nuxt内置组合API。如果我们有自定义的目录或第三方库也想开启自动导入,可以通过 nuxt.config.ts 中的 imports 选项进行配置。这使得自动导入机制非常灵活可控。例如某团队自己封装了一些工具函数放在 helpers/ 目录下,就可以配置 Nuxt 扫描这个目录实现自动导入。

自动导入最大的意义在于提升开发效率。对比以往每新增一个组合函数都要 import,一旦忘了还会报错,现在这种认知负担被减轻了。但开发者也要养成良好习惯:避免在模块的顶层直接调用自动导入的组合函数(因为那可能在不正确的上下文执行);如果遇到命名冲突(比如来自不同模块的两个同名函数),Nuxt 默认会优先导入本地的,可以通过 #imports 别名手动指定导入以解决。总体而言,自动导入让 Nuxt 用起来更“像魔法”但又不失严谨,在面试中可以将其作为 Nuxt 3 提升开发体验的卖点来说明。

问题10:什么是 Nuxt 3 的运行时配置(Runtime Config)?如何使用它?Public 和 Private 配置有何区别?

参考答案:
运行时配置(Runtime Config)是 Nuxt 3 用于管理应用运行时变量的一套机制。它允许我们将一些在运行阶段才确定的配置(特别是需要保密的token或依赖环境的变量)注入 Nuxt 应用,并在客户端和服务端代码中使用。使用方法是在 nuxt.config.ts 中定义 runtimeConfig 字段,例如:

export default defineNuxtConfig({runtimeConfig: {apiSecret: '123456',   // 私有键,只在服务端可用public: {apiBase: '/api'      // 公共键,将在客户端暴露}}
})

如上,apiSecret 未放入 public,因此仅服务端可以通过 useRuntimeConfig() 访问到它;而 public.apiBase 则会同时暴露给客户端和服务端使用。在应用代码中,可以通过组合函数 useRuntimeConfig() 获取配置对象。例如:

const config = useRuntimeConfig()
console.log(config.apiSecret)         // 仅在服务端有值,客户端为 undefined
console.log(config.public.apiBase)    // 服务端和客户端都有值 '/api'

Nuxt 3 将 public 下的配置自动注入到每个页面的 payload 中,以确保客户端也能访问。而对于私有配置,则只存在于服务器端内存中,不会暴露给浏览器。另外,Nuxt 支持使用环境变量来覆盖 runtimeConfig:只要提供形如 NUXT_PUBLIC_XXXNUXT_YYY 的环境变量,框架会在启动时将其注入对应的配置键中。

解析:
在 Nuxt 2 中我们通常用 envpublicRuntimeConfig/privateRuntimeConfig 来管理环境变量,而 Nuxt 3 统一成了 runtimeConfig,使配置来源更清晰。Public 和 Private 的区别可以总结为:

  • 放在 runtimeConfig.public 下的键会发送到客户端,因而不应包含敏感信息。这些值会在生成页面时嵌入页面 HTML 的一个 JSON payload 中,客户端通过 useRuntimeConfig().public 读取,并且这个对象在客户端是响应式、可写的(Nuxt 允许在客户端动态修改 public 配置,某些情况下可用于实时更新配置)。典型的 public 配置比如 API 基础 URL、站点名称等。
  • 定义在 runtimeConfig 顶层的键(未放入 public)就是私有配置,只在服务端可见。这些值在构建时不会暴露,Nuxt 会确保它们不被包含到浏览器端包里。因此非常适合用于存放私密的凭据,如 API Secret、数据库连接串等。在服务器端,可以通过 useRuntimeConfig() 获取完整配置对象来使用这些私密值,但在客户端访问相同键会是 undefined,从而保护安全。

Nuxt 3 在底层实现上,会将 runtimeConfig 在服务端渲染时序列化为 window.__NUXT__ payload 的一部分(对于 public 部分),这样客户端在hydrate时能够拿到相同的数据。而对于私有配置,则完全保存在 Node 进程内。值得一提的是,这些配置是在应用运行时才能确定的,可以用环境变量来灵活地注入。例如上面配置,如果部署时设置环境变量 NUXT_API_SECRET=abcdef,Nuxt 启动时会用该值覆盖 runtimeConfig.apiSecret。Public 部分同理,通过 NUXT_PUBLIC_API_BASE 这样的变量覆盖。这样我们无需把真实敏感信息写死在代码仓库中。

使用 runtimeConfig 的一个实践是结合 Nuxt 提供的组合函数。例如经常我们会写:

const config = useRuntimeConfig()
const data = await $fetch(`${config.public.apiBase}/items`)

这样就能根据不同环境(开发、生产)下的配置请求不同 URL 的接口。一旦需要修改,只要调整环境变量或配置文件即可,应用代码无需改动。

面试回答中,可以强调 Nuxt 3 runtimeConfig 提供了在编译后仍可配置应用的能力,这对于在不同环境部署同一套代码非常有用。而 public/private 分区保证了安全性:开发者不会一不小心将秘钥泄露给前端。在服务端渲染期间,Nuxt 也对 runtimeConfig 对象做了只读保护,防止意外篡改导致跨请求的状态污染。总体而言,runtimeConfig 是 Nuxt 配置体系的重要组成部分,了解其用法有助于写出更灵活安全的应用。

问题11:Nuxt 3 中如何使用 Middleware?路由中间件有哪些类型,作用是什么?它和服务端 Middleware 有何区别?

参考答案:
**Middleware(中间件)**是在页面导航过程中执行的自定义函数,主要用于在进入页面之前拦截导航、执行权限校验或重定向等操作。Nuxt 3 中路由中间件有三种定义方式:

  1. 匿名中间件(Inline Middleware): 直接在页面组件内的 <script setup> 中通过 definePageMeta 定义的函数。例如:

    definePageMeta({middleware: [(to, from) => { /* 自定义逻辑 */ }]
    })
    

    这是临时针对该页面的守卫函数。

  2. 命名中间件(Named Middleware): 在项目的 middleware/ 目录下创建对应文件。如建立 middleware/auth.ts,然后在页面的 definePageMeta 中声明 middleware: 'auth'。Nuxt 会异步加载并执行此文件导出的中间件函数。

  3. 全局中间件(Global Middleware): 也是放在 middleware/ 目录下,但文件名以 .global 结尾(如 middleware/logger.global.ts)。全局中间件自动应用于所有页面导航,无需在页面声明。多个全局中间件会按文件名字母顺序执行(可通过在文件名前加数字调整顺序)。

使用中间件时,函数签名一般为 (to, from) => { ... },可以访问目标路由和来源路由对象。不同于传统 Vue Router 的守卫,Nuxt 中间件无需调用 next() 来释放导航,而是通过返回值控制流转:返回 navigateTo('/login') 可中断当前导航并重定向到登录页;返回 abortNavigation() 则取消导航并可选抛出错误。如果返回 undefined 则表示通过,继续下一个中间件或完成导航。

需要注意的是,Nuxt 路由中间件运行在应用的 Vue 部分(即浏览器端和服务端渲染过程中的中间层逻辑),与 Nitro 的服务端 Middleware(运行于 Node 服务端的框架级中间件)是不同概念,二者互不干扰。

解析:
Nuxt 3 的路由中间件是对 Vue Router 导航守卫的一层抽象封装,目的在于提供更简洁和统一的用法。在 Nuxt 2 中,我们通过 middleware 目录和 router.middlewares 来定义类似功能,而 Nuxt 3 做了改进:支持在组件内直接定义匿名守卫,用于简单场景,同时提供全局中间件机制,方便插入如统计或布局初始化等逻辑。

中间件的执行顺序是固定的:全局中间件首先按顺序执行,然后才是页面相关的中间件。对于页面声明了多个命名/匿名中间件的情况,则按照数组顺序执行。这一流程确保我们可以在全局层面做一些前置处理(例如每次导航都记录日志),然后再处理具体页面的权限验证等。Nuxt 官方示例中,全局 auth.global 中间件可以用来拦截所有未登录用户,而页面可能还有自己的中间件处理其它逻辑。

路由中间件通过 Nuxt 提供的工具函数来控制导航:navigateTo()abortNavigation() 是封装好的辅助函数,内部实际上调用了 Vue Router 的跳转或中断逻辑。相对于直接使用 this.$router.push,这些方法更直观,也能处理服务端渲染的场景(如在 SSR 阶段返回重定向信息给客户端)。并且 Nuxt 允许在 navigateTo 时指定 HTTP 状态码,如 return navigateTo('/login', { redirectCode: 301 }) 在服务端渲染时会下发 301 跳转。这对 SEO 场景非常有帮助。

还需区分浏览器端/服务端执行:当首次加载页面时,中间件会在服务端执行(因为首屏 SSR),而后续路由切换在浏览器执行。因此编写中间件时如果有特定于浏览器的操作(如操作 window),需要判断环境或放在适当生命周期内执行,以免 SSR 阶段出错。这与一般 Nuxt 应用代码需要考虑两端一致性是一样的道理。

此外,Nuxt 中还有 Nitro 层面的服务端 Middleware,这是在 server/middleware 目录下的,是用于处理低层次 HTTP 请求的(比如自定义服务器路由、不经过Vue渲染的静态响应等)。它们在Nuxt的服务端框架中更早执行,有点类似 Express 中的中间件。这与应用路由中间件是不同层面:一个发生在Node服务器上,一个发生在Vue路由导航上。面试中若被问到,最好能指出两者的区别,以展示对Nuxt架构的深入理解。

综上,Nuxt 3 路由中间件提供了灵活的页面导航控制手段,方便实现认证重定向、权限校验、全局前置逻辑等。回答时可以结合实际场景(如“如何用中间件保护需要登录的页面”)来说明,会更具说服力。

问题12:useAsyncDatauseFetch 有何区别?在 Nuxt 3 中分别适用于哪些场景?

参考答案:
这两个都是 Nuxt 3 提供的用于数据获取的组合函数,区别在于用法和特性略有不同:

  • useFetch 用于在组件中直接请求 HTTP 数据的快捷方法。它接收一个 URL 或 fetch 参数,底层封装了 $fetch 实现网络请求。特点是使用简单、开箱即用。useFetch 在服务端渲染时会自动执行请求,将数据注入页面,客户端 hydrate 时不会重复请求(避免二次获取)。同时返回的结果具有 datapendingerror 等属性,方便模板中直接使用加载状态。但 useFetch 默认不缓存数据,每次进入页面或组件重新调用时都会发起新请求。

  • useAsyncData 用于更通用的异步数据获取。它接收一个唯一 key和一个数据获取函数。可以用来执行任意异步逻辑(不局限于 HTTP 请求),例如调用 $fetch 或访问数据库等。useAsyncData 会对相同 key 的请求结果进行缓存,在服务端渲染后会将结果缓存键值发送到客户端,之后客户端导航到相同 key 的 useAsyncData 时可直接复用,不必重复获取。这在需要在多个组件或页面共享数据时非常有用。它同样提供 datapendingerror 状态,并与 Nuxt 的 payload 机制集成,SSR 首次获取的数据也不会重复获取。相比 useFetchuseAsyncData 更灵活、集成更深,适合预取页面所需数据并利用 Nuxt 内置的缓存和状态管理机制。

解析:
简单来说,useFetch(url) 可以看作是 useAsyncData 的一个语法糖封装——相当于内部帮你做了 return useAsyncData(key, () => $fetch(url)) 的事。因此两者的核心区别不在于是否 SSR(它们在服务端都会执行,并通过 payload 传递数据避免客户端重复请求),而在于数据缓存策略和使用场景

具体区别包括:

  • 缓存与复用: useAsyncData 默认会根据提供的 key 缓存数据。比如在页面组件中调用了一次 useAsyncData('users', fetchUsers), Nuxt 会缓存结果;如果在同一个页面的另一个组件或后续导航的页面中再次调用相同 key 的 useAsyncData('users', fetchUsers),会直接使用缓存,不会重复发请求(除非手动刷新或指定不缓存)。而 useFetch 每次调用都会认为是新的请求,没有内建缓存机制。对于需要避免二次请求、提高性能的场景(例如列表数据在多个组件间共享),useAsyncData 更合适。

  • 调用方式灵活性: useFetch 参数是固定的 URL(或者可选 options);而 useAsyncData 接受一个函数,因此可以在函数里写任意复杂的异步逻辑。例如可以先读取 IndexedDB 缓存,再决定是否 $fetch 请求,或者串行调用多个接口再合并数据。这种自定义逻辑是 useFetch 简单封装所做不到的。所以如果数据获取过程较复杂,用 useAsyncData 更稳妥。

  • 语意和集成: 从命名上也能看出,useAsyncData 强调的是与 Nuxt 数据流的集成。在 Nuxt 2 中我们有 asyncData 方法用于页面预取数据,Nuxt 3 则用这个组合式 API 替代,实现与 Nuxt 的SSR流程深度集成。而 useFetch 更类似一个独立的 Hook,封装网络请求,和在组件中直接用 $fetch 相比,它确保了 SSR 时不会重复请求,以及提供了加载状态等。但严格来说,如果不需要缓存或复杂逻辑,用 useFetch 简单快捷;如果需要利用 Nuxt 的缓存、想手动控制请求过程,则用 useAsyncData

  • 返回值差异: 两者返回对象的结构略有不同的字段命名,比如 useFetch 返回 pendingFetcherrorFetch(取决于你解构时自定义的名字),而 useAsyncData 返回通常解构为 datapendingerror。这只是代码风格上的区别,实际使用中影响不大。

在应用中,一个常见模式是:页面级数据useAsyncData(因为通常页面级数据需要缓存避免每次路由都请求,比如分页列表数据),而组件局部的数据(例如根据一个按钮点击获取一次数据)可以用 useFetch 来简单处理。Nuxt 团队推荐优先使用 useFetchuseAsyncData + $fetch 来获取初始数据,以避免 hydration 时双重请求问题。其实无论用哪一个,Nuxt 都确保了 SSR 渲染时数据获取一次,客户端不重复,这点开发者可以放心。

因此,在面试回答时可以先指出两者共同点(都是 SSR 友好的数据获取方案,都返回 data/pending 等),再突出不同点(缓存机制、用法灵活性、适用场景),并根据实际开发场景给出选择建议。例如:“如果只是简单调用一个接口一次,useFetch 更方便;如果需要缓存数据或有复杂获取逻辑,用 useAsyncData 可实现性能优化和更强控制。” 这样展现出对 Nuxt 数据获取原理和实践的深刻理解。

http://www.dtcms.com/a/266864.html

相关文章:

  • 在 C++ 中,判断 `std::string` 是否为空字符串
  • 【贪心】P2660 zzc 种田
  • Rust 中的返回类型
  • 指数分布的Python计算与分析
  • 微服务架构下的抉择:Consul vs. Eureka,服务发现该如何选型?
  • 简单 Python 爬虫程序设计
  • 递推|递归|分治
  • Python 办公实战:用 python-docx 自动生成 Word 文档
  • 【ROS2 自动驾驶学习】01-工具链的安装
  • 过滤器应用
  • MySQL分布式ID冲突详解:场景、原因与解决方案
  • Hive UDF 开发实战:MD5 哈希函数实现
  • 每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
  • 只出现一次的数字2
  • 暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
  • HarmonyOS免密认证方案 助力应用登录安全升级
  • 使用 DigitalPlat 免费搭配 Cloudflare Tunnel 实现飞牛系统、服务及 SSH 内网穿透教程
  • 计算机视觉---RealSense深度相机技术
  • 【C++类和对象解密】面向对象编程的核心概念(中)
  • Android Studio-Git的使用指南
  • 金融平衡术:创新与合规的突围之路
  • Word和Excel批量转PDF新方法,操作简单
  • 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
  • RabbitMQ 高级特性之死信队列
  • VS CodeC51 单片机开发环境搭建
  • 猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
  • Web前端工程化
  • 网安系列【4】之OWASP与OWASP Top 10:Web安全入门指南
  • 一探 3D 互动展厅的神奇构造​
  • Querybook:一个开源大数据查询分析工具