解决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秒的倔强)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「递归算法」:两两交换链表中的节点

一、题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出&#xf…

Harris关键点检测原理简介

一、2D Harris 二、 3D Harris Harris关键点检测以及SAC-IA粗配准-CSDN博客

Docker部署Springboot项目

一、把Springboot项目打成jar包 (一)右键项目文件,点击Open Module Settings (二)选中Artifacts,点击中间的加号(Project Settings->Artifacts->JAR->From modules with dependencies…

WordPress站点如何实现发布文章即主动推送到百度快速收录和普通收录?

我们在WordPress后台成功发布文章之后,如果靠搜索引擎来抓取的话,可能会比较慢,所以十分有必要将我们成功发布的文章马上提交到百度、必应等搜索引擎中。下面boke112百科就跟大家说一说WordPress站点如何实现发布文章即主动推送到百度快速收录…

【Spring源码解读 底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理讲解

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

各类有关于花卉的深度学习数据集

花卉的识别和分类在深度学习过程中是最常见的使用的案例,因此各类有关花卉分类、识别、计数的图像数据集是大家都常用的数据集。最近收集到各类有关花卉的各类数据集分享给大家!! 1、16种花常见的图像数据集 数据说明:我们看到我…

简单的edge浏览器插件开发记录

今天在浏览某些网页的时候,我想要屏蔽掉某些信息或者修改网页中的文本的颜色、背景等等。于是在浏览器的控制台中直接输入JavaScript操作dom完成了我想要的功能。但是每次在网页之间跳转该功能都会消失,我需要反复复制粘贴js脚本,无法实现自动…

二、ActiveMQ安装

ActiveMQ安装 一、相关环境二、安装Java8三、下载安装包四、启动五、其他命令六、开放端口七、后台管理 一、相关环境 环境:Centos7.9安装ActiveMQ版本:5.15.9JDK8 二、安装Java8 安装教程:https://qingsi.blog.csdn.net/article/details/…

OpenCV-38 图像金字塔

目录 一、图像金字塔 1. 高斯金字塔 2. 拉普拉斯金字塔 一、图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔是同一图像不同分辨率的子图…

Qt for android : Qt6.6.2 搭建 环境

环境说明 参考Qt助手: Assistant 6.6.2 (MinGW 11.2.0 64-bit) ***Gradle : Gradle wrapper, version 8.3***JDK11 SDK Tools / NDK 25.1.8937393 参考 Qt For Android : Qt5.13.1 Qt for android: Qt6.4搭建环境遇到的几个问题

前方预警!2024年七大网络安全威胁

新颖创新技术的兴起和迅速采用已极大地改变了各行各业的全球网络安全和合规格局,比如生成式人工智能、无代码应用程序、自动化和物联网等新技术。 网络犯罪分子正转而采用新的技术、工具和软件来发动攻击,并造成更大的破坏。因此,《2023年网…

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…

基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 蓄电池储能原理 4.2 飞轮储能原理 4.3 混合储能系统原理 5.完整工程文件 1.课题概述 基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真。蓄电池和飞轮混合储能,蓄电池可以用SIMULINK…

私立医院患者大数据分析平台建设方案

一、项目目标 1、数据质量,统计数字不仅是真实可信,而且要及时,便于及时判断企业经营情况,同时通过内外部数据的对标,发现企业经营问题。 2、提供指标的监控预警,为决策提供支持,减少杂乱无用报表的生产。 3、提升数据处理效率,提高报表的可用性,让数据标准化,提高…

寒假 6

1.现有无序序列数组为{23,24,12,5,33,5,34,7}&#xff0c;请使用以下排序实现编程。 函数1:请使用冒泡排序实现升序排序 函数2︰请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4∶请使用插入排序实现升序排序 #include <stdio.h> #inclu…

代码随想录 Leetcode860. 柠檬水找零

题目&#xff1a; 代码(首刷自解 2024年2月15日&#xff09;&#xff1a; class Solution { public:bool lemonadeChange(vector<int>& bills) {vector<int> leftchange(2,0);//leftchange[0]代表5元数量&#xff0c;1代表10for (int i 0; i < bills.size…

多线程面试题汇总

多线程面试题汇总 一、多线程1、线程的生命周期2、线程的创建&#xff08;函数创建&#xff09;3、线程的创建&#xff08;使用类&#xff09;4、守护线程 二、全局解释器锁1、使用单线程实现累加到5000000002、使用多线程实现累加到5000000003、总结 三、线程安全1、多线程之数…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

蓝桥杯真题:扑克牌移动

import java.util.*; public class Main {public static List moveCard(List src){if(srcnull) return null;List dst new Vector();for(;;){if(src.size()0) break; // 填空src.add(src.remove(0));//remove(0) 是一个 List 接口中的方法调用&#xff0c;它表示移除列表中指…

163基于matlab的不同目标函数的盲源信号分离基于负熵的

基于matlab的不同目标函数的盲源信号分离基于负熵的&#xff1b;基于负熵的改进算法&#xff1b; 基于峭度的&#xff1b;基于互信息的&#xff1b;基于非线性PCA的。输出解混前后信号结果。程序已调通&#xff0c;可直接运行。 163 负熵、峭度、互信息、PCA 信号处理 (xiaohon…