实验性功能
Nuxt 的实验性功能可以在 Nuxt 配置文件中启用。
在内部,Nuxt 使用 @nuxt/schema
来定义这些实验性功能。你可以参考 API 文档 或 源代码 获取更多信息。
asyncContext
启用原生异步上下文,使其在 Nuxt 和 Nitro 的嵌套组合式函数中可用。这为在异步组合式函数中使用组合式函数提供了可能性,并减少出现“Nuxt 实例不可用”错误的机会。
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
}
})
emitRouteChunkError
当 Vite/Webpack 块加载出错时,触发 app:chunkError
钩子。默认行为是当块加载失败时,在导航到新路由时重新加载新路由。
如果设置为 'automatic-immediate'
,Nuxt 将立即重新加载当前路由,而不是等待导航。这对于非导航触发的块错误(例如 Nuxt 应用无法加载延迟组件)非常有用。此行为的潜在缺点是可能导致不必要的重新加载,例如当应用不需要导致错误的块时。
你可以通过设置为 false
禁用自动处理,或通过设置为 manual
手动处理块错误。
export default defineNuxtConfig({
experimental: {
emitRouteChunkError: 'automatic' // 或 'automatic-immediate'、'manual' 或 false
}
})
restoreState
允许在块错误或手动调用 reloadNuxtApp()
后重新加载页面时,从 sessionStorage
恢复 Nuxt 应用状态。
为避免水合错误,仅在 Vue 应用挂载后应用,这意味着初始加载可能会有闪烁。
useState
提供显式键,因为自动生成的键可能在不同构建中不匹配。export default defineNuxtConfig({
experimental: {
restoreState: true
}
})
inlineRouteRules
使用 defineRouteRules
在页面级别定义路由规则。
export default defineNuxtConfig({
experimental: {
inlineRouteRules: true
}
})
将根据页面的 path
创建匹配的路由规则。
renderJsonPayloads
允许渲染支持复杂类型复活的 JSON 有效负载。
默认启用。
export default defineNuxtConfig({
experimental: {
renderJsonPayloads: true
}
})
noVueServer
在 Nitro 中禁用 Vue 服务器渲染器端点。
export default defineNuxtConfig({
experimental: {
noVueServer: true
}
})
payloadExtraction
启用从 nuxt generate
生成的页面中提取有效负载。
export default defineNuxtConfig({
experimental: {
payloadExtraction: true
}
})
clientFallback
启用实验性的 <NuxtClientFallback>
组件,以便在 SSR 出错时在客户端渲染内容。
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 服务器时启用早期提示的写入。
export default defineNuxtConfig({
experimental: {
writeEarlyHints: true
}
})
componentIslands
启用实验性的组件岛支持,包括 <NuxtIsland>
和 .island.vue
文件。
export default defineNuxtConfig({
experimental: {
componentIslands: true // false 或 'local+remote'
}
})
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' 或 'parcel'
}
})
sharedPrerenderData
启用此功能会自动在预渲染的页面之间共享有效负载 数据。这在使用 useAsyncData
或 useFetch
且在不同页面获取相同数据时,可以显著提高预渲染站点的性能。
export default defineNuxtConfig({
experimental: {
sharedPrerenderData: true
}
})
启用此功能时,确保数据的唯一键始终解析为相同的数据非常重要。例如,如果你使用 useAsyncData
获取与特定页面相关的数据,你应提供一个唯一匹配该数据的键。(useFetch
应为你自动完成此操作。)
// 在动态页面(例如 `[slug].vue`)中这样做是不安全的,因为路由 slug 会影响获取的数据,但 Nuxt 无法知道这一点,因为键中未反映。
const route = useRoute()
const { data } = await useAsyncData(async () => {
return await $fetch(`/api/my-page/${route.params.slug}`)
})
// 相反,你应该使用唯一标识获取数据的键。
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
)。
这仅适用于静态值或字符串/数组,而不适用于变量或条件赋值。有关更多信息和背景,请参见原始问题。
也可以在所有路由注册后仅扫描页面元数据,此时将调用另一个钩子 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 可用
},
},
})
这允许模块在构建上下文中访问页面元数据的额外元数据。如果你在模块中使用此功能,建议为你的键扩展 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 加载模板 -->
</div>
或者,你可以通过设置为 body
将模板渲染在 Nuxt 应用根节点旁边:
<div id="__nuxt"></div>
<!-- spa 加载模板 -->
这可以避免在水合仅客户端页面时的白屏闪烁。
browserDevtoolsTiming
为 Nuxt 钩子启用浏览器开发者工具中的性能标记。这会在基于 Chromium 的浏览器的性能选项卡中添加可跟踪的性能标记,对于调试和优化性能非常有用。
此功能在开发模式下默认启用。如果需要禁用此功能,可以这样做:
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 提案,在 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()
// 将返回 'decorated'
purgeCachedData
Nuxt 将自动清除 useAsyncData
和 nuxtApp.static.data
中的缓存数据。这有助于防止内存泄漏并确保按需加载新鲜数据,但可以禁用它:
export default defineNuxtConfig({
experimental: {
purgeCachedData: false
}
})
granularCachedData
Whether to call and use the result from getCachedData
when refreshing data for useAsyncData
and useFetch
(whether by watch
, refreshNuxtData()
, or a manual refresh()
call.
export default defineNuxtConfig({
experimental: {
granularCachedData: true
}
})