详解一次Vue低版本安卓白屏问题的解决过程


Posted in Javascript onMay 30, 2019

因为业务需要一定要使用安卓4.4的webview浏览页面,测试的时候发生了白屏问题,很自然想到使用babel转换部分ES6语法.

Babel 转换 Promise 和 Symbol ES6语法的配置

# 两项都需要放到生产依赖
npm install babel-polyfill --save
npm install es6-promise --save
// main.js
import 'babel-polyfill';
import Es6Promise from 'es6-promise';

Es6Promise.polyfill();
// babel.config.js

process.env.VUE_CLI_BABEL_TRANSPILE_MODULES = true;

module.exports = {
 presets: [
  [
   '@vue/app',
   {
    useBuiltIns: 'entry',
    polyfills: [
     'es6.promise',
     'es6.symbol',
    ],
   },
  ],
 ],
 plugins,
};
// 使用vue cli3构建的vue项目
// vue.config.js
module.exports = {
 transpileDependencies: ['webpack-dev-server/client'],
 chainWebpack: (config) => {
 config.entry.app = ['babel-polyfill', './src/main.js'];
 }
}

但结果还是白屏,那么决定使用Babel把语法转换成安卓4.4以上,应该没有问题了。

// .browserslistrc
>= 1%
last 1 major version
not dead
Android >= 4.4

不同运行环境下的严格模式

结果还是白屏,查阅众多网络文章,同样没有很好的答案...

百思不得其解,无奈之下在 Android Studio 上下载了个4.4的模拟器,在内置浏览器上打开页面,使用 Chrome 远程调试 Android 上的浏览器, 在 Chrome 上地址栏输入 chrome://inspect/#devices 选择相应模拟器设备的 inspect 就会弹出 console 调试。

没想到发现报错是 Uncaught SyntaxError: Duplicate data property in object literal not allowed in strict mode ,意思是在严格模式下的对象里不能重复定义相同属性,但是这在现代浏览器(Chrome)的严格模式上运行是没有问题的,其结果是后定义的属性值会覆盖前定义的属性值,例如:

'use strict'
var test = {
 a: 1,
 a: 2,
}
// 结果test会定义成 => {a: 2}

但是为什么会这样呢,在打包后的报错js文件里将其格式化后发现是组件的属性重复定义了,

<van-nav-bar
 title="标题"
 left-text="返回"
 right-text="按钮"
 left-arrow
 @click-left="onClickLeft"
 @click-right="onClickRight"
 :left-arrow="true"
/>

我的项目里 Vant 的 left-arrow 被我重复定义了,组件会被转义成js:

详解一次Vue低版本安卓白屏问题的解决过程

所以说不同运行环境的严格模式还是会有不一样的结果,

在网上查了下资料总结了严格模式下的几种错误:

1. 我上面遇到的对象属性重复定义

2. 在函数声明中相同的参数名

SyntaxError: Strict mode function may not have duplicate parameter names.

例如:

function fix(a,b,a) {   
   return a+b;   
 }

3. 用前导0声明8进制直接量

SyntaxError: Octal literals are not allowed in strict mode.

var a = 012;

4. 在eval中声明变量、重新声明、删除或重写eval和arguments这两个标示符

SyntaxError: Assignment to eval or arguments is not allowed in strict mode.

例如:

'use strict';
eval('var foo = 2');

5. 用delete删除显示声明的标识符、名称和具名函数

SyntaxError: Delete of an unqualified identifier in strict mode.

例如:

function temp() { 
 'use strict'; 
 var test = 1; 
 delete test; 
}

6. 代码中使用扩展的保留字,例如 interface , let , yield , package , private 等

SyntaxError: Unexpected strict mode reserved word

7. 使用了 with

SyntaxError: Strict mode code may not include a with statement

8. 函数中不可访问caller、callee以及arguments

例如:

function foo(){
 'use strict';
 foo.caller;  // TypeError
 foo.arguments; // TypeError
 arguments.callee; // TypeError
}
foo();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
[推荐]javascript 面向对象技术基础教程
Mar 03 Javascript
ExtJs事件机制基本代码模型和流程解析
Oct 24 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
浅谈javascript对象模型和function对象
Dec 26 Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
JavaScript生成随机字符串的方法
Mar 19 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
Bootstarp 基础教程之表单部分实例代码
Feb 03 Javascript
基于iview的router常用控制方式
May 30 #Javascript
深入了解js原型模式
May 30 #Javascript
js逆向解密之网络爬虫
May 30 #Javascript
Vue.js中的组件系统
May 30 #Javascript
Vue+Django项目部署详解
May 30 #Javascript
了解重排与重绘
May 29 #Javascript
小程序如何构建骨架屏
May 29 #Javascript
You might like
php中的实现trim函数代码
2007/03/19 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
thinkphp缓存技术详解
2014/12/09 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
Python批量更改文件名的实现方法
2017/10/29 Python
对Python3中的input函数详解
2018/04/22 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python retrying模块的使用方法详解
2019/09/25 Python
Python with标签使用方法解析
2020/01/17 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
自动化专业本科毕业生求职信
2013/10/20 职场文书
合伙经营协议书
2014/04/18 职场文书
自查自纠整改报告
2014/11/06 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
班级管理经验交流材料
2015/11/02 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL