这可能是 Nuxt v4 之前的最后一个次要版本,因此我们将其打包了许多功能和改进,希望能够让您满意!✨
🪵 更好的日志记录
当您开发 Nuxt 应用,并在应用中使用 console.log
时,您可能已经注意到在刷新页面时(在服务器端渲染期间),这些日志不会显示在浏览器控制台中。这可能让调试应用变得很困难。但这已经成为过去!
现在,当您有与请求关联的服务器日志时,它们将被整合并传递给客户端,并在浏览器控制台中显示。异步上下文 用于跟踪和关联触发这些日志的请求。(#25936)。
例如,以下代码:
<script setup>
console.log('来自 index 页面的日志')
const { data } = await useAsyncData(() => {
console.log('来自 useAsyncData 内的日志')
return $fetch('/api/test')
})
</script>
现在,在您刷新页面时,它将在浏览器控制台中进行日志记录:
来自 index 页面的日志
[ssr] 来自 useAsyncData 内的日志
位于 pages/index.vue
👉 我们还计划未来支持将后续日志流式传输到 Nuxt DevTools。
我们还添加了 dev:ssr-logs
钩子(在 Nuxt 和 Nitro 中都有效),该钩子在服务器和客户端上调用,允许您自行处理日志。
如果您在使用中遇到任何问题,可以选择禁用它们,或阻止它们记录到浏览器控制台。
export default defineNuxtConfig({
features: {
devLogs: false
// 或 'silent',以便您通过 `dev:ssr-logs` 钩子处理
},
})
🎨 预览模式
新的 usePreviewMode
组合式函数旨在在 Nuxt 应用中轻松使用预览模式。
const { enabled, state } = usePreviewMode()
在启用预览模式时,所有数据获取的组合式函数,如 useAsyncData
和 useFetch
,将重新运行,这意味着负载中的缓存数据将被绕过。
💰 更新缓存
现在,如果您没有禁用 Nuxt 的应用程序清单,我们将自动更新缓存中的负载,这意味着在部署后您不会遇到过时的数据 (#26068)。
👮♂️ 中间件 routeRules
现在可以在 Vue 应用程序部分(即非 Nitro 路由部分)为页面路径定义中间件了(#25841)。
export default defineNuxtConfig({
routeRules: {
'/admin/**': {
// 或 appMiddleware: 'auth'
appMiddleware: ['auth']
},
'/admin/login': {
// 您可以“关闭”将为页面运行的中间件
appMiddleware: {
auth: false
}
},
},
})
⌫ 新的数据获取实用程序 clear
现在,useAsyncData
和 useFetch
提供了一个名为 clear
的实用程序。这是一个可用于将 data
设置为未定义,将 error
设置为 null
,将 pending
设置为 false
,将 status
设置为 idle
,并标记任何当前挂起的请求为取消的函数 (#26259)
<script setup lang="ts">
const { data, clear } = await useFetch('/api/test')
const route = useRoute()
watch(() => route.path, (path) => {
if (path === '/') clear()
})
</script>
🕳️ 新的 #teleports
目标
现在,在您的应用程序中的 <body>
标签内,Nuxt 将包含一个新的 <div id="teleports"></div>
元素。它支持服务器端传输,这意味着您可以在服务器上安全地执行以下操作:
<template>
<Teleport to="#teleports">
<span>
Something
</span>
</Teleport>
</template>
🚦 加载指示器和过渡控制
现在,可以为隐藏加载指示器和强制使用 finish()
方法设置自定义时机了 (#25932)。
如果启用了该功能,还有一个新的 page:view-transition:start
钩子可供使用以钩入视图过渡 API (#26045)。
🛍️ 仅服务器和客户端的页面
此版本引入了在 Nuxt 中支持仅服务器和客户端的页面!现在,您可以通过给页面添加 .server.vue
或 .client.vue
后缀来自动处理它们。
客户端页面 将完全在客户端上呈现,并完全跳过服务器端渲染,就好像整个页面被包装在 <ClientOnly>
中一样。请谨慎使用,客户端的加载会导致糟糕的用户体验,因此确保您真的需要避免服务器端加载。您还可以考虑使用带有 fallback
插槽的 <ClientOnly>
来呈现骨架加载器 (#25037)。
⚗️ 服务器端页面 更加有用,因为它们使您能够在客户端导航中集成完全服务器端渲染的 HTML。甚至在链接到它们的链接在视口中时,它们也将被预取,因此您将获得即时加载 (#24954)。
🤠 服务器组件盛宴
当您使用服务器组件时,您现在可以在树的任何位置使用 nuxt-client
属性 (#25479)。
export default defineNuxtConfig({
experimental: {
componentIslands: {
selectiveClient: 'deep'
}
},
})
您可以监听服务器组件的 @error
事件,以便在加载组件时出现任何问题时触发该事件 (#25798)。
最后,当您的项目或其任何层中有仅服务器组件或仅服务器页面时,servers-only 组件将被智能启用 (#26223)。
🔥 性能改进
我们提供了许多性能改进,包括仅更新更改的虚拟模板 (#26250),使用“分层”的预渲染缓存 (#26104) 在预渲染时回退到文件系统而不是在内存中保存所有内容 - 还有其他许多改进示例。
📂 处理公共资源
我们已重新实现了 Vite 的公共资源处理,这意味着您 public/
目录或层目录中的公共资源现在完全由 Nuxt 解析 (#26163),因此,如果您已添加 nitro.publicAssets
目录并具有自定义前缀,则现在将起作用。
📦 分块命名
我们已更改了默认的 JS 分块文件名模式 _nuxt/[name].[hash].js
。现在,我们默认使用 _nuxt/[hash].js
。这是为了避免进行组件或块名称触发 adblocker 导致误报的问题,这可能是一个非常难以调试的问题。 (#26203)
如果您希望恢复到以前的行为,您可以轻松进行配置:
export default defineNuxtConfig({
vite: {
$client: {
build: {
rollupOptions: {
output: {
chunkFileNames: '_nuxt/[name].[hash].js',
entryFileNames: '_nuxt/[name].[hash].js'
}
}
}
}
},
})
💪 类型修复
以前,如果 shamefully-hoist=false
的用户可能会遇到类型未解析或工作不正确的问题。您还可能遇到大量类型实例化的问题。
现在,我们尝试告诉 TypeScript 关于某些关键类型,以便即使嵌套深入,它们也可以解析(#26158)。
还有许多其他类型修复,包括一些与导入类型有关的修复(#26218 和 #25965),以及模块类型的修复(#25548)。
✅ 升级
像往常一样,我们建议升级 Nuxt,只需运行:
nuxi upgrade --force
这将刷新您的 lockfile,并确保您从 Nuxt 依赖的其他依赖项中获取更新,特别是在 unjs 生态系统中。
👉 完整发布说明
感谢您一直阅读到这里!我们希望您喜欢这个新版本。如果您有任何反馈或问题,请告诉我们。
快乐 Nuxt 之旅 ✨