解决vitepress首次加载慢(从40秒到1秒的倔强)

前言:在艰难的博客系统升级之路 这篇博客中我有提到vitepress首次加载非常耗时的问题,之前也在网上搜索时发现也有很多人说这个“问题”,但是在折腾了这么一段时间后,发现这也许本身不是vitepress的问题,而是我的启动方式不对导致的,在这里和大家分享一下这一路解决这个问题的过程。我愿称之为:从40秒到1秒的倔强。😒 😒 😒

耗时的原因

1.项目未build,使用的dev进行部署的,首次加载页面会有250+个请求,因此非常慢!(主要原因)

看下面这个截图就知道了,首次加载时直接一次性发起254个请求,对于我这带宽只有几M的服务器实在是不够用啊!

image.ff3bbbacccc711ee9de617490ed73bd0.png
为什么我没有使用build方式进行部署?

因为我想做一个博客系统,希望写的每一篇博客都能够实时更新(即编辑完成发布之后,立马就能够在首页看到),但是,由于vitepress的渲染(md->html)是在服务端进行,因此在build的时候所有的md文件都会被一次性渲染成html,所以,build之后,所有的博客内容都会被固定死,新增的博客以及更新的内容都无法展示,除非重新build一次,这也是为什么vitepress官网说是一个静态页面生成的应用。但是有一个牛角尖可以钻:就是它的dev模式支持热更新,md文件的内容会同步更新到前端,于是在找不到其他好的办法的情况下就只好这样了。这个解决方案实在有点憋屈。😅

在错误的方案上找了很多方案,导致一错再错!

这期间,我也试了很多办法来解决这个首次加载慢的问题,踩了很多坑,因为我上面的解决方法本身就是有问题的,所以相当于我后面的解决方案都是在错误的方向上找到的“正确”的解决方案,这也导致错误的方案不断延续,导致一错再错!

尝试修改源码

首先,我查看了这250+请求都有哪些,以及他们的调用栈,发现他们很多我都是没有用到的,比如下面这些team页的配置:image.28baa6c6ccca11ee9de617490ed73bd0.png
我压根没有用到team页,但是它却无缘无故的加载了,因此这个就是多余的,于是顺着调用栈我找到了调用它的源码,于是立马注释掉,然后重新启动刷新页面,发现请求真的少了那么几个!!!果然是这玩意导致的:加载了很多无关的东西,于是我就继续找类似这样多余的请求,找着找着我就找不下去了…因为我发现我这个办法真的很愚蠢…我就想作者肯定想到了这一点,每次都这么多请求,一般的服务器谁顶得住啊。宁愿相信作者,也不愿意相信我这个愚蠢的做法,于是这个方案就这么不了了之了。

尝试build

一直没有build的原因除了上面那个方案错了以外,其实还有一个重要的原因:博客有1000多篇,每次build的时候都会报“npm run build javascript heap out of memory”错误,虽然网上有很多解决方案,但是都大同小异,看到的最多的就是使用increase-memory-limit这个插件,试了几次,一开始在window上没搞成,后来在mac(换的新电脑)上也没搞成…所以一直被困在这里。最后好不容易找了一个可行的解决方案:命令改为如下即可,参考
image.8b735c50ccce11ee9de617490ed73bd0.png
在解决了这个问题后,又出现了一个新的问题,就是:“window is not defined”,这个问题的原因是,我在代码中使用了window这个对象,而window这个对象是在客户端才有的,而打包是在服务端进行的,对于一个业余前端的我来说这个问题又折腾了我好一段时间,最后发现解决方案其实就在官网上,也是通过各种搜索+github上的discuss才知道的,这个过程真的很艰辛…这个问题也有一个专门的名字:SSR Compatibility(服务端渲染的兼容),vitepress官网给出的解决方案:地址
image.0fe0f14accd011ee9de617490ed73bd0.png
它的两种方案我都有用到过,一个就是使用ClientOnly包裹使用了window的组件,再一个就是动态的导入。

解决了以上的问题之后,我终于可以build啦!当我build之后使用npm run docs:preview命令再次启动服务,第一次访问时,惊奇的发现请求量只有20+啦!!!请求时间也短了很多,大概6秒以内,快的时候1秒都不要!到这里,才算真正解决了首次加载慢的原因的一部分!也是最主要的一部分!

彻底死心后的另辟蹊径

直到这里,我虽然成功的build了项目,但是,这个build非常耗时,可能得接近1分钟,虽然没有仔细算过,但是这个时间真的很长,并且如果每次更新文章都进行一次build的话,真的会很麻烦!!!所以即使在这个时候,我仍然选择的是使用dev模式进行部署…

为了彻底解决这个问题,我于是就追根溯源,找到它将md渲染成html的API,在discuss上逛了一圈后,终于在一次discuss中找到了和我问题相似的内容:传送门,也就是createMarkdownRenderer这个接口提供了渲染功能,但遗憾的是它只在node中运行,也就是服务端,只能在服务端进行打包,在另外一个discuss中作者也有提到过:https://github.com/vuejs/vitepress/discussions/2921
image.4e7629c6ccd411ee9de617490ed73bd0.png
此时的我是心灰意冷,彻底死心了…
没有办法,我再次翻阅vitepress的官方文档,查看它关于markdown渲染的部分,了解到它其实也是使用的另外一个插件,只不过在它的基础上做了一些扩展,这个插件是markdown-it,于是我尝试通过这个插件去渲染md文件,没想到,居然就成功了!虽然这个尝试很简单,但是能够走到这一步真的不容易!翻阅了几篇渲染的博客,大体样式是没有问题的,但是代码,列表等部分还是有样式问题,这可又难到我了…于是我想了想,既然我直接用这个插件可以渲染成功,那我用vitepress扩展的markdown-it应该也是可以的,至少在原理上是行得通的(前提是得去掉server side这边的依赖)!
于是我便很快做了尝试,直接将vitepress中渲染md的所有源码拷贝了过来,根据一些错误提示,去掉了一些不可用,服务端依赖的东西,最终也成功运行!!!
image.9a935918ccd511ee9de617490ed73bd0.png

2.cdn加载慢

为什么改为build之后还需要加载这么长时间?当我打开浏览器的控制台的答案就一目了然了,主要是element的样式文件使用的是cdn.jsdelivr.net的cdn,这个cdn在国内访问有点慢…后来我换成了cdn.staticfile.net,速度快了很多!最后能够保持在1秒以内加载完毕!
image.29f71904ccd211ee9de617490ed73bd0.png
原文链接:解决vitepress首次加载慢(从40秒到1秒的倔强)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

娅奴服饰:行至云深处,问计新零售

编辑:阿冒 设计:沐由 大浪壮美,时尚前行。 作为广东省首批特色小镇创建示范点,以及粤港澳大湾区唯一的特色时尚小镇,大浪时尚小镇云集了700余家服装及配套企业,涌动着蓬勃的生机与无尽的活力。 国内知名的“…

基于Java (spring-boot)的房屋租赁管理系统

一、项目介绍 基于Java (spring-boot)的房屋租赁管理系统功能:登录、管理员、租客、公告信息管理、房屋信息管理、用户信息管理、租金信息管理、故障信息管理、房屋出租信息详情、个人信息、修改密码、等等等。 适用人群:适合小白、大学生、毕业设计、课…

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G题解

题目 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所…

Springboot的it职业生涯规划系统(有报告)。Javaee项目,springboot项目。

演示视频: Springboot的it职业生涯规划系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

【Linux】初步使用makefile

makefile 1 快速使用1.1 认识makefile1.2 使用makefile 2 深入理解理解 **依赖关系 与 依赖方法**如何实现源代码修改了才会重新编译 3 内置符号理解Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见!&a…

家人们,比赛打完了

啊,终于打完一场比赛了,但还有三场…… 先看看我的战绩: 共八题,AC6题,总共3902分,3.7k人参加,第980名 来看看第一: A8题,我只有2题没做出,相差4000多分&am…

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…

五、OpenAi之函数调用(Function Calling)(一)

1.函数调用(Function Calling) 学习如何使大语言模型连接到外部工具 1.1介绍 在API调用中,您可以描述函数规范,让模型智能地选择输出包含参数的JSON对象,过程中你以调用一个或多个函数。聊天补全API自身不能调用函数;而是&…

地理信息数据要素价值

文章目录 前言一、地理信息数据成为生产要素的重要内涵二、推动地理信息数据要素价值实现的重点及方式(一)公共地理信息数据(二)企业地理信息数据前言 面对数字经济发展新形势新需求,我们将统筹发展与安全,推动数据资源向数据资产转变,发挥时空数据作为新型生产要素价值…

【上海游戏业:创新与商业的结合】

上海游戏业:创新与商业的结合 我国游戏产业在近年来蓬勃发展,不同城市都涌现出许多优秀的游戏公司。为全面了解中国游戏业的发展情况及地区特色,本文选择分析游戏业较为发达的上海、广州、北京、深圳、成都、杭州、福建七个城市。这些城市在…

SQL拆分字段内容(含分隔符)

问题描述: 在做数据迁移的过程中,我们希望对表中的某个字段根据分隔符进行拆分,得到多条数据,原代码有点意思,因此记录一下。 我们假设某条数据如下: IDSTRS1公司名称不能小于四个字,行业类别…

基于Spring Boot的古典舞在线交流平台设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1758349555560165377