当前位置: 首页 > news >正文

vite-服务端渲染(ssr)项目线上频繁刷新(踩坑记录)

今天来分享一个我在公司修改之前前端留下来的项目的坑。来说说大致的一个经过把,我老板说这个项目是之前的一个前端做的,用的是ssr服务端渲染的技术,不过他项目在线上会一直频繁的刷新,据说他想破脑袋都想不出来,最终因为解决不了这个问题被老板劝退?😂,哈哈哈,其实并不是,我也不清楚啥子情况离职哈哈,接着我就想证明自己的逝力,想尝试去解决这个问题,如果不解决的话就得重新写一份这个代码。

项目目录结构

在这里插入图片描述
我当时第一眼看上去,这不就是传统的spa的vue项目吗

在这里插入图片描述
看了一眼,发现这个项目自己写了服务端,我就去看他的一个源码

服务端代码

在这里插入图片描述
看了一样,大概的代码逻辑就是使用vite创建了一个开发服务器,通过express去拦截特定url,通过fs读取默认的模板配置,再通过一个ssr_render的函数,去把所有路由下所有的组件合并成html,将这个html进行格式化,以及pretty格式化,最后返回一个html字符串。我看了下好像没有太大的问题,我就尝试在本地测试复现。

哎,好像本地是正常的,当时测完我就开心的以为事情解决了,然后通过nginx部署到线上,结果果然和老板描述的一样,会不断的频繁刷新页面

思考

接着我就进行了思考,本地不会,线上会,使用的nginx做的转发,那毫无疑问是nginx的问题把,然后我尝试从nginx配置上找原因

    server {listen 60080 proxy_protocol;server_name xxx;real_ip_header proxy_protocol;real_ip_recursive on;set_real_ip_from xxx.xxx.xxx.xxx;set_real_ip_from 127.0.0.1;location / {proxy_pass http://127.0.0.1:8191;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 如果使用 WebSocket,添加以下配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}}

我这个是内网项目,域名会先转发到我公网的nginx服务器再转发到我内网的ip上,我在网上测试了很多种方式,还是找不到问题。但是好像线上控制台看到了websocket报错
在这里插入图片描述
于是我去百度搜了很多nginx和websocket关联的一些文章,依旧无果。后面我觉得很奇怪,不应该是websocket的问题,因为我项目里面客服的前端socket连接代码全部注释掉了,怎么还会有websocket的报错,于是我又把问题进行了转移。

思考2

我在网络控制台去查看,发现每次自动刷新多了一个_vite_ping这个请求,我chat搜了一下_vite_ping 是 Vite 开发服务器用来检测客户端连接是否健康的请求。这是 Vite 内部机制的一部分,用于确保热模块替换(HMR)功能正常工作。我就思考了会不会是vite源码里面又使用websocket?接着我就去百度vite项目中频繁自动刷新页面的问题,果然就找到了相关的文章

感谢这两篇文章:
vite、vue3本地页面正常显示不刷新,外网穿透后页面不停刷新
vite项目 通过外网域名访问 无限刷新 的解决办法
来解释一下吧,在vite源码里面进行websocket连接的时候会带端口号,当我进行转发之后,实际上我域名是没有带端口的,它的访问就变成了域名:端口

在这里插入图片描述
第一篇文章是原理
第二篇文章是具体解决的方式

通过第二篇文章的处理方式他就不会加上端口去访问

最终解决方案

还是写一下把,在vite.config.js进行配置

import { defineConfig } from 'vite';
export default defineConfig({//...你自己的配置server: {hmr: {protocol: 'ws',host: '127.0.0.1'}},}

结语

每一次的踩坑都是成长,会让我不断的探索不断的寻求方式去解决问题,不仅是开拓大脑思维,也是积累经验,期待我可以变得更强大。最后这里还是需要鸣谢一个大佬,总是能帮我搜索到关键信息,搜索引擎这块我还是得再加强哈哈哈,加油!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • langchain新版本v0.2文档:tutorials(1)
  • 【Neo4j】实战 (数据库技术丛书)学习笔记
  • Ubuntu 22.04.4 LTS (linux) 安装certbot 免费ssl证书申请 letsencrypt
  • python条件
  • 【Android面试八股文】请描述一下 android 的系统架构?
  • WSL-Ubuntu20.04部署环境配置
  • Web 性能入门指南-1.1 网站速度与用户幸福感的心理学
  • 51单片机5(GPIO简介)
  • Go:基本变量与数据类型
  • Excel如何才能忽略隐藏行进行复制粘贴?
  • STM32MP135裸机编程:烧录程序到EMMC的方法
  • Redis 三大高可用模式:主从、哨兵、集群
  • frameworks 之FallbackHome
  • PMP–冲刺–总结--高频考点
  • 缺血性脑卒中的常见并发症
  • ----------
  • Angularjs之国际化
  • CAP理论的例子讲解
  • CentOS7 安装JDK
  • crontab执行失败的多种原因
  • ECMAScript入门(七)--Module语法
  • in typeof instanceof ===这些运算符有什么作用
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java Agent 学习笔记
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript学习总结——原型
  • Java比较器对数组,集合排序
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Promise初体验
  • React的组件模式
  • Vue2 SSR 的优化之旅
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 学习笔记TF060:图像语音结合,看图说话
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • zabbix3.2监控linux磁盘IO
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​iOS安全加固方法及实现
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #前后端分离# 头条发布系统
  • (11)MATLAB PCA+SVM 人脸识别
  • (AngularJS)Angular 控制器之间通信初探
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (六)vue-router+UI组件库
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (南京观海微电子)——COF介绍
  • (算法)前K大的和
  • (算法二)滑动窗口
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net 路由处理厉害了