报错Unexpected token '.' H5页面在低版本安卓和ISO手机上白屏了,bug修复过程

项目介绍

先来简单介绍一下项目,这是一个基于Vue框架的项目,项目使用的是vue3+ts。这个项目是需要集成在别的APP中的,也就是页面需要在APP中进浏览和操作。这个项目在我接手之前已经开发过一段时间了。项目的依赖都是最新的。

当时开发完成之后,我就开始用自己的iPhone12手机和安卓手机一切都很正常,但是用公司的低版本手机后打开页面之后什么内容也没有。同事的新手机都可以正常打开页面,所以到这里,我确定了这个白屏Bug的出现肯定跟手机的系统有关系 (低版本的手机测试版本iPhoneX 13系统和小米 11.0系统)

于是乎就查询了一下真机调式:

  • 在 手机端 浏览器使用什么进行调试呢? Eruda 手机调试面板工具

使用方式: github.com/liriliri/er...

直接在项目上的index.html使用:

js 复制代码
<script src="https://cdnjs.cloudflare.com/ajax/libs/eruda/2.4.1/eruda.min.js"></script>
<script>
  eruda.init();
</script>

只在开发环境使用:

js 复制代码
<% if(DEV){ %>
<script src="https://cdnjs.cloudflare.com/ajax/libs/eruda/2.4.1/eruda.min.js"></script>
<script>
  eruda.init();
</script>
<% } %>

问题

在运行项目时,抛出Unexpected token '.' 错误,如图:

浏览器控制台报错 我搜索了一下这个错误,猜测是因为项目中有一些es6语法不支持低版本手机,然后就怀疑es6扩展运算符 ...小米和iPhone低版本系统不支持这个这个运算符。后面就把有关于扩展运算符的代码先注释掉看看效果,发现还是白屏。奇怪?难道我写的代码全是错误的,我把这个页面代码全部注释掉 用vantUI库里面button按钮看看有没有效果,发现就是出现两个按钮,开心。想到这个问题还是好解决的,就把整个页面一点点测试,看看哪个位置报错,因为手机上没有具体的报错信息和位置

最后发现是封装的接口有问题,必须改成axios写法才可以显示页面,唉!不过也是发现原因所在,不过有一些其他代码逻辑也会报错必须要换一种写法,一遍一遍查找吧

js 复制代码
   axios.post('/managerClient/systemUser/delEngineer', { }, {
      headers: {
        tokenId: token,
      }
    })

最后成功显示出来,打包然后发布到测试环境中。告诉了测试人员测试一下,庆幸能解决问题,心里松了口气。但是测试说低版本手机不能显示,嗯哼!自己开发的时候能正常运行,打包后也没有做什么,我就把真机测试调式工具也弄进去,看看测试环境是报什么错误结果问题又来了,低版本iPhone手机空白页面没有报错???😨

最慌的时候,不报错还不显示页面,震惊! 就想拿小米手机看看有没有反应,求它显示报错吧😥!

芜湖,安卓手机竟然有报错信息。😂

报错信息

在运行项目时,抛出Unexpected token '?' 错误

庆幸有报错信息,我就又搜索了一下为什么会出现这个问题,从百度搜索的结果来看得到三种猜测: 配置babel降为es5看看 或者有可能没有对node_modules依赖转换,依赖优化 或者报错保留source map,看下是哪个文件抛出的异常定位到目标位置

想着先都试试看吧 配置Babel,不过看了这么多还是觉得太麻烦,但是发现了一个官方解决方案: 文章链接:解决Vue3.0+Vite项目打包后低版本浏览器兼容性问题 - 掘金 (juejin.cn)

使用@vitejs/plugin-legacy插件

1. 问题分析: 版本较低的浏览器不支持ES6的语法和新API,而Babel默认只转换新的JavaScript句法,不转换新的API,比如Proxy、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法都不会转码

  • 安装插件
css 复制代码
npm i @vitejs/plugin-legacy -D
  • 在vite.config.js中配置
js 复制代码
// vite.config.js
import legacy from '@vitejs/plugin-legacy'

export default {
  plugins: [
     legacy({
         targets: ['defaults', 'ie >= 11', 'chrome 52'],  //需要兼容的目标列表,可以设置多个
         additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
         renderLegacyChunks:true,
         polyfills:[
            'es.symbol',
            'es.array.filter',
            'es.promise',
            'es.promise.finally',
            'es/map',
            'es/set',
            'es.array.for-each',
            'es.object.define-properties',
            'es.object.define-property',
            'es.object.get-own-property-descriptor',
            'es.object.get-own-property-descriptors',
            'es.object.keys',
            'es.object.to-string',
            'web.dom-collections.for-each',
            'esnext.global-this',
            'esnext.string.match-all'
        ]
     })
  ]
}

试了第一个竟然可以显示了,到此完结撒花,总结一下:出现白屏的原因是因为使用的第三方库的包中使用了es6,然后因为第三方的包默认是没有被处理过的,所以在不支持es6的iPhone系统上就出现了白屏。解决的方式就是通过给vue.config.js的配置文件中plugins配置选项中添加

相关推荐
Your易元5 分钟前
设计模式-状态模式
java·前端·算法·设计模式
HaanLen2 小时前
React19源码系列之 Hooks (useState、useReducer、useOptimistic)
服务器·前端
yuanyxh5 小时前
《精通正则表达式》精华摘要
前端·javascript·正则表达式
小飞大王6665 小时前
简单实现HTML在线编辑器
前端·编辑器·html
Jimmy6 小时前
CSS 实现卡牌翻转
前端·css·html
百万蹄蹄向前冲6 小时前
大学期末考,AI定制个性化考试体验
前端·人工智能·面试
向明天乄6 小时前
在 Vue 3 项目中集成高德地图(附 Key 与安全密钥申请全流程)
前端·vue.js·安全
sunshine_程序媛6 小时前
vue3中的watch和watchEffect区别以及demo示例
前端·javascript·vue.js·vue3
电商数据girl7 小时前
【经验分享】浅谈京东商品SKU接口的技术实现原理
java·开发语言·前端·数据库·经验分享·eclipse·json
Senar7 小时前
听《富婆KTV》让我学到个新的API
前端·javascript·浏览器