实验性功能
Nuxt 包含实验性功能,您可以在配置文件中启用它们。
在内部,Nuxt 使用 @nuxt/schema
来定义这些实验性功能。您可以参考 API 文档 或源代码获取更多信息。
alwaysRunFetchOnKeyChange
当键发生变化时是否运行 useFetch
,即使它设置为 immediate: false
并且尚未触发。
如果 immediate: true
或已触发,useFetch
和 useAsyncData
将始终在键更改时运行。
此标志默认禁用,但您可以启用此功能。
export default defineNuxtConfig({
experimental: {
alwaysRunFetchOnKeyChange: true,
},
})
appManifest
使用应用程序清单来在客户端遵守路由规则。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
appManifest: false,
},
})
asyncContext
在 Nuxt 和 Nitro 中启用原生异步上下文,以供嵌套的 composable 访问。这使得在异步 composable 中使用 composable 成为可能,并减少出现 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: false,
},
})
extractAsyncDataHandlers
从 useAsyncData
和 useLazyAsyncData
调用中提取处理程序函数到单独的 chunk 中,以改进代码分割和缓存效率。
export default defineNuxtConfig({
experimental: {
extractAsyncDataHandlers: true,
},
})
此功能将内联处理程序函数转换为动态导入的 chunk。
<!-- 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 chunk 时发生错误时,发出 app:chunkError
钩子。默认行为是在导航到新路由时,如果 chunk 加载失败,则执行新路由的重新加载。
默认情况下,当导航到新路由时,如果 chunk 加载失败,Nuxt 也会执行新路由的重新加载(automatic
)。
将此设置为 automatic-immediate
将导致 Nuxt 在 chunk 加载失败时立即执行当前路由的重新加载(而不是等待导航)。这对于不是由导航触发的 chunk 错误很有用,例如,当您的 Nuxt 应用程序无法加载 懒加载组件 时。这种行为的潜在缺点是意外的重新加载,例如,当您的应用程序不需要导致错误的 chunk 时。
您可以通过将其设置为 false
来禁用自动处理,或者通过将其设置为 manual
来手动处理 chunk 错误。
export default defineNuxtConfig({
experimental: {
emitRouteChunkError: 'automatic', // or 'automatic-immediate', 'manual' or false
},
})
enforceModuleCompatibility
如果 Nuxt 模块不兼容,Nuxt 是否应该抛出错误(并加载失败)。
此功能默认禁用。
export default defineNuxtConfig({
experimental: {
enforceModuleCompatibility: true,
},
})
restoreState
允许在 chunk 错误或手动调用 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: false,
},
})
noVueServer
禁用 Nitro 中的 Vue 服务器渲染器端点。
export default defineNuxtConfig({
experimental: {
noVueServer: true,
},
})
parseErrorData
渲染服务器错误页面时是否解析 error.data
。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
parseErrorData: false,
},
})
payloadExtraction
启用使用 nuxt generate
生成的页面的有效负载提取。
export default defineNuxtConfig({
experimental: {
payloadExtraction: true,
},
})
clientFallback
启用实验性的 <NuxtClientFallback>
组件,用于在 SSR 出现错误时在客户端渲染内容。
export default defineNuxtConfig({
experimental: {
clientFallback: true,
},
})
crossOriginPrefetch
使用推测规则 API 启用跨域预取。
export default defineNuxtConfig({
experimental: {
crossOriginPrefetch: true,
},
})
viewTransition
启用视图转换 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 or 'local+remote'
},
})
localLayerAliases
根据其层源和根目录解析层中 ~
、~~
、@
和 @@
别名。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
localLayerAliases: false,
},
})
typedPages
使用新的实验性类型化路由器。unplugin-vue-router
.
export default defineNuxtConfig({
experimental: {
typedPages: true,
},
})
开箱即用,这将启用 navigateTo
、<NuxtLink>
、router.push()
等的类型化使用。
您甚至可以通过使用 const route = useRoute('route-name')
在页面中获取类型化的参数。
pnpm
且未设置 shamefully-hoist=true
,您需要将 unplugin-vue-router
安装为 devDependency 才能使此功能正常工作。watcher
设置一个替代的 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
Nuxt 自动在预渲染页面之间共享有效负载 _数据_。当预渲染的站点在不同页面中使用 useAsyncData
或 useFetch
并获取相同数据时,这可以显著提高性能。
如果需要,您可以禁用此功能。
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 () => {
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 导入。unenv
.
Buffer
等全局变量工作,您需要手动注入它们。import { Buffer } from 'node:buffer'
globalThis.Buffer ||= Buffer
scanPageMeta
Nuxt 在构建时向模块公开在 definePageMeta
中定义的一些路由元数据(特别是 alias
、name
、path
、redirect
、props
和 middleware
)。
这仅适用于静态或字符串/数组,而不适用于变量或条件赋值。请参阅原始问题以获取更多信息和上下文。
默认情况下,页面元数据仅在所有路由在 pages:extend
中注册后才进行扫描。然后会调用另一个钩子 pages:resolved
。
如果此功能在您的项目中引起问题,您可以禁用它。
export default defineNuxtConfig({
experimental: {
scanPageMeta: false,
},
})
cookieStore
启用 CookieStore 支持以监听 cookie 更新(如果浏览器支持)并刷新 useCookie
引用值。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
cookieStore: false,
},
})
buildCache
根据配置和源文件的哈希值缓存 Nuxt 构建工件。
这仅适用于应用程序的 Vue/Nitro 部分中 srcDir
和 serverDir
内的源文件。
此标志默认禁用,但您可以启用它。
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 宣布其可缓存工件及其哈希值)。
checkOutdatedBuildInterval
设置检查新构建的时间间隔(毫秒)。当 experimental.appManifest
为 false
时禁用。
设置为 false
可禁用。
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
类型。
navigationRepaint
导航前等待一个动画帧,这为浏览器提供了重绘的机会,以确认用户交互。
这可以减少在预渲染路由上导航时的 INP。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
navigationRepaint: false,
},
})
normalizeComponentNames
Nuxt 更新自动生成的 Vue 组件名称,以匹配您用于自动导入组件的完整组件名称。
如果遇到问题,您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
normalizeComponentNames: false,
},
})
默认情况下,如果您没有手动设置,Vue 将分配一个与组件文件名匹配的组件名称。
├─ components/
├─── SomeFolder/
├───── MyComponent.vue
在这种情况下,就 Vue 而言,组件名称将是 MyComponent
。如果您想将其与 <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 的浏览器的性能选项卡中跟踪这些标记,这对于调试和优化性能很有用。
此功能在开发模式下默认启用。如果您需要禁用此功能,可以这样做。
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 尝试根据添加模板的模块解析模板中的导入。将其设置为 false
将禁用此行为,这在某些环境中遇到解析冲突时可能很有用。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
templateImportResolution: false,
},
})
templateRouteInjection
默认情况下,由自动导入的 useRoute()
可组合函数返回的路由对象与 <NuxtPage>
中当前显示的页面保持同步。对于 vue-router
导出的 useRoute
或 Vue 模板中可用的默认 $route
对象,情况并非如此。
通过启用此选项,将注入一个 mixin 以使 $route
模板对象与 Nuxt 管理的 useRoute()
保持同步。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
templateRouteInjection: false,
},
})
decorators
此选项允许在您的整个 Nuxt/Nitro 应用程序中启用装饰器语法,由以下组件提供支持:esbuild.
长期以来,TypeScript 通过 compilerOptions.experimentalDecorators
支持装饰器。此实现早于 TC39 标准化过程。现在,装饰器是一个第三阶段提案,并且在 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'
defaults
这允许为核心 Nuxt 组件和可组合项指定默认选项。
这些选项未来可能会移动到其他地方,例如 app.config
或 app/
目录。
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
componentName: 'NuxtLink',
prefetch: true,
prefetchOn: {
visibility: true,
},
},
useAsyncData: {
deep: true,
},
},
},
})
purgeCachedData
是否在路由导航时清除 Nuxt 静态和 asyncData 缓存。
Nuxt 将自动清除 useAsyncData
和 nuxtApp.static.data
中的缓存数据。这有助于防止内存泄漏并确保在需要时加载最新数据,但可以禁用它。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
purgeCachedData: false,
},
})
granularCachedData
在刷新 useAsyncData
和 useFetch
的数据时(无论是通过 watch
、refreshNuxtData()
还是手动 refresh()
调用),是否调用并使用 getCachedData
的结果。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
granularCachedData: false,
},
})
headNext
使用头部优化
- 添加 capo.js 头部插件,以更高效的方式渲染头部中的标签。
- 使用哈希水合插件减少初始水合。
此标志默认启用,但您可以禁用此功能。
export default defineNuxtConfig({
experimental: {
headNext: false,
},
})
pendingWhenIdle
对于 useAsyncData
和 useFetch
,当数据尚未开始获取时,pending
是否应为 true
。
此标志默认禁用,但您可以启用此功能。
export default defineNuxtConfig({
experimental: {
pendingWhenIdle: true,
},
})
entryImportMap
默认情况下,Nuxt 通过使用导入映射来解析包的入口 chunk,从而提高 chunk 稳定性。
这将在您的 <head>
标签顶部注入一个导入映射。
<script type="importmap">{"imports":{"#entry":"/_nuxt/DC5HVSK5.js"}}</script>
在 Vite 发出的脚本块中,导入将来自 #entry
。这意味着对入口的更改不会使其他未更改的块失效。
vite.build.target
配置包含不支持导入映射的浏览器,或者您的 vite.build.rollupOptions.output.entryFileNames
配置值不包含 [hash]
,Nuxt 将智能地禁用此功能。如果您需要禁用此功能,可以这样做。
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 时提供更好的开发体验。
此标志默认禁用,但您可以启用此功能。
export default defineNuxtConfig({
experimental: {
typescriptPlugin: true,
},
})
- 已将
typescript
安装为依赖项。 - 将 VS Code 配置为使用您的工作区 TypeScript 版本(请参阅VS Code 文档)