一 发新版本导致
问题的根源是服务器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() } })