解决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.mzph.cn/news/687375.shtml

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

相关文章

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…

Arduino程序简单入门

文章目录 一、结构1.1 setup()1.2 loop() 二、结构控制2.1 if2.2 if...else2.3 switch case2.4 for2.5 while2.6 do...while2.7 break2.8 continue2.9 return2.10 goto 三、扩展语法3.1 ;(分号)3.2 {}(花括号)3.3 //(单…

百度地图接口 | 实现校验收货地址是否超出配送范围

目录 1. 环境准备 2. 代码开发 2.1 application.yml 2.2 OrderServiceImpl 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Py…

数据结构-双指针法

介绍 双指针法是一种可以在O(n)时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表,从而实现特定操作。 常见的双指针法有 1.快慢指针:快指针每次移动两步&…

AI:131- 法律文件图像中的隐含信息挖掘与敲诈勒索检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天,这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址:www.drhchina.com 防泄密系统的主要功能通常包括: 文…

[前端开发] 常见的 HTML CSS JavaScript 事件

代码示例指路 常见的 HTML、CSS、JavaScript 事件代码示例 常见的 HTML CSS JavaScript 事件 事件HTML 事件鼠标事件键盘事件表单事件 JavaScript 事件对象事件代理(事件委托) 事件 在 Web 开发中,事件是用户与网页交互的重要方式之一。通过…

LeetCode405. Convert a Number to Hexadecimal

文章目录 一、题目二、题解 一、题目 Given an integer num, return a string representing its hexadecimal representation. For negative integers, two’s complement method is used. All the letters in the answer string should be lowercase characters, and there …

二进制和进制转换

前言 我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进 制、10进制、16进制是数值的不同表示形式而已。 比如:数值15的各种进制的表示形式: 15的2进制:111115的8进制&#xff1…

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…

完成端口的看法

很早之前使用过完成端口,当时觉得是很不错的技术。但是后来发现用的地方并不多,对它也有些自己的想法,仁者见仁智者见智。 应用场景上, 个人觉得,iocp有些鸡肋,一般的应用用不上,复杂的程序…

wps使用方法(包括:插入倒三角符号,字母上面加横线,将word中的所有英文设置为time new roman)

倒三角符号 字母上面加横线 将word中的所有英文设置为time new roman ctrla选中全文

语音唤醒——

文章目录 配置主代码 参考文档:https://picovoice.ai/docs/quick-start/porcupine-python/ 配置 pip install pvporcupine主代码 ACCESS_KEY:需要将该参数填入即可 # # Copyright 2018-2023 Picovoice Inc. # # You may not use this file except in …

人机协同中的感应与响应

人机协同中的感应与响应是指人与机器之间的互动过程中,机器对人的动作、行为、情感等进行感知,并根据这些感知信息作出相应的反应。感应是指机器能够通过传感器、摄像头等设备感知到人的动作、语音、表情等信息,将其转化为数字信号或数据&…

MySQL事务的概念

一、事务定义 事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。事务只和DML语句有关&a…

Java基于微信小程序的医院挂号小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Jenkins 2.426.3新版设置中文

1. 插件页面显示无法联网 ,点击Plugins一直提示连接超时,设置公司代理后 2. 稍等一会儿点击如下图,插件就出来了,然后输入Locale进行下载 3. 以下是我下载安装好的 4.打开设置,找到Locale选项,设置成zh_CN…

第13章 网络 Page738~741 13.8.3 TCP/UDP简述

libcurl是C语言写成的网络编程工具库,asio是C写的网络编程的基础类型库 libcurl只用于客户端,asio既可以写客户端,也可以写服务端 libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…

305_C++_定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体

头文件:定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体 #ifndef TIMERPOOL_H #define TIMERPOOL_H #include "rsglobal.h" #include "taskqueue.h" #incl

【IO流】FileOutputStream 字节输出流

FileOutputStream 字节输出流 1. 概述2. 作用3. 书写步骤4. 构造方法5. 换行写6. 续写7. 注意事项 1. 概述 FileOutputStream 是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流,该流用于将数据写入文件。 功能:FileOutputStream …