通过 100 多个技巧学习 Nuxt!

实验性特性

启用 Nuxt 实验性特性以解锁新的可能性。

Nuxt 实验性特性可以在 Nuxt 配置文件中启用。

在内部,Nuxt 使用 @nuxt/schema 来定义这些实验性特性。您可以参考 API 文档源代码以获取更多信息。

请注意,这些特性是实验性的,将来可能会被删除或修改。

asyncContext

允许在 Nuxt 和 Nitro 中访问嵌套组合式的原生异步上下文。这开启了在异步组合式内部使用组合式的可能性,并减少了出现 Nuxt 实例不可用 错误的几率。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
asyncContext
: true
} })
请参阅 GitHub pull-request 上的完整说明。

asyncEntry

启用为 Vue 包生成异步入口点,从而辅助模块联邦支持。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
asyncEntry
: true
} })

externalVue

在构建时外部化 vue@vue/*vue-router

默认启用。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
externalVue
: true
} })
此特性很可能在不久的将来被移除。

treeshakeClientOnly

从服务器包中 tree shake 仅客户端组件的内容。

默认启用。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
treeshakeClientOnly
: true
} })

emitRouteChunkError

当加载 vite/webpack 代码块时发生错误时,发出 app:chunkError 钩子。默认行为是在导航到新路由时,当代码块加载失败时,执行新路由的重新加载。

如果将其设置为 'automatic-immediate',Nuxt 将立即重新加载当前路由,而不是等待导航。这对于不是由导航触发的代码块错误很有用,例如,当您的 Nuxt 应用程序未能加载 惰性组件时。这种行为的一个潜在缺点是不必要的重新加载,例如,当您的应用程序不需要导致错误的代码块时。

您可以通过将其设置为 false 来禁用自动处理,或者通过将其设置为 manual 来手动处理代码块错误。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
emitRouteChunkError
: 'automatic' // or 'automatic-immediate', 'manual' or false
} })

restoreState

允许在代码块错误或手动调用 reloadNuxtApp() 后重新加载页面时,从 sessionStorage 恢复 Nuxt 应用程序状态。

为了避免水合错误,它将仅在 Vue 应用程序挂载后应用,这意味着初始加载时可能会出现闪烁。

在启用此项之前请仔细考虑,因为它可能会导致意外行为,并考虑为 useState 提供显式键,因为自动生成的键可能在不同构建之间不匹配。
nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
restoreState
: true
} })

inlineRouteRules

使用 defineRouteRules 在页面级别定义路由规则。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
inlineRouteRules
: true
} })

将基于页面的 path 创建匹配的路由规则。

defineRouteRules 工具中阅读更多内容。
文档 > 指南 > 概念 > 渲染#混合渲染 中阅读更多内容。

renderJsonPayloads

允许渲染 JSON 有效负载,并支持复活复杂类型。

默认启用。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
renderJsonPayloads
: true
} })

noVueServer

禁用 Nitro 中的 Vue 服务器渲染器端点。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
noVueServer
: true
} })

payloadExtraction

启用提取使用 nuxt generate 生成的页面的有效负载。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
payloadExtraction
: true
} })

clientFallback

启用实验性的 <NuxtClientFallback> 组件,以便在 SSR 中发生错误时在客户端渲染内容。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
clientFallback
: true
} })

crossOriginPrefetch

启用使用推测规则 API 的跨域预取。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
crossOriginPrefetch
: true
} })
阅读更多关于 推测规则 API 的信息。

viewTransition

启用与客户端路由器集成的 View Transition API。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
viewTransition
: true
} })
阅读更多关于 View Transition API 的信息。

writeEarlyHints

启用在使用 node 服务器时写入早期提示。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
writeEarlyHints
: true
} })

componentIslands

启用实验性组件岛支持,使用 <NuxtIsland>.island.vue 文件。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
componentIslands
: true // false or 'local+remote'
} })
文档 > 指南 > 目录结构 > 组件#服务器组件 中阅读更多内容。
您可以在 GitHub 上关注服务器组件路线图。

configSchema

启用配置模式支持。

默认启用。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
configSchema
: true
} })

polyfillVueUseHead

为依赖旧 @vueuse/head API 的模块、插件或用户代码添加兼容性层。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
polyfillVueUseHead
: false
} })

respectNoSSRHeader

允许通过设置 x-nuxt-no-ssr 标头来禁用 Nuxt SSR 响应。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
respectNoSSRHeader
: false
} })

localLayerAliases

解析图层内相对于其图层源和根目录的 ~~~@@@ 别名。

默认启用。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
localLayerAliases
: true
} })

typedPages

使用 unplugin-vue-router 启用新的实验性类型化路由。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
typedPages
: true
} })

开箱即用,这将启用 navigateTo<NuxtLink>router.push() 等的类型化用法。

您甚至可以通过使用 const route = useRoute('route-name') 在页面内获取类型化的参数。

观看 Daniel Roe 讲解 Nuxt 中类型安全路由的视频。

watcher

设置一个替代的监听器,它将用作 Nuxt 的监听服务。

Nuxt 默认使用 chokidar-granular,它会忽略从监听中排除的顶层目录(如 node_modules.git)。

您可以将其设置为 parcel 以使用 @parcel/watcher,这可能会提高大型项目或 Windows 平台上的性能。

您也可以将其设置为 chokidar 以监视源目录中的所有文件。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
watcher
: 'chokidar-granular' // 'chokidar' or 'parcel' are also options
} })

sharedPrerenderData

启用此功能会自动在预渲染的页面之间共享 payload *data*。当预渲染使用 useAsyncDatauseFetch 并在不同页面中获取相同数据的站点时,这可以显著提高性能。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
sharedPrerenderData
: true
} })
观看 Alexander Lichter 关于实验性 sharedPrerenderData 设置的视频。

启用此功能时,尤其重要的是确保数据的任何唯一键始终可以解析为相同的数据。例如,如果您使用 useAsyncData 来获取与特定页面相关的数据,则应提供一个唯一匹配该数据的键。(useFetch 应该会自动为您执行此操作。)

// This would be unsafe in a dynamic page (e.g. `[slug].vue`) because the route slug makes a difference
// to the data fetched, but Nuxt can't know that because it's not reflected in the key.
const route = useRoute()
const { data } = await useAsyncData(async () => {
  return await $fetch(`/api/my-page/${route.params.slug}`)
})
// Instead, you should use a key that uniquely identifies the data fetched.
const { data } = await useAsyncData(route.params.slug, async () => {
  return await $fetch(`/api/my-page/${route.params.slug}`)
})

clientNodeCompat

借助此功能,Nuxt 将使用 unenv 自动在客户端构建中 polyfill Node.js 导入。

要使像 Buffer 这样的全局变量在浏览器中工作,您需要手动注入它们。
import { Buffer } from 'node:buffer'

globalThis.Buffer = globalThis.Buffer || Buffer

scanPageMeta

此选项允许在构建时向模块公开在 definePageMeta 中定义的一些路由元数据(特别是 aliasnamepathredirect)。

这仅适用于静态值或字符串/数组,而不是变量或条件赋值。有关更多信息和上下文,请参阅原始问题

也可以仅在 pages:extend 中注册所有路由后扫描页面元数据。然后将调用另一个钩子 pages:resolved。要启用此行为,请设置 scanPageMeta: 'after-resolve'

如果此功能在您的项目中引起问题,您可以禁用它。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
scanPageMeta
: false
} })

cookieStore

启用 CookieStore 支持以监听 cookie 更新(如果浏览器支持)并刷新 useCookie ref 值。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
cookieStore
: true
} })
阅读更多关于 CookieStore 的信息。

buildCache

基于配置和源文件的哈希值缓存 Nuxt 构建工件。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
buildCache
: true
} })

启用后,对以下文件的更改将触发完整重建:

目录结构
.nuxtrc
.npmrc
package.json
package-lock.json
yarn.lock
pnpm-lock.yaml
tsconfig.json
bun.lockb

此外,对 srcDir 内任何文件的更改都将触发 Vue 客户端/服务器包的重建。Nitro 将始终被重建(尽管正在努力允许 Nitro 公布其可缓存的工件及其哈希值)。

最多保留 10 个缓存 tarball。

extraPageMetaExtractionKeys

definePageMeta() 宏是收集关于页面的构建时元数据的有用方法。Nuxt 本身提供了一组支持的键列表,用于支持一些内部功能,例如重定向、页面别名和自定义路径。

此选项允许在使用 scanPageMeta 时传递要从页面元数据中提取的其他键。

<script lang="ts" setup>
definePageMeta({
  foo: 'bar'
})
</script>
export default defineNuxtConfig({
  experimental: {
    extraPageMetaExtractionKeys: ['foo'],
  },
  hooks: {
    'pages:resolved' (ctx) {
      // ✅ foo is available
    },
  },
})

这允许模块在构建上下文中访问页面元数据中的其他元数据。如果您在模块中使用此功能,建议您使用键增强 NuxtPage 类型

normalizeComponentNames

确保自动生成的 Vue 组件名称与您用于自动导入组件的完整组件名称相匹配。

nuxt.config.ts
export default 
defineNuxtConfig
({
experimental
: {
normalizeComponentNames
: true
} })

默认情况下,如果您没有手动设置它,Vue 将分配一个与组件文件名匹配的组件名称。

目录结构
├─ components/
├─── SomeFolder/
├───── MyComponent.vue

在这种情况下,组件名称将是 MyComponent,就 Vue 而言。如果您想将其与 <KeepAlive> 一起使用,或者在 Vue DevTools 中识别它,则需要使用此组件。

但是,为了自动导入它,您需要使用 SomeFolderMyComponent

通过设置 experimental.normalizeComponentNames,这两个值匹配,并且 Vue 将生成一个与 Nuxt 组件命名模式匹配的组件名称。

spaLoadingTemplateLocation

当渲染仅客户端页面(使用 ssr: false)时,我们可选择渲染一个加载屏幕(来自 app/spa-loading-template.html)。

它可以设置为 within,它将像这样渲染它:

<div id="__nuxt">
  <!-- spa loading template -->
</div>

或者,您可以通过将其设置为 body 来在 Nuxt 应用根目录旁边渲染模板:

<div id="__nuxt"></div>
<!-- spa loading template -->

这避免了在 hydration 仅客户端页面时出现白屏。