实验性功能

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

Nuxt 包含实验性功能,您可以在配置文件中启用这些功能。

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

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

alwaysRunFetchOnKeyChange

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

如果 immediate: true 或者已经触发,useFetchuseAsyncData 将始终在键更改时运行。

此标志默认禁用,但您可以启用此功能

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

appManifest

使用应用程序清单在客户端遵守路由规则。

此标志默认启用,但您可以禁用此功能

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

asyncContext

在 Nuxt 和 Nitro 中为嵌套的可组合项启用原生异步上下文。这使得在异步可组合项中使用可组合项成为可能,并减少出现 Nuxt 实例不可用 错误的机会。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    asyncContext: true,
  },
})
查看 GitHub 拉取请求中的完整解释。

asyncEntry

启用 Vue 包的异步入口点生成,有助于模块联邦支持。

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

externalVue

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

此标志默认启用,但您可以禁用此功能

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

extractAsyncDataHandlers

useAsyncDatauseLazyAsyncData 调用中提取处理函数到单独的块中,以改进代码拆分和缓存效率。

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

此功能将内联处理函数转换为动态导入的块

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

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

此功能仅推荐用于带有有效载荷提取的 静态构建,以及数据无需在运行时重新获取的情况。

emitRouteChunkError

当加载 vite/webpack 块时出现错误时,发出 app:chunkError 钩子。默认行为是在导航到新路由时,如果块加载失败,则重新加载新路由。

默认情况下,当导航到新路由时,如果块加载失败,Nuxt 也会执行新路由的重新加载 (automatic)。

将此设置为 automatic-immediate 将导致 Nuxt 在块加载失败时立即执行当前路由的重新加载(而不是等待导航)。这对于不是由导航触发的块错误很有用,例如,当您的 Nuxt 应用程序无法加载 懒加载组件 时。这种行为的一个潜在缺点是意外的重新加载,例如,当您的应用程序不需要导致错误的块时。

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

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

enforceModuleCompatibility

如果 Nuxt 模块不兼容,Nuxt 是否应该抛出错误(并加载失败)。

此功能默认禁用。

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

restoreState

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

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

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

inlineRouteRules

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

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

将根据页面的 path 创建匹配的路由规则。

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

renderJsonPayloads

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

此标志默认启用,但您可以禁用此功能

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

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

启用通过 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'
  },
})
阅读更多:文档 > 4 X > 指南 > 目录结构 > 应用程序 > 组件#服务器组件
您可以在 GitHub 上关注服务器组件路线图。

localLayerAliases

解析位于层内的 ~~~@@@ 别名,并考虑其层源和根目录。

此标志默认启用,但您可以禁用此功能

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

typedPages

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

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

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

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

如果您使用 pnpm 而不带 shamefully-hoist=true,您需要将 unplugin-vue-router 安装为开发依赖项,此功能才能正常工作。

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

Nuxt 会自动在预渲染页面之间共享有效负载 数据。这可以在预渲染使用 useAsyncDatauseFetch 并在不同页面中获取相同数据的站点时显著提高性能。

如果需要,您可以禁用此功能。

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

启用此功能时,特别重要的是要确保数据的任何唯一键始终解析为相同的数据。例如,如果您使用 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 (_nuxtApp, { signal }) => {
  return await $fetch(`/api/my-page/${route.params.slug}`, { signal })
})
// Instead, you should use a key that uniquely identifies the data fetched.
const { data } = await useAsyncData(route.params.slug, async (_nuxtApp, { signal }) => {
  return await $fetch(`/api/my-page/${route.params.slug}`, { signal })
})

clientNodeCompat

通过此功能,Nuxt 将使用unenv.

在客户端构建中自动填充 Node.js 导入。为了使像 Buffer 这样的全局变量在浏览器中工作,您需要手动注入它们。
import { Buffer } from 'node:buffer'

globalThis.Buffer ||= Buffer

scanPageMeta

Nuxt 在构建时将 definePageMeta 中定义的一些路由元数据暴露给模块(特别是 aliasnamepathredirectpropsmiddleware)。

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

默认情况下,页面元数据仅在所有路由在 pages:extend 中注册后才扫描。然后将调用另一个钩子 pages:resolved

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

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

cookieStore

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

此标志默认启用,但您可以禁用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    cookieStore: false,
  },
})
阅读更多关于 CookieStore

buildCache

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

这仅适用于您的应用程序的 Vue/Nitro 部分中 srcDirserverDir 内的源文件。

此标志默认禁用,但您可以启用它

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

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

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

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

最多保留 10 个缓存 tar 包。

checkOutdatedBuildInterval

设置检查新构建的时间间隔(以毫秒为单位)。当 experimental.appManifestfalse 时禁用。

设置为 false 以禁用。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    checkOutdatedBuildInterval: 3600000, // 1 hour, or false to disable
  },
})

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 类型

在导航前等待单个动画帧,这使得浏览器有机会重绘,确认用户交互。

在预渲染路由上导航时,它可以减少 INP。

此标志默认启用,但您可以禁用此功能

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

normalizeComponentNames

Nuxt 更新自动生成的 Vue 组件名称,以匹配您将用于自动导入组件的完整组件名称。

如果您遇到问题,可以禁用此功能。

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

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

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

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

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

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

spaLoadingTemplateLocation

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

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

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

或者,您可以通过将其设置为 body,将模板与 Nuxt 应用程序根目录一起渲染

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

这可以避免在水合仅客户端页面时出现白屏闪烁。

browserDevtoolsTiming

在浏览器开发工具中启用 Nuxt 钩子的性能标记。这会添加性能标记,您可以在基于 Chromium 的浏览器的“性能”选项卡中跟踪这些标记,这对于调试和优化性能很有用。

这在开发模式下默认启用。如果您需要禁用此功能,可以这样做

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    browserDevtoolsTiming: false,
  },
})
请参阅 PR #29922 获取实现细节。
了解更多关于 Chrome DevTools 性能 API。

debugModuleMutation

记录模块上下文中 nuxt.options 的突变,有助于调试 Nuxt 初始化阶段模块所做的配置更改。

debug 模式启用时,此功能默认启用。如果您需要禁用此功能,可以这样做

要明确启用它

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    debugModuleMutation: true,
  },
})
请参阅 PR #30555 获取实现细节。

lazyHydration

这为 <Lazy> 组件启用水合策略,通过延迟组件的水合直到需要时再进行,从而提高性能。

懒水合默认启用,但您可以禁用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    lazyHydration: false,
  },
})
阅读更多关于懒水合。

templateImportResolution

禁用将导入解析到 Nuxt 模板中,使其不从添加模板的模块路径解析。

默认情况下,Nuxt 尝试根据添加模板的模块解析模板中的导入。将其设置为 false 将禁用此行为,如果您在某些环境中遇到解析冲突,这可能很有用。

此标志默认启用,但您可以禁用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    templateImportResolution: false,
  },
})
请参阅 PR #31175 获取实现细节。

templateRouteInjection

默认情况下,由自动导入的 useRoute() 可组合项返回的路由对象与 <NuxtPage> 中当前显示的页面保持同步。对于 vue-router 导出的 useRoute 或 Vue 模板中可用的默认 $route 对象则不然。

通过启用此选项,将注入一个混合以使 $route 模板对象与 Nuxt 管理的 useRoute() 保持同步。

此标志默认启用,但您可以禁用此功能

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

decorators

此选项通过esbuild.

在您的整个 Nuxt/Nitro 应用程序中启用装饰器语法。长期以来,TypeScript 通过 compilerOptions.experimentalDecorators 支持装饰器。此实现早于 TC39 标准化过程。现在,装饰器是一个Stage 3 提案,并在 TS 5.0+ 中无需特殊配置即可支持(请参阅https://github.com/microsoft/TypeScript/pull/52582等等https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/#decorators).

启用 experimental.decorators 启用对 TC39 提案的支持,而 不是 TypeScript 之前的 compilerOptions.experimentalDecorators 实现。

请注意,在最终进入 JS 标准之前,可能会有更改。

使用

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    decorators: true,
  },
})
app/app.vue
function something (_method: () => unknown) {
  return () => 'decorated'
}

class SomeClass {
  @something
  public someMethod () {
    return 'initial'
  }
}

const value = new SomeClass().someMethod()
// this will return 'decorated'

defaults

这允许为核心 Nuxt 组件和可组合项指定默认选项。

这些选项将来可能会移动到其他地方,例如 app.configapp/ 目录中。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    defaults: {
      nuxtLink: {
        componentName: 'NuxtLink',
        prefetch: true,
        prefetchOn: {
          visibility: true,
        },
      },
      useAsyncData: {
        deep: true,
      },
    },
  },
})

purgeCachedData

是否在路由导航时清除 Nuxt 静态和 asyncData 缓存。

Nuxt 将自动清除 useAsyncDatanuxtApp.static.data 中的缓存数据。这有助于防止内存泄漏并确保在需要时加载最新数据,但可以禁用它。

此标志默认启用,但您可以禁用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    purgeCachedData: false,
  },
})
请参阅 PR #31379 获取实现细节。

granularCachedData

在刷新 useAsyncDatauseFetch 的数据时(无论是通过 watchrefreshNuxtData(),还是手动调用 refresh()),是否调用并使用 getCachedData 的结果。

此标志默认启用,但您可以禁用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    granularCachedData: false,
  },
})
请参阅 PR #31373 获取实现细节。

headNext

使用头部优化

  • 添加 capo.js 头部插件,以更高效的方式渲染头部标签。
  • 使用哈希水合插件以减少初始水合

此标志默认启用,但您可以禁用此功能

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

pendingWhenIdle

对于 useAsyncDatauseFetch,当数据尚未开始获取时,pending 是否应为 true

此标志默认禁用,但您可以启用此功能

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

entryImportMap

默认情况下,Nuxt 通过使用导入映射来解析捆绑包的入口块,从而提高块的稳定性。

这会在您的 <head> 标签顶部注入一个导入映射

<script type="importmap">{"imports":{"#entry":"/_nuxt/DC5HVSK5.js"}}</script>

在 Vite 发出的脚本块中,导入将来自 #entry。这意味着入口的更改不会使未更改的块失效。

如果您的 vite.build.target 配置包含不支持导入映射的浏览器,或者您的 vite.build.rollupOptions.output.entryFileNames 配置值不包含 [hash],Nuxt 会智能地禁用此功能。

如果您需要禁用此功能,可以这样做

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    entryImportMap: false,
  },
  // or, better, simply tell vite your desired target
  // which nuxt will respect
  vite: {
    build: {
      target: 'safari13',
    },
  },
})

typescriptPlugin

使用 @dxup/nuxt 模块启用增强的 TypeScript 开发体验。

这个实验性插件提供了改进的 TypeScript 集成和开发工具,以便在使用 Nuxt 应用程序中的 TypeScript 时获得更好的开发体验。

此标志默认禁用,但您可以启用此功能

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    typescriptPlugin: true,
  },
})
要使用此功能,您需要
  • 已安装 typescript 作为依赖项
  • 配置 VS Code 使用您的工作区 TypeScript 版本(请参阅VS Code 文档)
了解更多关于 @dxup/nuxt

viteEnvironmentApi

启用 Vite 6 新的环境 API以改进构建配置和插件架构。

当您将 future.compatibilityVersion 设置为 5 时,此功能默认启用。您也可以明确启用它进行测试

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

Vite 环境 API 在开发和生产构建之间提供了更好的一致性,更细粒度地控制特定于环境的配置,并提高了性能。

启用此功能会更改 Vite 插件的注册和配置方式。有关更新插件的详细信息,请参阅 Vite 环境 API 迁移指南
了解更多关于 Vite 的环境 API。