这篇文章主要介绍“vue中路由切换出现白屏的问题怎么解决”,在日常操作中,相信很多人在vue中路由切换出现白屏的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中路由切换出现白屏的问题怎么解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联专注于企业全网营销推广、网站重做改版、古交网站定制设计、自适应品牌网站建设、H5场景定制、电子商务商城网站建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为古交等各大城市提供网站开发制作服务。
服务器部署配置问题
这个问题造成的白屏体现在:
首页可以正常浏览,但是------通过$router.push('/home')跳转页面 正常,然后刷新就是白屏或 404
本不想在文章加入这个问题和解决方案,因为官网已经提供了正确的部署姿势,(Vue 的路由模式自行查看文档),主要是针对HTML5 History模式:
const router = new VueRouter({
mode: 'history',
routes: [...]
})dev和build都没有问题,这个是肯定的,所以问题就出在服务器配置上,以nginx为例,正确的配置如下:
location / {
....
try_files $uri $uri/ /index.html; #重点
}Apache,原生 Node.js,IIS,Caddy,Firebase 主机
请查看
vur-router后端配置例子地址:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
如果你是使用脚手架初始化环境,可以跳过这部分。如果自己配置webpack,可以接着看确定做了如下配置
devServer: {
...
contentBase: false, //必须
historyApiFallback: true, //必须
...
},
entry: {
app: ['./src/main.js'],
vendors: ['vue', 'vue-router'] //注意这里
},
plugins: [
....
new HtmlWebpackPlugin({
...
chunks: ['vendors', 'app'], //注意这里,这里的chunks 要包含入口的 entry
})
]场景一:IE9(兼容性问题)
严格来说不是白屏的问题,应该说是兼容性问题,直接就是不支持,报错了,渲染无法执行造成的。解决方式就是
npm i babel-polyfill -D
然后在入口mian.js引入就完事了,就着么简单
import "babel-polyfill";
或者
//webpack
entry: {
app: ['babel-polyfill','./src/main.js'],
vendors: ['vue', 'vue-router']
},假如真的是
js兼容性问题,那么真的只是引入babel-polyfill或者在webpack入口加入babel-polyfill问题就能解决吗,其实不一定的,这个要看项目的使用情况。babel-polyfill不是万能的。那么如何排查兼容性问题呢(假如真的是兼容性问题)。因为我们在手机上直接调试,有些错误不会那么容易显而易见。我是这么调试的。(仅供参考!)
{{error}} ...
这里要说的是有些兼容性问题是bable-polyfill搞不定的。比如URLSearchParams
let data = new URLSearchParams();
for (var key in params) {
data.append(key, params[key]);
}那么肯定会报URLSearchParams is not undefined,然后,错误只在一些低端的机型,一些偶然的场合出错.加大了错误的排查。
以下可以解决URLSearchParams is not undefined
//# console npm i url-search-params-polyfill //# mian.js import 'url-search-params-polyfill';
场景二 :如下图
有人说是在iphone 5s或者6s上会出现这种问题,肯定不是手机的bug。于是我重现了场景,真的和设备无关

所以这个跟设备真的没有关系。知道问题所在,当然解决办法也有许多
方案一:暴力愚蠢型
//路由跳转前滚动条清零
document.body.scrollTop = document.documentElement.scrollTop = 0;
this.$router.push({ path: "/a/b/c" });方案二:可行但不可选型
//给router 加一个监听,一旦改变,执行清零,然后再跳转
let routers = new Router({.....})
routers.beforeEach(function (to, from, next) {
......
document.body.scrollTop = document.documentElement.scrollTop = 0
next()
})虽然可行,但是感觉着么干有点愚蠢。因为还有更好的写法,这个写法更佳优雅
方案三:最佳型
其实官方已经提供了当路由切换时,控制滚动位置的方式。scrollBehavior
使用方式如下:
const router = new VueRouter({
routes: [...],
scrollBehavior (to, from, savedPosition) {
// return 期望滚动到哪个的位置 { x: number, y: number } | { selector: string } |
}
})scrollBehavior方法接收to和from路由对象。第三个参数savedPosition当且仅当popstate导航(通过浏览器的前进/后退按钮触发) 时才可用。
所以假如要解决白屏的问题,可以着么干
const router = new VueRouter({
routes: [...],
scrollBehavior (to, from, savedPosition) {
return savedPosition || { x: 0, y: 0 }
}
})也就是说,当用户点击返回、前进的时候,页面会滚动到之前位置,(微信朋友圈的文章就是这样的,读一半返回,再进来接着刚才的位置阅读)
如果是新的page被mounted进来的时候,就重置为 0 。
完美的解决了这个问题。
但是这也是个问题,框架为什么不默认呢,假如自定义的时候可以overwirte。
我们根据版本号(或者hash)去控制缓存问题,当我们发布新版本,会发现html里面引用的版本号却是旧的版本号 ,这种情况是入口index.html文件被缓存了,很多时候我们设置禁止html文件被缓存,但依然会出现被缓存的情况。比如在头部加
一旦index.html被缓存了,之后我们使用了全量更新,也就是每次发版本之前会干掉之前的js和css文件,那么被缓存的index.html会无法加载之前旧的js,css还有一些其他的静态资源文件,而新的js和css则不会被加载,那么白屏就诞生了。
到此,关于“vue中路由切换出现白屏的问题怎么解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!