v3.10 版本紧随 v3.9 发布,但它包含了许多新功能和修复。以下是一些亮点。
✨ 预渲染时实验性共享 asyncData
在预渲染路由时,我们可能会一遍又一遍地重新获取相同的数据。在 Nuxt 2 中,可以创建一个“payload”,它可以被获取一次,然后在每个页面中访问(当然,在 Nuxt 3 中也可以手动执行此操作 - 请参阅这篇文章)。
通过#24894,我们现在能够在预渲染网站时自动为您执行此操作。您的 useAsyncData
和 useFetch
调用将被去重并在您的网站渲染之间缓存。
export defineNuxtConfig({
experimental: {
sharedPrerenderData: true
}
})
useAsyncData
获取与特定页面相关的数据,则应提供一个唯一匹配该数据的键。(useFetch
应该自动执行此操作。)🆔 SSR 安全的易访问唯一 ID 创建
我们现在提供了一个 useId
可组合函数,用于生成 SSR 安全的唯一 ID(#23368)。这允许在您的应用程序中创建更易访问的界面。例如
<script setup>
const emailId = useId()
const passwordId = useId()
</script>
<template>
<form>
<label :for="emailId">Email</label>
<input
:id="emailId"
name="email"
type="email"
>
<label :for="passwordId">Password</label>
<input
:id="passwordId"
name="password"
type="password"
>
</form>
</template>
✍️ 扩展 app/router.options
现在模块作者可以注入他们自己的 router.options
文件(#24922)。新的 pages:routerOptions
钩子允许模块作者执行诸如添加自定义 scrollBehavior
或添加路由的运行时增强等操作。
客户端 Node.js 支持
我们现在支持(实验性地)为关键的 Node.js 内置模块提供 polyfill(#25028),就像我们在部署到非 Node 环境的服务器上通过 Nitro 执行的那样。
这意味着,在您的客户端代码中,您可以直接从 Node 内置模块导入(支持 node:
和 Node 导入)。但是,为了避免不必要地增加捆绑包大小,不会为您全局注入任何内容。您可以根据需要导入它们。
import { Buffer } from 'node:buffer'
import process from 'node:process'
或者提供您自己的 polyfill,例如,在 Nuxt 插件中。
import { Buffer } from 'node:buffer'
import process from 'node:process'
globalThis.Buffer = Buffer
globalThis.process = process
export default defineNuxtPlugin({})
这应该会让使用没有适当浏览器支持的库的用户的生活更轻松。但是,由于存在不必要地增加捆绑包大小的风险,我们强烈建议用户尽可能选择其他替代方案。
🍪 更好的 Cookie 响应性
我们现在允许您选择使用 CookieStore。如果浏览器支持存在,则将使用它而不是 BroadcastChannel 来更新 useCookie
值,以便在更新 Cookie 时以响应方式更新(#25198)。
这也与一个新的可组合函数 refreshCookie
配合使用,该函数允许手动刷新 Cookie 值,例如在执行请求后。
🏥 检测反模式
在此版本中,我们还提供了一系列功能来检测潜在的错误和性能问题。
- 如果在服务器上使用
setInterval
,我们现在将抛出错误(#25259)。 - 如果数据获取可组合函数使用不当(#25071),例如在插件或设置上下文之外,我们将在(仅在开发环境中)发出警告。
- 如果您没有使用
<NuxtPage />
但启用了vue-router
集成,我们将在(仅在开发环境中)发出警告(#25490)。(<RouterView />
不应单独使用。)
🧂 粒度视图过渡支持
现在可以使用 definePageMeta
在每个页面基础上控制视图过渡支持(#25264)。
您需要首先启用实验性视图过渡支持
export default defineNuxtConfig({
experimental: {
viewTransition: true
},
app: {
// you can disable them globally if necessary (they are enabled by default)
viewTransition: false
}
})
并且您可以逐个选择加入/退出
<script setup lang="ts">
definePageMeta({
viewTransition: false
})
</script>
最后,如果用户的浏览器匹配 prefers-reduced-motion: reduce
,Nuxt 将不会应用视图过渡(#22292)。您可以设置 viewTransition: 'always'
;然后您需要尊重用户的偏好。
🏗️ 构建时路由元数据
现在可以在构建时访问在 definePageMeta
中定义的路由元数据,允许模块和钩子修改和更改这些值(#25210)。
export default defineNuxtConfig({
experimental: {
scanPageMeta: true
}
})
请尝试一下,并告诉我们您的使用感受。我们希望在未来的版本中提高性能并默认启用此功能,以便像 @nuxtjs/i18n
等模块可以提供与在 definePageMeta
中设置的路由选项更深入的集成。
📦 捆绑器模块解析
通过#24837,我们现在选择加入 TypeScript bundler
解析,这应该更接近于我们为 Nuxt 项目中的模块解析子路径导入的实际方式。
“捆绑器”模块解析是Vue 建议的,也是Vite 建议的,但不幸的是,仍然有很多软件包在它们的 package.json
中没有正确的条目。
作为此操作的一部分,我们在整个生态系统中打开了 85 个 PR 来测试切换默认值,并识别并修复了一些问题。
如果您需要关闭此行为,您可以这样做。但是,请考虑在库或模块的存储库中提出一个问题(随时在其中标记我),以便可以在源代码中解决。
export default defineNuxtConfig({
future: {
typescriptBundlerResolution: false
}
})
✅ 升级
像往常一样,我们建议您运行以下命令进行升级
npx nuxi upgrade --force
这也会刷新您的锁定文件,并确保您从 Nuxt 依赖的其他依赖项(特别是在 unjs 生态系统中)中提取更新。
完整的发行说明
感谢您阅读至此!我们希望您喜欢新版本。如果您有任何反馈或问题,请告知我们。
快乐地使用 Nuxt ✨