Vue单页面在ios10系统上出现白屏的bug

一个bug
你用Vue做了一个单页面应用,它在一切设备上都工作正常,但是突然有一天,你的测试和你说,这个网站在iOS 10上跑不起来,怎么办?

于是你打开你电脑上的Chrome浏览器,工作正常;打开Safari浏览器,工作正常;打开iOS 11手机,工作正常;打开各种安卓手机,工作正常。但是在iOS 10的手机上,不论是微信浏览器,还是Safari浏览器,都只能看见一个白白的屏幕。

于是你把手机连上电脑,在电脑端的Safari里,看到了如下的错误:

SyntaxError: Cannot declare a let variable twice: ‘e‘.
可是你没有写过这样的代码,你怎么可能把一个名为e的变量定义两次?你打开代码,看到了这样美丽的代码:

let e = e => {
    console.log(e);
    for (let e of [1, 2, 3])
        console.log(e);
};
虽然这段代码看上去比较奇怪,但是语法上有任何问题吗?哥就愿意定义一个名为e的函数,而这个函数的唯一入参名称也为e,并且哥的for循环体里还愿意再定义一个名称为e的变量,es6的变量作用域允许我们这样做,此e和彼e互不干扰,不对吗?况且很显然,这段代码不是人写的,而是我们在执行npm run build的时候编译产生的。

其实我们都没有错,我们也没写错,uglify也没搞错,错的是Safari本身。他们在第十七万一千零四十一号bug中承认了自己的错误:

We incorrectly throw a syntax error when declaring a top level for-loop iteration variable the same as a parameter
当你定义一个与参数同名的for循环迭代变量时,我们错误地认为这是一个语法错误。
看,多么谦逊的态度。所以你也不用太纠结于一个白屏幕,只要找到解决方法就好了。方法其实很简单:

进入build文件夹;
找到webpack.prod.conf.js文件;
在UglifyPlugin的定义里添加关于mangle的选项,使它变成下面这个样子:
    new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false
        },
        mangle: { // 加入这玩意儿即可
          safari10: true
        }
      },
      sourceMap: config.build.productionSourceMap,
      parallel: true
    }),
然后这个世界就太平了。

为了避免所有这些不必要的麻烦,我给vue-cli提的一个PR已被接受,在工具里缺省加入了这个选项,这样大家以后就不会遇到这个问题了。

关于这个bug的问题描述在这里,解决方案在这里,给vue-cli提的PR在这里,供深挖细掘的人参考。

另一个bug
实际上,除此之外,还有另外一个bug也会影响到vue网页在iOS 10上的展现,特别是当你用到广为流传的Swiper插件的时候。这是因为Swiper插件中用到了ES6的语法a = b ** c,a是b的c次方,而iOS 10的Safari里不认识这样的语法,认为这是一个错误,所以你需要让Swiper经过babel的包装,而缺省状态下babel是不对node_modules里的模块进行编译的。相关的issue见这里。

解决方法是在项目根目录下新建一个文件vue.config.js,在里面添加如下语句:

module.exports = {
  chainWebpack: config => {
    config.rule(‘js‘).include.add(/node_modules\/(dom7|swiper)\/.*/)
  }
}
至止为止,通常情况下你的vue网页已经可以完美地在iOS 10上的Safari里展现了。

原文地址:https://www.cnblogs.com/hjptopshow/p/9848908.html

时间: 2024-08-21 05:58:59

Vue单页面在ios10系统上出现白屏的bug的相关文章

fullpage在vue单页面当中使用会出现的问题以及解决办法

在 vue 单页面当中发现fullpage会报错,报错信息大概意思为,fullpage不允许初始化多次. 解决办法,在使用fullpage的组件跳转路由进入销毁组件之前的生命周期的时候对fullpage也进行销毁,这样就可以重新初始化一个fullpage组件了. $.fn.fullpage.destroy('all'); 在beforeDestroy这个生命周期执行,就可以了

vue单页面程序

vue单页面程序 gitHub地址:https://github.com/lily1010/vue_singlePage 举个栗子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue-router.js" type="text/javascript&qu

处理 Vue 单页面应用 SEO 的另一种思路

vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plugin形成更优的配合) 单页面应用在前端正大放光彩.三大框架 Angular.Vue.React,可谓妇孺皆知.随着单页面应用的普及,人们在感受其带来的完美的用户体验,极强的开发效率的同时,也似乎不可避免的要去处理 SEO 的需求. 本文主要针对 vue 2.0 单页面 Meta SEO 优化展开介

处理 Vue 单页面 SEO 的另一种思路

vue-meta-info 官方地址: https://github.com/monkeyWang... (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plugin形成更优的配合) 单页面应用在前端正大放光彩.三大框架 Angular.Vue.React,可谓妇孺皆知.随着单页面应用的普及,人们在感受其带来的完美的用户体验,极强的开发效率的同时,也似乎不可避免的要去处理 SEO 的需求. 本文主要针对 vue 2.0 单页面 Meta SE

nwjs解决页面透明化,启动时显示白屏的问题

这些天在弄nwjs还好能访问外网,可以看到官方的文档,要不然真是欲哭无泪了,找不到相关的文档解决不了问题.主要说说怎么页面透明化的时候,出现白屏一闪问题吧.主要工具: AngularJS+node+nw.js 来开发和传输数据显示的方式 官方文档: 在html页面实现: <body style="background-color:rgba(0,0,0,0)"> 在package.json 文件中实现 "window": { "frame&quo

vue 单页面应用实战

1. 为什么要 SPA? SPA: 就是俗称的单页应用(Single Page Web Application). 在移动端,特别是 hybrid 方式的H5应用中,性能问题一直是痛点. 使用 SPA,没有页面切换,就没有白屏阻塞,可以大大提高 H5 的性能,达到接近原生的流畅体验. 2. 为什么选择 vue? 在选择 vue 之前,使用 reactjs 也做过一个小 Demo,虽然两者都是面向组件的开发思路,但是 reactjs 的全家桶方式,实在太过强势,而自己定义的 JSX 规范,揉和在

Vue单页面应用

单页面应用指一个系统只加载一次资源,然后下面的操作交互.数据交互是通过router.ajax来进       行,页面并没有刷新:<1>在vue搭建的环境里面怎么有没有公用的css和js?如果有是怎么引用的? 有公用的css和js,有两种引用的方法:(要深刻理解单页面应用程序哦,单页面就是引入后在哪里都能使用) 1.全局公共引用样式和js文件 2.组件的引入 单页面的应用优点: 1.分离前后端关注点,前端负责界面显示,后端负责数据存储和计算.不会把前后端的逻辑混杂在一起: 2.减轻服务器压力,

vue单页面应用刷新网页后vuex的state数据丢失的解决方案

1. 产生原因其实很简单,因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值. 2. 解决思路一种是state里的数据全部是通过请求来触发action或mutation来改变 一种是将state里的数据保存一份到本地存储(localStorage.sessionStorage.cookie)中 很显然,第一种方案基本不可行,除非项目很小或者vuex存储的数据很少.而第二种可以保证刷新页面数据不丢失且易于读取. 3. 解决过程首先

vue单页面条件下添加类似浏览器的标签页切换功能

在用vue开发的时候,单页面应用程序,而又有标签页这种需求,各种方式实现不了, 从这个 到这个,然后再返回上面那个 因为每个标签页的route不一样,导致组件重新渲染的问题,怎么都不知道如何实现......... 简直郁闷到爆炸,后来和同学谈起的时候,说起生命周期这个才恍然大悟, 对于vue的生命周期,因为用的少,本身多用的是created,mounted这两个,都忘记beforeDestroy这些了,然后抓瞎了好久 实现方式是 每次销毁组件之前   缓存数据    能够用到的是 this.$d