跳到主要内容

实验性特性

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

Nuxt 包含可在配置文件中启用的实验性特性。

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

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

alwaysRunFetchOnKeyChange

是否在 key 改变时运行 useFetch,即使它被设置为 immediate: false 且尚未被触发。

如果 immediate: true 或它已经被触发过,useFetchuseAsyncData 在 key 改变时总是会运行。

这个标志默认是禁用的,但你可以启用此特性:

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

appManifest

使用应用 manifest 以在客户端遵循路由规则。

这个标志默认是启用的,但你可以禁用此特性:

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

asyncContext

启用原生 async 上下文,使其在 Nuxt 和 Nitro 中的嵌套组合式函数中可访问。这为在 async 组合式函数内部使用组合式函数打开了可能性,并减少了遇到 Nuxt instance is unavailable(Nuxt 实例不可用)错误的机会。

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

在 GitHub pull request 中查看完整解释。 :::

asyncEntry

为 Vue bundle 生成异步入口点,辅助模块联邦支持。

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

extractAsyncDataHandlers

useAsyncDatauseLazyAsyncData 调用中提取处理函数到独立的 chunk 中,以改善代码分割和缓存效率。

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

此特性将内联的处理函数转换为动态导入的 chunk:

<!-- 转换前 -->
<script setup>
const { data } = await useAsyncData('user', async () => {
  return await $fetch('/api/user')
})
</script>
<!-- 转换后 -->
<script setup>
const { data } = await useAsyncData('user', () =>
  import('/generated-chunk.js').then(r => r.default()),
)
</script>

这种转换的好处是,我们可以拆分出数据获取逻辑——同时仍然允许在需要时加载这些代码。

此特性仅推荐用于带有 payload 提取的静态构建,且数据不需要在运行时重新获取的情况。

emitRouteChunkError

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

默认情况下,当导航到新路由时某个 chunk 加载失败,Nuxt 也会执行新路由的重新加载(automatic 自动)。

设置为 automatic-immediate 会让 Nuxt 在 chunk 加载失败时立即执行当前路由的重新加载(而不是等待导航)。这对于非由导航触发的 chunk 错误很有用,例如当你的 Nuxt 应用未能加载某个懒加载组件 时。这种行为的一个潜在缺点是产生不期望的重新加载,例如当你的应用并不需要导致错误的那个 chunk 时。

你可以将此设为 false 来禁用自动处理,或设为 manual 来手动处理 chunk 错误。

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

enforceModuleCompatibility

当某个 Nuxt 模块不兼容时,Nuxt 是否应抛出错误(并加载失败)。

此特性默认是禁用的。

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

restoreState

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

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

在启用此特性前请仔细考虑,因为它可能导致意外行为,并考虑为 useState 提供显式 key,因为自动生成的 key 可能在构建之间不匹配。

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

inlineRouteRules

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

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

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

defineRouteRules 工具函数中阅读更多内容。 :::

noVueServer

在 Nitro 内禁用 Vue 服务端渲染端点。

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

parseErrorData

是否在渲染服务端错误页面时解析 error.data

这个标志默认是启用的,但你可以禁用此特性:

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

payloadExtraction

控制预渲染和缓存(ISR/SWR)页面的 payload 数据如何传递。

  • 'client' - payload 在初始服务端渲染时内联在 HTML 中,并为客户端导航提取到 _payload.json 文件。
  • true - payload 提取为单独的 _payload.json 文件,用于初始服务端渲染和客户端导航。
  • false - 完全禁用 payload 提取。payload 始终内联在 HTML 中,不会生成任何 _payload.json 文件。

默认值为 true,或者在设置了 compatibilityVersion: 5 时为 'client'。当设置了 ssr: false 时,它会被强制设为 false

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    payloadExtraction: 'client',
  },
})

阅读更多关于 payload 提取以及每种模式的后果。 :::

clientNodePlaceholder

在服务端渲染期间,使用注释节点(<!--placeholder-->)代替 <div> 元素作为仅客户端组件的占位符。

启用后,.client.vue 组件和 createClientOnly() 包装器会在服务端渲染一个 HTML 注释,而不是一个空的 <div>。这修复了一个 Vue 水合问题:当占位 <div> 与实际组件的根元素共享相同的标签名时,作用域样式可能不会被应用。

启用这意味着传递给 .client.vue 组件的属性(classstyle 等)不会出现在 SSR 的 HTML 中。如果你需要带样式的占位符以防止布局偏移,请改用带 #fallback 插槽的 <ClientOnly>

future.compatibilityVersion 设置为 5 或更高时,此标志默认启用,但你也可以显式启用它:

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

clientFallback

启用实验性的 <NuxtClientFallback> 组件,用于在 SSR 出错时在客户端渲染内容。

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

crossOriginPrefetch

使用 Speculation Rules API 启用跨域预取。

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

阅读更多关于 Speculation Rules API。 :::

viewTransition

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

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

你也可以传入一个对象来配置视图过渡类型,它允许基于导航类型使用不同的 CSS 动画:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    viewTransition: {
      enabled: true,
      types: ['slide'],
    },
  },
})

阅读更多关于 View Transition API。 :::

阅读更多关于 View Transition API。 :::

writeEarlyHints

使用 node server 时启用 early hints 的写入。

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

componentIslands

启用实验性的组件 islands 支持,配合 <NuxtIsland>.island.vue 文件。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    componentIslands: true, // false 或 'local+remote'
  },
})

你可以在 GitHub 上关注服务端组件的路线图。 :::

localLayerAliases

解析位于 layers 内部的 ~~~@@@ 别名,参照它们的 layer 源目录和根目录。

这个标志默认是启用的,但你可以禁用此特性:

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

typedPages

启用新的实验性类型化路由。

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

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

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