v3.10 紧随 v3.9 发布,但它包含了大量新功能和修复。以下是一些亮点。
asyncData(实验性)当预渲染路由时,我们可能会反复重新获取相同的数据。在 Nuxt 2 中,可以创建一个“payload”,它只被获取一次,然后在每个页面中访问(当然,这在 Nuxt 3 中也可以手动实现——请参阅这篇文章).
借助#24894,我们现在可以在预渲染你的网站时自动为你完成此操作。你的 useAsyncData 和 useFetch 调用将在你的网站渲染之间进行去重和缓存。
export defineNuxtConfig({
experimental: {
sharedPrerenderData: true
}
})
useAsyncData 来获取与特定页面相关的数据,你应该提供一个唯一匹配该数据的键。(useFetch 应该会自动完成此操作。)我们现在提供了一个 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 内置模块(#25028),就像我们已经在部署到非 Node 环境时通过 Nitro 在服务器上所做的那样。
这意味着,在你的客户端代码中,你可以直接从 Node 内置模块导入(支持 node: 和 node 导入)。但是,为了避免不必要地增加你的捆绑包大小,我们不会为你全局注入任何内容。你可以在需要时导入它们。
import { Buffer } from 'node:buffer'
import process from 'node:process'
或者,例如,在 Nuxt 插件中提供你自己的 polyfill。
import { Buffer } from 'node:buffer'
import process from 'node:process'
globalThis.Buffer = Buffer
globalThis.process = process
export default defineNuxtPlugin({})
这应该会让那些使用没有适当浏览器支持的库的用户生活更轻松。但是,由于不必要地增加捆绑包的风险,我们强烈建议用户尽可能选择其他替代方案。
我们现在允许你选择使用CookieStore。如果浏览器支持,这将代替 BroadcastChannel 在 Cookie 更新时响应式地更新 useCookie 值(#25198).
这还伴随着一个新的可组合项 refreshCookie,它允许手动刷新 Cookie 值,例如在执行请求之后。
在此版本中,我们还发布了一系列功能来检测潜在的错误和性能问题。
setInterval,我们现在将抛出错误(#25259).<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 项目中模块子路径导入的实际方式。
“Bundler”模块解析是Vue 推荐的等等Vite 推荐的,但不幸的是,仍然有许多包在它们的 package.json 中没有正确的条目。
作为其中的一部分,我们在整个生态系统中打开了 85 个 PR 来测试切换默认设置,并发现并修复了一些问题。
如果你需要关闭此行为,你可以这样做。但是,请考虑在库或模块的仓库中提出问题(请随意在其中标记我),以便在源头解决。
export default defineNuxtConfig({
future: {
typescriptBundlerResolution: false
}
})
像往常一样,我们建议您运行以下命令进行升级
npx nuxi upgrade --force
这也将刷新你的 lockfile,并确保你拉取 Nuxt 依赖的其他依赖项(尤其是在 unjs 生态系统中)的更新。
感谢你阅读到这里!我们希望你喜欢这个新版本。如果你有任何反馈或问题,请告诉我们。
祝您 Nuxting 愉快 ✨