首页 > 其他分享 >Vue 项目报错Uncaught SyntaxError: Unexpected token < 刷新之后又可以继续访问问题解决

Vue 项目报错Uncaught SyntaxError: Unexpected token < 刷新之后又可以继续访问问题解决

时间:2024-08-19 15:17:02浏览次数:6  
标签:head Vue const url SyntaxError xhr 报错 页面

场景:

页面打开不操作,前端项目代码更新重新部署后(比如Jenkins发布部署)页面不刷新,操作页面(点击打开弹窗、切换菜单等),页面没有反应,控制台报错 Uncaught SyntaxError: Unexpected token <。这个问题偶现,只有在项目重新部署后会出现,页面刷新后就恢复正常

 问题原因:

在前端项目未更新之前打开的页面,在前端项目更新后,hash码更新导致js请求路径改变,而页面依然以之前的路径请求js资源,必然会请求不到。如果资源请求不到一般会报404问题,但是服务器配置了404页面,对于请求不到的资源会返回一个404页面,在script标签里解析html文件,就会报错Unexpected token <

解决:

报错时给用户提示,用户点击确认后刷新页面;目前还没找到catch这种错误的方法,但是,可以模拟这种错误的出现。js文件是以script标签的形式动态添加到head标签里的,可以给head绑定DOMNodeInserted这个事件在有子元素插入的时候触发,可以在回调里拿到插入的标签名以及标签的属性包括src。这样在所有js资源加载时我们都可以在回调事件里拿到资源路径,然后在创建一个请求去请求该资源

代码:

在app.vue中,添加如下代码。对于报错的js文件,我们会在xhr.responseText获取到一个以尖括号开头的html,这时候我们就可以知道当前资源路径失效,就可以在此时做一些处理

<script>
export default {
  name: "App",
  created() {
    const head = document.getElementsByTagName('head')[0];
    head.addEventListener('DOMNodeInserted', e => {
      // 获取标签名
      const type = e.target.tagName;
      // 获取资源路径
      const url = e.target.src;
      if (type === 'SCRIPT' && url) {
        let xhr = new XMLHttpRequest();
        xhr.open('get', url);
        xhr.onload = () => {
          const text = xhr.responseText;
          if (text.indexOf('<') === 0) {
            this.$confirm("检测到新版本已发布,刷新后加载最新内容!",'提示', {
              confirmButtonText: '刷新',
              type: 'error',
              closeOnClickModal: false,
              closeOnPressEscape:false,
              closeOnHashChange:false,
              showCancelButton: false,
              showClose: false
            }).then(res => {
              window.location.reload(true);
            })
          }
        }
        xhr.send();
      }
    })
  }
};
</script>

问题:使用如上代码可以解决Uncaught SyntaxError: Unexpected token <问题,但随之控制台出现下面错误;

DOMNodeInserted 是一个已经被废弃的 Mutation Events 接口,用于监听DOM树中节点的插入事件;推荐使用 MutationObserver 接口,MutationObserver性能更优

 使用 MutationObserver 重写代码:

<script>
export default {
  name: "App",
  created() {
    const head = document.getElementsByTagName('head')[0];
    // 定义DOM树变化后的回调
    const callBack = (mutationsList, observer) => {
      for (const mutation of mutationsList) {
        if (mutation.type === 'childList' && mutation.addedNodes && mutation.addedNodes[0] && mutation.addedNodes[0].tagName === "SCRIPT") {
          const url = mutation.addedNodes[0].src;
          console.log(url);
          if (url) {
            let xhr = new XMLHttpRequest();
            xhr.open('get', url);
            xhr.onload = () => {
              const text = xhr.responseText;
              // console.log(text);
              if (text.indexOf('<') === 0) {
                this.$confirm("检测到新版本已发布,刷新后加载最新内容!",'提示', {
                  confirmButtonText: '刷新',
                  type: 'error',
                  closeOnClickModal: false,
                  closeOnPressEscape:false,
                  closeOnHashChange:false,
                  showCancelButton: false,
                  showClose: false
                }).then(res => {
                  window.location.reload(true);
                })
                return false;
              }
            }
            xhr.send();
          }
        }
      }
    }
    // 配置项
    const config = {attributes: false, childList: true, subtree: false};
    // observer观察器
    const observer = new MutationObserver(callBack);
    // 开始观察
    observer.observe(head, config);
    // 停止观察
    // observer.disconnect();
  }
};
</script>

参考:

https://blog.csdn.net/FortheOne/article/details/123073336

https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

标签:head,Vue,const,url,SyntaxError,xhr,报错,页面
From: https://www.cnblogs.com/Console-LIJIE/p/18367340

相关文章

  • 基于django+vue开发区流动人口服务系统的设计与开发【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着经济的快速发展和城市化进程的加速,开发区作为经济增长的重要引擎,吸引了大量流动人口涌入。这些流动人口为开发区的发展贡献了重要力量......
  • 基于django+vue君汇华府小区物业管理系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,住宅小区作为城市居民生活的重要载体,其管理水平和服务质量直接影响到居民的生活品质与幸福感。君汇华府小区作为当地......
  • idea低内存报错
    问题描述:解决办法:各种解决办法通过大模型搜索已经给出。由于各种原因,我们一般采用方法一修改内存配置解决。下边带大家手搓一遍:①通过设置菜单调整内存大小②编辑配置文件......
  • Vue自定义轮播图
    目录前言代码效果演示详细代码实现思路轮播图实现代码组件使用代码前言    汇总一个最近写出来的效果,最新的设计稿里面要求实现一个轮播图,原本使用的Element-UI提供的轮播图不是很适配,所以选择自定义一个使用。文中附带代码实际效果演示视频。 ......
  • 基于django+vue抗疫互助平台系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠疫情爆发以来,全球公共卫生体系面临前所未有的挑战。疫情不仅考验着医疗系统的应对能力,也凸显了社会在物资调配、信息传递及心理支持......
  • 基于django+vue康养管理系统的设计与实现【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着人口老龄化的加速和生活水平的提高,人们对健康管理和养老服务的需求日益增长。传统的康养模式已难以满足个性化、高效化的服务需求,特别......
  • java.lang.IllegalArgumentException: Comparison method violates its general contr
    代码:publicstaticvoidwbsSort(List<SendMessageEntity>sendMessageEntityList){Collections.sort(sendMessageEntityList,(o1,o2)->{StringwbsCode1Temp=o1.getWbsCode();StringwbsCode2Temp=o2.getWbsCode();......
  • vue 数组和对象更新检测
    vue如果要更新v-for渲染出来的数据,它是不会操作dom元素的。而是就地更新需要操作的元素,并且确保它们在每个索引位置正确渲染。为了给vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有的元素,你需要为每项提供一个唯一Keyattribute;<divv-for="(item,index)i......
  • Vue——el-option下拉框绑定,value为数字和字符串区别
    Vue——el-option下拉框绑定1、正常使用v-for进行遍历下拉框内容,如果需要增加一个自定义的值,则加一个el-optionel-option用法:参数说明类型可选值默认值value选项的值string/number/object——label选项的标签,若不设置则默认与v......
  • 基于SpringBoot+Vue+uniapp的吃了吗管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......