【前端疑难杂症】Vue 项目报错Uncaught SyntaxError: Unexpected token <

场景复现:

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

问题分析:

控制台报错可以看出,报错信息来自script,

报错信息很简单,51.chunk.866cbe17.js、163.chunk.866cbe17.js这两个js文件在Unexpected的地方出现了尖括号<。这两个js文件是webpack打包后的js文件,在本地调试是无法复现这个问题的。组件资源是动态加载的,在head标签里我们可以看到已经加载的很多js/css文件,在用户操作界面触发加载新组件时,该组件的js也会以script标签的形式动态添加到head标签里,如下图:

图1

图2

 图1是页面刚打开时,head标签里的资源,图2是页面点击操作后加载了新的组件资源。

报错后刷新页面,重复原来的操作,发现js文件后面的hash码变了:

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

 解决思路:

        问题的根源是服务器js文件更新了,页面还在请求以前的js文件。可以保留之前webpack打包的文件,但是时间久了文件体积会积累到很大,而且从产品角度更希望用户访问新的资源。所以最好的解决方式是在报错时给用户提示,用户点击确认后刷新页面。前端如何能catch到这种错误?

        目前还没找到catch这种错误的方法,但是,可以模拟这种错误的出现。

        js文件是以script标签的形式动态添加到head标签里的,可以给head绑定DOMNodeInserted这个事件在有子元素插入的时候触发,可以在回调里拿到插入的标签名以及标签的属性包括src。这样在所有js资源加载时我们都可以在回调事件里拿到资源路径,然后在创建一个请求去请求该资源,代码如下:

    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.$modal.info({
              title: '检测到有新的版本发布,需要刷新页面以访问最新内容',
              width: 350,
              okText: '确定',
              onOk() {
                location.reload()
              }
            })
          }
        }
        xhr.send()
      }
    })

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

总结:

        操作页面时报错Unexpected token <,刷新后页面正常,这是因为页面请求的js文件资源找不到,服务器返回一个html,在script标签里解析这段html内容,就会报错Unexpected token <。js文件资源找不到是因为代码更新重新打包,导致js文件路径中的hash码改变造成的。

PS:        

        如果是一打开页面就报错Unexpected token <,那应该是路径配置问题,检查一下webpack的publicPath配置,这种场景跟上面提到的不是同一个问题。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Uncaught SyntaxError: Unexpected token )是一个常见的JavaScript错误,它表示在代码中出现了意外的括号闭合符号")"。该错误通常发生在代码中的某个函数或语句中,括号的数量不匹配或语法不正确导致解析错误。 根据引用和引用中的内容,这个错误可能与前端项目的部署和代码更新有关。当页面重新部署后,可能出现一些代码语法错误或括号不匹配的问题,导致解析错误。解决这个问题的方法是检查代码中的括号和语法是否正确闭合,并确保代码更新后没有遗漏的括号。 此外,根据引用的内容,如果在Vue项目中引入静态资源并在打包后发布到正式环境时出现此错误,也可能是由于资源引用路径不正确导致的。可以检查资源的引用路径是否正确设置,确保静态资源能够正确加载。 总结起来,解决Uncaught SyntaxError: Unexpected token )的方法包括:检查代码中的括号和语法是否正确闭合,确保代码更新后没有遗漏的括号;检查引入静态资源的路径是否正确设置,确保资源能够正确加载。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决 Uncaught SyntaxError: Unexpected token ‘‘ 解决方法](https://blog.csdn.net/HeXinT/article/details/125082562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【前端疑难杂症Vue 项目报错Uncaught SyntaxError: Unexpected token ](https://blog.csdn.net/FortheOne/article/details/123073336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值