Release·  

Nuxt 3.10

Nuxt 3.10 已发布 - 充满了功能和修复。以下是一些亮点。

v3.10 在 v3.9 之后推出,但它充满了功能和修复。以下是一些亮点。

✨ 实验性的共享 asyncData 在预渲染时

在预渲染路由时,我们可能会反复获取相同的数据。在 Nuxt 2 中,可以创建一个“payload”,可以获取一次然后在每个页面中访问(在 Nuxt 3 中当然也可以手动执行此操作 - 参见此文章)。

通过#24894,在预渲染网站时我们现在可以为您自动执行此操作。您的useAsyncDatauseFetch调用将在网站的渲染之间进行去重和缓存。

nuxt.config.ts
export defineNuxtConfig({
  experimental: {
    sharedPrerenderData: true
  }
})
特别重要的是,确保数据的任何唯一键始终可以解析到相同的数据。例如,如果您使用useAsyncData获取与特定页面相关的数据,则应提供一个与该数据唯一匹配的键。(useFetch应该自动执行此操作。)
Read more in Docs > Guide > Going Further > Experimental Features#sharedprerenderdata.

🆔 SSR 安全的可访问唯一 ID 创建

我们现在提供了一个useId组合,用于生成安全的 SSR 唯一 ID(#23368)。这使得您的应用程序中创建更可访问的界面变得更加容易。例如:

components/MyForm.vue
<script setup>
const emailId = useId()
const passwordId = useId()
</script>

<template>
  <form>
    <label :for="emailId">电子邮件</label>
    <input
      :id="emailId"
      name="email"
      type="email"
    >
    <label :for="passwordId">密码</label>
    <input
      :id="passwordId"
      name="password"
      type="password"
    >
  </form>
</template>
Read more in Docs > API > Composables > Use Id.

✍️ 扩展 app/router.options

现在模块作者可以注入自己的router.options文件(#24922)。新的pages:routerOptions钩子允许模块作者执行例如添加自定义scrollBehavior或在运行时增强路由的操作。

Read more in Docs > Guide > Going Further > Custom Routing#router Options.

客户端 Node.js 支持

我们现在支持(实验性的)填充关键的 Node.js 内置模块(#25028),就像我们在部署到非 Node 环境时通过 Nitro 在服务器上所做的那样。

这意味着,在客户端代码中,您可以直接从 Node 内置模块中导入(支持node:和 node 导入)。然而,不会为您全局注入任何内容,以避免不必要地增加包大小。您可以根据需要导入它们。

some-file.ts
import { Buffer } from 'node:buffer'
import process from 'node:process'

或者提供自己的填充代码,例如,在 Nuxt 插件中。

plugins/node.client.ts
import { Buffer } from 'node:buffer'
import process from 'node:process'

globalThis.Buffer = Buffer
globalThis.process = process

export default defineNuxtPlugin({})

这将使没有适当浏览器支持的库的用户更轻松地使用。然而,由于增加包大小的风险,如果有可能,我们强烈建议用户选择其他替代方案

现在我们允许您选择使用CookieStore。如果浏览器支持,更新 cookie 时会使用 CookieStore 而不是 BroadcastChannel 来响应地更新useCookie的值(#25198)。

这也配套了一个新的组合式函数refreshCookie,它允许手动刷新 cookie 的值,例如在执行请求后。

Read more in Docs > API > Utils > Refresh Cookie.

🏥 检测反模式

在这个发布版本中,我们还提供了一系列功能来检测潜在的错误和性能问题。

  • 如果在服务器上使用setInterval,我们将抛出错误(#25259)。
  • 我们(仅在开发模式下)会发出警告,如果错误使用了数据获取的组合式函数(#25071),例如在插件或设置上下文之外使用。
  • 我们(仅在开发模式下)会发出警告,如果您没有使用<NuxtPage />但启用了vue-router的集成(#25490)。(RouterView不能单独使用。)

🧂 精细的视图过渡支持

现在可以使用definePageMeta在每个页面上控制视图过渡的支持(#25264)。

您需要首先启用实验性的视图过渡支持:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    viewTransition: true
  },
  app: {
    // 如果需要,您可以全局禁用它们(默认情况下它们已启用)
    viewTransition: false
  }
})

然后可以选择性地开启或关闭:

pages/index.vue
<script setup lang="ts">
definePageMeta({
  viewTransition: false
})
</script>

最后,如果用户的浏览器匹配了prefers-reduced-motion: reduce,Nuxt 将不会应用视图过渡效果(#22292)。您可以设置viewTransition: 'always',然后由您来尊重用户的首选项。

🏗️ 构建时路由元数据

现在可以在构建时访问在definePageMeta中定义的路由元数据,允许模块和钩子修改和更改这些值(#25210)。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    scanPageMeta: true
  }
})

请尝试使用并告诉我们它对您的工作有何改进。我们希望提高性能并在以后的版本中默认启用该功能,以便像@nuxtjs/i18n和其他模块能够更深入地与在definePageMeta中设置的路由选项进行集成。

📦 模块解析

通过#24837,我们现在选择使用 TypeScript 的bundler解析,这更接近于在 Nuxt 项目中解析模块的实际方式。

‘Bundler’模块解析是由 Vue(推荐)和 Vite(推荐)推荐的,但不幸的是,仍然有许多包在其package.json中没有正确的条目。

作为此举的一部分,我们在整个生态系统中开启了 85 个 PR,以测试切换默认方式,并识别和修复了一些问题。

如果您需要关闭此行为,可以这样做。但是,请考虑在库或模块的存储库中提出问题(请随时在问题中标记我),以便能够在来源处解决该问题。

nuxt.config.ts
export default defineNuxtConfig({
  future: {
    typescriptBundlerResolution: false
  }
})

✅ 升级

如往常一样,我们推荐运行:

npx nuxi upgrade --force

这将刷新您的锁定文件,并确保您拉取了 Nuxt 依赖的其他依赖项的更新,特别是在非 Node 生态系统中。

完整的发布说明

阅读 Nuxt v3.10.0的完整发布说明。

感谢您阅读到这里!我们希望您喜欢新版本。如果您有任何反馈或问题,请务必告诉我们。

祝您使用 Nuxt 的愉快 ✨