Nuxt 是新一代 Vue 框架,在海外市场已经有了一定的使用率,其官网说明是:
Nuxt 是一个开源框架,使 Web 开发变得直观且强大。 充满信心地创建高性能和生产级的全栈 Web 应用程序和网站。
英文原文:Nuxt is an open source framework that makes web development intuitive and powerful. Create performant and production-grade full-stack web apps and websites with confidence.
Nuxt 被前端圈视为对标 Next 的 Vue 框架,Next 是基于 React 的框架。问:Agauler被排挤了?
Nuxt3官网:https://nuxt.com/
使用 Nuxt 或 Next ,想必很大原因是想要使用 SSR 功能,但是你用对了吗?
SSR
时的错误案例。SSR
,全称:Server-Side Rendering
,翻译:服务端渲染,是一种在服务器端生成网页内容的技术。与客户端渲染(Client-Side Rendering
)相比,SSR
在服务器端生成 HTML
页面,然后将完整的页面发送到客户端进行显示。这个过程在用户请求页面时立即在服务器端完成。
当用户请求一个网页时,传统的客户端渲染方式通常会先发送一个基本的 HTML 框架,然后在客户端通过 JavaScript 加载和渲染动态内容。相比之下,SSR 直接在服务器端生成完整的 HTML 页面,包括所有动态内容,再将其发送到客户端。
HTML
一起发送,浏览器在加载页面时不需要等待 JavaScript
的执行就可以显示内容,这极大地提高了页面的首屏加载速度,尤其在网络较慢或设备性能较低的情况下。SEO
友好:搜索引擎爬虫通常会优先抓取静态 HTML
内容。通过 SSR
,页面在服务器端就生成了完整的 HTML,这使得搜索引擎更容易抓取和索引页面内容,提升网站在搜索结果中的表现。HTML
来生成分享预览。通过 SSR
,可以确保这些平台获取到完整的页面内容,从而提供更好的分享效果。总结:SSR 在提高页面加载速度、提升 SEO 和社交分享效果等方面具有明显优势,尤其适用于内容驱动的网站。然而,它也伴随着开发和部署的复杂性,需要权衡服务器负载和开发成本。
简而言之,若想要使用 Nuxt
的 SSR
功能,则要谨慎使用 Vue
的生命周期函数,尤其是比较常用的 onMouted
。
ts// 查询数据
const softs = ref<SoftWare[]>();
const allSofts = ref<SoftWare[]>();
onMounted(() => {
$fetch("/softs", {
method: "POST",
}).then((res) => {
softs.value = res;
allSofts.value = res;
});
});
tsconst softs = ref<SoftWare[]>();
const allSofts = ref<SoftWare[]>();
allSofts.value = await $fetch("/softs", { method: "POST" });
softs.value = allSofts.value;
看了正确代码和错误代码,你能想出错误代码为什么错吗?如果你猜不出来,想必你对 Vue 或 SSR 还没有很好的理解,先看看如何检查SSR是否正常?
吧
根据 SSR 的定义,我们可以找到一个简单的校验 SSR 是否生效的方法:
右键
--查看网页源码
,如果代码结构与网页结构几乎一致,则可以认为SSR已正常生效,反之则可能没生效。注意:不是在F12中看的
Element
源码哦!如果F12中的代码和右键的代码相同,也可以认为SSR已经生效
一个常见的例子,使用 v-for
生成的多个元素,如:
html<ItemCard
v-for="item in items"
:key="item.id"
:item="item"
></ItemCard>
这段代码,在渲染完成后(SSR后
),页面显示了几个 ItemCard
内容,则查看网页源码中就应该有几个 ItemCard
相关的 div
。如果能对应起来,则说明 SSR
已生效。
现在你能想到为什么使用 onMounted
会有问题了吗?onMounted
是什么时候会执行的钩子函数?
不查阅任何资料,以基础知识思考,老狗认为错误代码的问题:主要是因为 onMounted
钩子仅在客户端执行,导致在服务端渲染期间没有及时获取数据,无法完成 SSR
渲染。
另外,正确代码中的 await
也很关键,在 SSR
模式下,页面的初始渲染是在服务端完成的,然后将渲染后的 HTML
返回给客户端。这意味着在服务端渲染过程中,所有需要的数据应该在页面渲染之前获取到。如果数据是通过异步请求获取的,那么在服务端渲染期间,这些数据也应该是同步获取并渲染的。
基于此次问题,老狗总结了几个容易犯且会导致 SSR
失效的细节:
window
或document
等常用的浏览器专属对象,要避免在编译过程中直接使用这些对象,否则可能会导致 SSR
失效,因此如果你需要使用这类对象时,建议放在Vue的客户端钩子中,比如上面提到的 onMounted
,如:onMounted(() => { window.addEventListener("scroll", handleScroll);});
onMounted
这类钩子。SSR
中异步数据没有正确处理,可能会导致页面在服务端渲染时缺乏必要的数据,进而出现不完整的 HTML
。SSR
中,因为状态管理在服务端和客户端都可能需要使用,所以需要确保在服务端渲染时,状态被正确初始化,并且在客户端重新挂载时,状态不会被覆盖。Nuxt3
提供了 SSR
友好的状态管理工具,如 useState
。Nuxt
的配置方式,正确配置css
相关样式表,避免在进行 SSR
时导致页面异常。建站因为热爱,生活需要Money,本站非常需要屏幕前的大佬动动您发财的小手,点击一次以示鼓励,祝您生活愉快!
PS:如果看不到广告,可能是网络原因或被拦截了。再次祝您生活愉快~~ 🥰
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!