Nuxt 3.9 的七大新功能

大家好,这里是大家的林语冰。

《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点。

免责声明

本文属于是语冰的直男翻译了属于是,略有删改,仅供粉丝参考。英文原味版请传送 7 New Features in Nuxt 3.9。

本期共享的是 ------ Nuxt 3.9 版本中值得注意的七大新功能。

Nuxt 3.9 中有很多新内容,本人花了一些时间深度学习其中的某些内容。在这篇文章中,我会介绍:

  1. 调试生产环境中的水合错误
  2. 新型的 useRequestHeader 组合式函数
  3. 自定义布局备案
  4. 将依赖添加到我们的自定义插件
  5. 对加载 UI 进行细粒度控制
  6. 新型好用的 callOnce 组合式函数
  7. 请求去重:适用于 useFetch 和 useAsyncData 组合式函数

1. 调试生产环境中的水合错误

水合错误(hydration error)是 SSR(服务端渲染)最头大的部分之一,尤其当且仅当它们发生在生产环境中时。

幸运的是,Vue 3.4 让我们可以搞定这一点。

在 Nuxt 中,我们需要做的就是更新我们的配置:

js 复制代码
export default defineNuxtConfig({
  debug: true
  // 你的其余配置......
})

如果您没有使用 Nuxt,那么可以使用新型编译时标志,从而启用此功能:__VUE_PROD_HYDRATION_MISMATCH_DETAILS__。这就是 Nuxt 使用的方案。

根据您使用的构建工具,启用标志会有所不同,但如果我们使用的是 Vite,那就在 vite.config.js 文件配置,如下所示:

js 复制代码
import { defineConfig } from 'vite'

export default defineConfig({
  define: {
    __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true'
  }
})

启动此功能会增加我们的打包体积,但它对于追踪那些令人头大的水合错误十分有用。

2. useRequestHeader 组合式函数

在 Nuxt 中,从请求中获取单个 header 轻而易举:

js 复制代码
const contentType = useRequestHeader('content-type')

这在中间件和服务器路由中,用来检查身份验证或其他许多事情都十分方便。

如果我们在浏览器环境使用 useRequestHeader 组合式函数,那么它会返回 undefined。

这是 useRequestHeaders 的抽象,因为很多时候我们只需要一个 header。

3. Nuxt 布局备案(layout fallback)

如果我们正在 Nuxt 中处理复杂的 Web App,那我们可能需要更改默认布局:

html 复制代码
<NuxtLayout fallback="differentDefault">
  <NuxtPage />
</NuxtLayout>

通常,如果没有指定其他布局,NuxtLayout 组件会使用 default 布局 ------ 通过 definePageMeta、setPageLayout,或直接指定 NuxtLayout 组件本身。

这对于大型 App 而言十分有用,我们可以在其中为 App 的每个部分提供不同的默认布局。

4. Nuxt 插件依赖

为 Nuxt 编写插件时,可以指定依赖:

js 复制代码
export default defineNuxtPlugin({
  name: 'cat-plugin',
  dependsOn: ['another-plugin']
  async setup (nuxtApp) {
    // setup() 方法只会在 another-plugin 插件初始化后运行一次
  }
})

但为什么我们需要这个功能呢?

通常,插件是根据它们在文件系统中的顺序依次初始化的:

md 复制代码
plugins/

- 01.firstPlugin.ts // 使用数字强制排序,而非字母顺序
- 02.anotherPlugin.ts
- thirdPlugin.ts

但我们也可以并行加载它们,如果它们不相互依赖的话,这会加快速度:

js 复制代码
export default defineNuxtPlugin({
  name: 'my-parallel-plugin',
  parallel: true,
  async setup(nuxtApp) {
    // 完全独立于所有其他插件运行
  }
})

虽然但是,有时我们有其他插件依赖于这些并行插件。通过使用 dependsOn 属性,我们可以让 Nuxt 知道我们需要等待哪些插件,即使它们是并行运行的:

js 复制代码
export default defineNuxtPlugin({
  name: 'cat-plugin',
  dependsOn: ['parallel-plugin']
  async setup (nuxtApp) {
    // 在初始化之前会等待 parallel-plugin 并行插件完成
  }
})

尽管十分有用,但我们实际上可能并不需要此功能。有大佬曾经说过,"我个人不会在插件中使用这种硬性依赖图。钩子函数在依赖关系定义方面更加灵活,并且可以肯定每种情况都可以用正确的模式解决。考虑到历史上这一直是一个被社区要求的功能,私以为它主要是 Nuxt 作者的'差评去质器'。"

5. Nuxt 加载API

在 Nuxt 中,我们可以获得有关如何使用 useLoadingIndicator 组合式函数加载页面的详细信息:

js 复制代码
const { progress, isLoading } = useLoadingIndicator()

console.log(`Loaded ${progress.value}%`) // 进度 9%

这在 <NuxtLoadingIndicator> 组件内部使用,并且如果我们正在编写插件,这可以通过 page:loading:start 和 page:loading:end 钩子触发。

但我们对加载指示器的运行方式有很多控制权:

js 复制代码
const {
  progress,
  isLoading,
  start, // 从零开始
  set, // 进度重写
  finish, // 完成和清理
  clear // 清空所有 timer 和重置
} = useLoadingIndicator({
  duration: 996, // 默认值 2000
  throttle: 996 // 默认值 200
})

我们可以专门设置 duration,这是我们需要的,这样我们可以将 progress 计算为百分比。throttle 值控制 progress 值更新的速度 ------ 如果我们有大量预期平滑的交互,那就十分有用。

finish 和 clear 之间的区别至关重要。虽然 clear 重置所有内部计时器,但它不会重置任何值。

为此我们需要 finish 方法,它可以实现更优雅的用户体验。finish 将 progress 设置为 100,将 isLoading 设置为 true,然后等待半秒。之后,它会把所有值重置回初始状态。

6. Nuxt callOnce

如果我们只需要运行一段代码一次,那可以使用 Nuxt 专门的组合式函数,从 Nuxt 3.9 开始提供:

html 复制代码
<script setup>
  await callOnce(async () => {
    // 即使是 SSR,这也有且仅有运行一次
  });
</script>

使用 callOnce 可确保我们的代码有且仅有执行一次 ------ 无论是 SSR 期间在服务器上执行,还是在用户导航到新页面时在客户端上执行。

我们可以将其理解为为类似于路由中间件 ------ 每个路由加载有且仅有执行一次。但是 callOnce 不返回任何值,并且可以在可以放置组合式函数的任意位置执行。

callOnce 还有一个类似于 useFetch 或 useAsyncData 的属性,这确保它可以追踪已执行的内容和未执行的内容:

html 复制代码
<script setup>
  ;['one', 'two', 'three'].forEach(item => {
    // 为每个元素执行一次
    callOnce(item, async () => {
      // 处理元素的逻辑
    })
  })
</script>

默认情况下,Nuxt 将使用文件和行号自动生成唯一密钥,但这并非在所有情况下都奏效。

7. Nuxt 中的重复请求

从 Nuxt 3.9 开始,我们可以使用 dedupe 参数控制 Nuxt 去重的方式:

js 复制代码
useFetch('/api/menuItems', {
  dedupe: 'cancel' // 取消之前的请求,生成一个新的请求
})

useFetch 和 useAsyncData 组合式函数会在其参数更新时响应式重新请求数据。默认情况下,它们会取消之前的请求,并使用新参数发起新的请求。

虽然但是,我们可以将此行为更改为现有请求,而不是 defer ------ 当存在待处理请求时,不会发出新请求:

js 复制代码
useFetch('/api/menuItems', {
  dedupe: 'defer' // 保留待定请求,不会初始化新请求
})

这使我们能够更好地控制数据加载和请求的方式。

本期话题是 ------ 你个人最喜欢的是 Nuxt 3.9 的哪个新功能呢?

欢迎在本文下方自由言论,文明共享。谢谢大家的点赞,掰掰~

《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点。

相关推荐
程序员Sunday7 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
Setsuna_F_Seiei8 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
志尊宝8 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
zhangzeyuaaa8 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙9 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯9 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
思无邪6610 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
一个风轻云淡10 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u01110267511 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说11 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic