Experimental Features
可以在 Nuxt 配置文件中启用 Nuxt 的实验性功能。
在内部,Nuxt 使用 @nuxt/schema 来定义这些实验性功能。你可以参考 API 文档 或 源代码 以获取更多信息。
asyncContext
启用本机异步上下文,以便在 Nuxt 和 Nitro 中访问嵌套的 composable。这为在异步 composable 内部使用 composable 打开了可能性,并减少了出现 Nuxt instance is unavailable 错误的机会。
export default defineNuxtConfig({
experimental: {
asyncContext: true
}
})
asyncEntry
启用 Vue 包的异步入口点生成,有助于模块联邦支持。
export default defineNuxtConfig({
experimental: {
asyncEntry: true
}
})
externalVue
构建时将 vue、@vue/* 和 vue-router 外部化。
默认启用。
export default defineNuxtConfig({
experimental: {
externalVue: true
}
})
treeshakeClientOnly
从服务器包中剔除仅客户端组件的内容。
默认启用。
export default defineNuxtConfig({
experimental: {
treeshakeClientOnly: true
}
})
emitRouteChunkError
当加载 vite/webpack chunk 时发生错误时,发出 app:chunkError 钩子。默认行为是在导航到新路由时,如果 chunk 加载失败,则重新加载新路由。
如果将其设置为 'automatic-immediate',Nuxt 将立即重新加载当前路由,而不是等待导航。这对于并非由导航触发的 chunk 错误很有用,例如,当你的 Nuxt 应用程序无法加载 延迟加载组件 时。此行为的一个潜在缺点是不希望的重新加载,例如,当你的应用程序不需要导致错误的 chunk 时。
你可以通过将其设置为 false 来禁用自动处理,或者通过将其设置为 manual 来手动处理 chunk 错误。
export default defineNuxtConfig({
experimental: {
emitRouteChunkError: 'automatic' // or 'automatic-immediate', 'manual' or false
}
})
restoreState
允许在 chunk 错误或手动调用 reloadNuxtApp() 后重新加载页面时,从 sessionStorage 恢复 Nuxt 应用程序状态。
为避免水合错误,它仅在 Vue 应用程序挂载后应用,这意味着在初始加载时可能会出现闪烁。
在启用此功能之前请仔细考虑,因为它可能导致意外行为,
并考虑为 useState 提供显式键,因为自动生成的键可能在不同构建之间不匹配。
export default defineNuxtConfig({
experimental: {
restoreState: true
}
})
inlineRouteRules
使用 defineRouteRules 在页面级别定义路由规则。
export default defineNuxtConfig({
experimental: {
inlineRouteRules: true
}
})
将基于页面的 path 创建匹配的路由规则。
renderJsonPayloads
允许渲染 JSON payload,并支持复活复杂类型。
默认启用。
export default defineNuxtConfig({
experimental: {
renderJsonPayloads: true
}
})
noVueServer
禁用 Nitro 中的 Vue 服务器渲染器端点。
export default defineNuxtConfig({
experimental: {
noVueServer: true
}
})
payloadExtraction
启用提取使用 nuxt generate 生成的页面的 payload。
export default defineNuxtConfig({
experimental: {
payloadExtraction: true
}
})
clientFallback
如果 SSR 中发生错误,启用实验性的 <NuxtClientFallback> 组件以在客户端渲染内容。
export default defineNuxtConfig({
experimental: {
clientFallback: true
}
})
crossOriginPrefetch
启用使用 Speculation Rules API 的跨域预取。
export default defineNuxtConfig({
experimental: {
crossOriginPrefetch: true
}
})
viewTransition
启用 View Transition API 与客户端路由器的集成。
export default defineNuxtConfig({
experimental: {
viewTransition: true
}
})
writeEarlyHints
启用在使用 node 服务器时写入 early hints。
export default defineNuxtConfig({
experimental: {
writeEarlyHints: true
}
})
componentIslands
启用实验性的组件岛屿支持,使用 <NuxtIsland> 和 .island.vue 文件。
export default defineNuxtConfig({
experimental: {
componentIslands: true // false or 'local+remote'
}
})
configSchema
启用配置模式支持。
默认启用。
export default defineNuxtConfig({
experimental: {
configSchema: true
}
})
polyfillVueUseHead
为依赖旧 @vueuse/head API 的模块、插件或用户代码添加兼容层。
export default defineNuxtConfig({
experimental: {
polyfillVueUseHead: false
}
})
respectNoSSRHeader
允许通过设置 x-nuxt-no-ssr 标头禁用 Nuxt SSR 响应。
export default defineNuxtConfig({
experimental: {
respectNoSSRHeader: false
}
})
localLayerAliases
解析位于层内的 ~、~~、@ 和 @@ 别名,使其分别对应于其层源和根目录。
默认启用。
export default defineNuxtConfig({
experimental: {
localLayerAliases: true
}
})
typedPages
使用 unplugin-vue-router 启用新的实验性类型化路由。
export default defineNuxtConfig({
experimental: {
typedPages: true
}
})
开箱即用,这将启用 navigateTo、<NuxtLink>、router.push() 等的类型化用法。
你甚至可以通过使用 const route = useRoute('route-name') 在页面中获取类型化的参数。
如果你在没有 shamefully-hoist=true 的情况下使用 pnpm,你需要安装 unplugin-vue-router 作为开发依赖项,此功能才能工作。
watcher
设置将用作 Nuxt 监视服务的替代监视器。
Nuxt 默认使用 chokidar-granular,它会忽略从监视中排除的顶级目录(如 node_modules 和 .git)。
你可以将其设置为 parcel 以使用 @parcel/watcher,这可能会提高大型项目或 Windows 平台上的性能。
你也可以将其设置为 chokidar 以监视源代码目录中的所有文件。
export default defineNuxtConfig({
experimental: {
watcher: 'chokidar-granular' // 'chokidar' or 'parcel' are also options
}
})
sharedPrerenderData
启用此功能会自动在预渲染的页面之间共享 payload 数据。当预渲染使用 useAsyncData 或 useFetch 并在不同页面获取相同数据的站点时,这可以显著提高性能。
export default defineNuxtConfig({
experimental: {
sharedPrerenderData: true
}
})
启用此功能时,尤其重要的是确保数据的任何唯一键始终可以解析为相同的数据。例如,如果你使用 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 在客户端构建中自动填充 Node.js 导入。
Buffer 等全局变量正常工作,你需要手动注入它们。import { Buffer } from 'node:buffer'
globalThis.Buffer = globalThis.Buffer || Buffer
scanPageMeta
此选项允许在构建时将 definePageMeta 中定义的一些路由元数据暴露给模块(特别是 alias、name、path、redirect、props 和 middleware)。
这仅适用于静态或字符串/数组,而不适用于变量或条件赋值。有关更多信息和上下文,请参阅 原始 issue。
也可以在所有路由都在 pages:extend 中注册后才扫描页面元数据。然后将调用另一个钩子 pages:resolved。要启用此行为,请设置 scanPageMeta: 'after-resolve'。
如果此功能在你的项目中导致问题,你可以禁用它。
export default defineNuxtConfig({
experimental: {
scanPageMeta: false
}
})
cookieStore
启用 CookieStore 支持以监听 cookie 更新(如果浏览器支持)并刷新 useCookie ref 值。
export default defineNuxtConfig({
experimental: {
cookieStore: true
}
})
buildCache
基于配置和源文件的哈希值缓存 Nuxt 构建工件。
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 公布其可缓存的工件及其哈希值)。
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 组件名称与你用于自动导入组件的完整组件名称匹配。
export default defineNuxtConfig({
experimental: {
normalizeComponentNames: true
}
})
默认情况下,如果你没有手动设置,Vue 将分配一个与组件文件名匹配的组件名称。
├─ components/
├─── SomeFolder/
├───── MyComponent.vue
在这种情况下,就 Vue 而言,组件名称将是 MyComponent。如果你想对其使用 <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 -->
这避免了水合仅客户端页面时的白屏闪烁。
browserDevtoolsTiming
在浏览器开发者工具中启用 Nuxt hooks 的性能标记。这会添加你可以在基于 Chromium 的浏览器的 Performance 选项卡中跟踪的性能标记,这对于调试和优化性能非常有用。
默认情况下,这在开发模式下启用。如果你需要禁用此功能,可以这样做:
export default defineNuxtConfig({
experimental: {
browserDevtoolsTiming: false
}
})
debugModuleMutation
记录模块上下文中对 nuxt.options 的更改,有助于调试模块在 Nuxt 初始化阶段所做的配置更改。
默认情况下,当启用 debug 模式时,此功能启用。如果你需要禁用此功能,可以这样做:
要显式启用它:
export default defineNuxtConfig({
experimental: {
debugModuleMutation: true
}
})
lazyHydration
这为 <Lazy> 组件启用水合策略,通过延迟组件的水合直到需要时才进行,从而提高性能。
延迟水合默认启用,但你可以禁用此功能:
export default defineNuxtConfig({
experimental: {
lazyHydration: false
}
})
templateImportResolution
控制 Nuxt 模板中导入的解析方式。默认情况下,Nuxt 尝试相对于添加它们的模块解析模板中的导入。
默认情况下启用此功能,因此如果你在某些环境中遇到解析冲突,可以禁用此行为:
export default defineNuxtConfig({
experimental: {
templateImportResolution: false
}
})
decorators
此选项支持在整个 Nuxt/Nitro 应用程序中启用装饰器语法,由 esbuild 提供支持。
长期以来,TypeScript 通过 compilerOptions.experimentalDecorators 支持装饰器。此实现早于 TC39 标准化过程。现在,装饰器是一个 Stage 3 Proposal,并在 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 实现。
用法
export default defineNuxtConfig({
experimental: {
decorators: true,
},
})
function something (_method: () => unknown) {
return () => 'decorated'
}
class SomeClass {
@something
public someMethod () {
return 'initial'
}
}
const value = new SomeClass().someMethod()
// this will return 'decorated'
purgeCachedData
Nuxt 将自动清除来自 useAsyncData 和 nuxtApp.static.data 的缓存数据。这有助于防止内存泄漏,并确保在需要时加载新数据,但可以禁用它:
export default defineNuxtConfig({
experimental: {
purgeCachedData: false
}
})
granularCachedData
是否在刷新 useAsyncData 和 useFetch 的数据时(无论是通过 watch、refreshNuxtData() 还是手动 refresh() 调用)调用并使用 getCachedData 的结果。
export default defineNuxtConfig({
experimental: {
granularCachedData: true
}
})
pendingWhenIdle
如果设置为 false,则从 useAsyncData、useFetch、useLazyAsyncData 和 useLazyFetch 返回的 pending 对象将是一个计算属性,只有当 status 也处于 pending 状态时才为 true。
这意味着当传递 immediate: false 时,pending 将在第一次请求发出之前为 false。
export default defineNuxtConfig({
experimental: {
pendingWhenIdle: false
}
})