# 水合(Hydration)到底是什么
水合到底是什么?
# 水合的定义
维基百科上对“水合”这一化学概念的定义是:
在化学中,水合反应(hydration reaction),也叫作水化,是一种化学反应, 其中物质与水结合。 在有机化学中,将水加入不饱和底物中,该底物通常是烯烃或炔烃。 这种类型的反应在工业上用于生产乙醇,异丙醇,和 2-丁醇 维基百科
也就是说,水合就是把水加入到物质中,从而形式一种新的物质。
在 Nuxt 的官方文档中,有一个简短的定义:
在浏览器中使静态页面具有交互性被称为“水合”。
可以这样理解:
- 服务器上进行一部分的渲染,并且将这一部分返回给浏览器,相当于水合反应之“底物”
- 在浏览器中,Vue.js 就相当于水
- 而把 Vue.js 和 HTML 结合起来,使页面有交互性,这就是水合。
实际上 Nuxt 支持如下几个渲染模式:
- 通用渲染,也就是上面水合的描述过程,也是 Nuxt 的默认行为。
- 客户端渲染,即不进行 SSR,完全在浏览器中进行渲染。(就像最开始写 Vue,通过 Vite 构建的 SPA)
- 混合渲染,一部分页面可以在服务器上渲染,另一部分则是客户端渲染.
- 边缘渲染, 这是 Nuxt3 提供的强大功能. 也就是借助 CDN 技术, 可以在距离用户最近的边缘服务器上进行渲染. 其本质是一种部署方式.
# useHydration
ts
useHydration <T> (key: string, get: () => T, set: (value: T) => void) => {}
- key: 唯一标识符
- get: 设置默认值(服务端使用, 返回一个值)
- set: 前端获取服务端拿来的值
官方文档中对 useHydration 的描述很少, 只是说它主要在内部使用, 例如 useAsyncData 中使用了它. 通过 useHydration 可以实现对水合的完全控制.
# useAsyncData 和 useFetch 的区别
官方提到了 useFetch 和 useAsyncData('', () => $fetch(...)) 没有什么区别。 useAsyncData 可以使用其他的非 fetch 方式来获取数据,例如通过 fs 获取文件内容。
通过 useAsyncData 可以以 SSR 友好的方式获取数据。
目前我通过 useFetch 获取 Nuxt server 暴露的一个接口 api 来获取已经编译好的博客 jsx 内容 (避免二次编译)。 在选用混合渲染的情况下,将 blog 相关的页面进行预渲染。 Google Lighthouse 可以有一个很好的 Performance 指标。