Uncaught SyntaxError: Unexpected token '<' (at 报错

  • Uncaught SyntaxError: Unexpected token '<' (at 报错已关闭评论
  • 81 次浏览
  • A+
所属分类:Web前端
摘要

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

发新版本导致

问题的根源是服务器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()       }     })