vuepress复杂网站开发后记

news/2024/5/1 16:25:31/文章来源:https://blog.csdn.net/baijiafan/article/details/129878908

前段时间写了一篇vuepress2的开发文章,很多前端小伙伴看,给了我很多鼓励,写这个的原因是我们的百家饭OpenAPI平台是用vuepress搭建的,最开始选型是因为开始的时候觉得只是一个介绍性的产品网站,所以选型用了类似vue的vuepress,但是随着百家饭站点开发的深入,vuepress的很多问题给我们造成了很多的麻烦,以至于我们目前的架构变成了这样一个复杂结构:

|---/api/home (工作台页面,vue开发)
|---/page/{id} 富格式评论页面,lit开发,后端做服务器渲染
|---其他页面,vuepress开发

可以看到,除了原有的一些静态内容页面之外,我们原本使用vuepress开发的工作台页面被移出来,使用vue做了SPA,并和其他页面使用链接进行跳转。

带完整OpenAPI编辑功能的工作台页面使用vuepress开发有很多困难的地方

 

而评论页面(类似blog页面)也被拿出来单独使用lit进行了开发。

因为内容是动态服务器生成,使用了Golang Template功能,也无法使用vuepress

 

这样做的原因有哪些呢?

vuepress严重的ssr问题

vuepress使用ssr来将md文件、模板文件统一编译成html文件,实现了将md文件作为html文件的目的,这种编译过程实际上是利用了ssr来完成的,md编译过程就是一个ssr编译的过程,造成了几个常见的问题。

编译不成功

经常性的会出现因element-plus或其他插件不支持ssr导致的编译不成功问题。

Object.remove undefined问题

如果顺利的通过了编译,也有可能在运行期出现一些莫名其妙的Object.remove时的undefined问题,这些问题通常是和vuepress重新绘制页面时出现的问题有关,使得解决问题十分麻烦,更要命的是这种问题只出现在编译后的实际运行阶段,也就意味着你通常只能在线上的测试或者生产环境遇到这个问题,隐藏很深。

出现这个问题,最直观的后果就是页面混乱。部分组件因绘制出错导致位置或显示错误,还有更麻烦的情况,就是这种情况一旦发生,因为vuepress劫持了浏览器的history进行类vuerouter的动态刷新,使得这种错误无法使用刷新页面进行重置,必须要手动跳转到其他页面再刷新才能完成修正,这样这种问题无法被普通用户解决,可以说一旦出现问题就是致命问题。

在之前的版本中,我们通常会尝试性地将部分组件通过<ClientOnly>包裹地方式解决这个问题,但是最近的更新因调整了整体风格,整体修改量偏大,过程中没有及时做编译预览,出现问题之后已经无法通过回溯来进行错误定位。

最终导致我们不得不在这个页面中放弃使用vuepress。

hydration mismatch问题

vuepress使用ssr其实是在编译前阶段,所以vuepress的ssr其实只能算ssg(server side generation),其生成结果不能修改,否则在实际运行时,就会出hydration mismismatch问题,因为这个问题,导致无法和实际后台服务器配合做动态内容渲染。在做blog页面时,我们尝试了很多种解决方案,都无法绕开这个问题,后来在这个页面选择使用了lit重写,这也是为什么最近我们开了lit教学文章的原因。

lit的好处是他重复使用了最新版本浏览器的shallow dom功能和web component功能,没有使用vdom,动态部分都在js里,而html部分没有特殊的格式要求,那我就可以利用后台模板技术,将html部分进行动态内容替换,而再结合js去做进一步的客户端功能增强。

<body><el-header></el-header><blog-panel userName="{{ .Message.Username }}" authorIcon="{{.UserIcon}}" id="{{.Message.Id}}"created="{{ .Message.CreatedAt }}" apiId="{{ .Source.Id}}" userId="{{.Message.UserId}}"subject="{{.Message.Subject}}"><div slot="content">{{ .Message.Content | raw }}</div><div slot="api-desc">{{.Source.Description | raw}}</div><span slot="api-name">{{.Source.Name}}</span></blog-panel>
</body>

这篇文章也是通过总结我们最后的网站架构,给希望使用vuepress的小伙伴做个功能选型参考:

  1. 当网站功能主要是内容导向的时候,可以使用vuepress做主体框架
  2. 在部分功能较强的页面,不建议在vuepress中使用太重的第三方插件做深入研发,直接考虑vue做spa会避免很多的开发中的坑。
  3. 当需要做动态内容渲染的时候,按以下原则做选择,
    1. 如果不需要考虑搜索引擎优化,直接使用json获取数据做渲染是一个方案
    2. 如果需要,可能必须要使用其他的框架,vuepress是无法支持的。
  4. 多项目文件最后通过url路径做跳转即可,相互之间不影响

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

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

相关文章

折叠洗衣机亚马逊美国站UL60335报告如何办理?

洗衣机是利用电能产生机械作用来洗涤衣物的清洁电器&#xff0c;按其额定洗涤容量分为家用和集体用两类。中国规定洗涤容量在6千克以下的属于家用洗衣机&#xff1a;家用洗衣机主要由箱体、洗涤脱水桶&#xff08;有的洗涤和脱水桶分开&#xff09;、传动和控制系统等组成&…

绝不告诉你!黑客如何攻击你的Facebook账户

Facebook是全球使用最广泛的社交网络之一。然而&#xff0c;这也意味着黑客会不断寻找攻击用户并窃取他们信息的漏洞。在这篇文章中&#xff0c;我将介绍一些黑客攻击Facebook账户的常见方法&#xff0c;并提供一些保护自己的提示。 1.假冒登录页面 黑客们可以伪造Facebook的…

mycat2 安装 jDK

文章目录进入解压的JDK路径查看完整路径1、卸载系统自带的OpenJDK以及相关的java文件输入java-verison可以看到系统自带的OpenJDK版本信息。命令说明&#xff1a;rpm   管理套件-qa   使用询问模式&#xff0c;查询所有套件grep  查找文件里符合条件的字符串java   查找…

Melis4.0[D1s]:4.测试笔记 - 内嵌的显示命令

文章目录1.配置将显示测试源码包含进工程&#xff08;默认是包含了&#xff09;2.不要启动melis桌面系统3.开始测试3.1 disp 命令3.1.1 disp不带参数时&#xff0c;打印显示信息&#xff1a;3.1.2 disp -c 0 8 测试4种颜色3.2 disp_layer_cfg 命令3.3 disp_mem 对显示内存写入内…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

如何远程连接SQLServer数据库

如何远程连接SQLServer数据库 准备工作 1.打开 选中如下的连接方式 连接成功后就会出出现 2.连接成功后&#xff1a;右键设置属性 安全性设置&#xff1a;如下图所示 设置连接属性&#xff1a; 设置完成之后点击完成&#xff01;&#xff01;&#xff01; 3.打开 启动sqlSe…

分布式系统事务一致性解决方案

开篇 在OLTP系统领域&#xff0c;我们在很多业务场景下都会面临事务一致性方面的需求&#xff0c;例如最经典的Bob给Smith转账的案例。传统的企业开发&#xff0c;系统往往是以单体应用形式存在的&#xff0c;也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技…

一、MySQL 数据库设计

一、MySQL 数据库设计 1.1 为什么需要设计数据库 良好的数据库设计 降低应用程序的开发难度具备高效的查询效率具备良好的扩展性 糟糕的数据库设计 出现数据操作异常、修改复杂、数据冗余等问题影响程序的性能&#xff0c;甚至会导致程序崩溃 数据库设计是对数据库中实体以…

利用 Visual Studio 2022 加速虚幻引擎应用开发

自上次官宣对虚幻引擎的支持后&#xff0c;我们的开发团队一直在努力构建新一代的虚幻引擎集成功能。今天&#xff0c;我们很高兴地向你展示我们所开发的一系列用于提升游戏开发效率的各种新特性。在下面的文章中&#xff0c;你将了解如何查看流式日志&#xff0c;查看 Visual …

【redis】数据同步:主从库如何实现数据一致

如果redis实例宕机了&#xff0c;在恢复期间&#xff0c;无法服务新来的数据存取请求。 redis高可靠性&#xff1a; 数据尽量少丢失&#xff08;AOF、RDB&#xff09;服务尽量少中断&#xff08;增加副本冗余量&#xff09;-将一份数据同时保存在多个实例上 redis提供了主从模…

系统分析师高频错题集

软件架构设计---软件架构评估 信息系统评价要素包括&#xff1a;功能、成本、可靠性、可用性、存储容量、效率、响应时间等。不同的应用&#xff0c;首选评价指标是不同的&#xff0c;如银行系统&#xff0c;应该重点考虑系统的可用性和可靠性。 软甲架构设计---软件架构评估 …

android BatteryHistorian使用

android BatteryHistorian使用 Batterystats 工具和 Battery Historian 脚本的基本用法和工作流程Batterystats 是包含在 Android 框架中的一种工具&#xff0c;用于收集设备上的电池数据。您可以使用 adb 将收集的电池数据转储到开发计算机&#xff0c;并创建一份可使用 Batt…

了解Mysql

存储引擎 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 InnoDB和MyISAM的区别 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;。虽然性…

2017百度世界大会 爱奇艺创始人CEO龚宇演讲速记

2017百度世界大会如期而来。&#xff08;好像不对&#xff0c;Robin 说往年都是夏季办&#xff09;那就改成千呼万唤始出来。 以下是爱奇艺创始人CEO龚宇演讲实录&#xff0c;小编全文呈上&#xff0c;请各位查收&#xff1a; 各位来宾&#xff0c;大家好&#xff01; 很高兴今…

深力科本周知识小课堂【分立半导体】晶体管(上)基础知识,微电子人的狂欢

深力科本周知识小课堂【分立半导体】晶体管&#xff08;上&#xff09;基础知识&#xff0c;微电子人的狂欢 今天&#xff0c;东芝深力科电子将为大家说明一下双极晶体管和绝缘栅双极晶体管。 晶体管大致分为三种类型&#xff1a;双极型、场效应型和绝缘栅双极型。 双极晶体管…

Linux下的JavaEE开发(xftp传输安装、wget安装)

目录 一&#xff1a;jdk的安装&#xff08;xftp传输安装&#xff09; 二&#xff1a;Tomcat的安装&#xff08;不需要配置环境变量&#xff09; 三&#xff1a;Idea的安装&#xff08;不需要配置环境变量&#xff09; 四&#xff1a;Mysql的安装&#xff08;wget网络安装&am…

千寻驰观亮相公路行业权威年会,开启2023全国路测第一站

千寻驰观亮相中国公路学会养护与管理养护与管理分会第十二届学术年会2023年3月28日至29日&#xff0c;在中国公路学会养护与管理养护与管理分会第十二届学术年会上&#xff0c;千寻位置面向行业全面展示了千寻驰观-道路智能巡检系统“车道级”目标位置估计、像素级的面积计算、…

linux系统编程(5)--进程间通信

1.进程间通讯概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的&#xff0c;没有关联&#xff0c;不能在一个进程中直接访问另一个进程的资源。 但是&#xff0c;进程不是孤立的&#xff0c;不同的进程需要进行信息的交互和状态的传递等&#xff0c;…

ASP.NET动态Web开发技术第3章

第3章C#编程基础一.预习笔记 1.C#语言概述 using指令表示引用命名空间 //&#xff1a;表示单行注释 /* */&#xff1a;表示多行注释 2.变量和常量 Camel和Pascal 3.数据类型 值类型&#xff1a;简单类型、结构类型、枚举类型&#xff0c;其中简单类型又包含了整数类型&a…

箱线图详细介绍及绘制箱线图和复现箱线图的步骤详解

目录 一、箱线图介绍二、python函数三、利用数据绘制箱线图四、拓展——未知数据复现箱线图一、箱线图介绍 箱线图(Box Plot),也称为盒须图、箱形图、盒式图,是一种用于显示数据分布情况的图表。箱线图通常由五条线组成,包括最小值、第一四分位数、中位数、第三四分位数和…