详解Vue路由History mode模式中页面无法渲染的原因及解决


Posted in Javascript onSeptember 28, 2017

Vue下路由History mode导致页面无法渲染的原因

用 Vue.js + vue-router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。

一般开发的单页应用的URL都会带有#号的hash模式,因为整个应用本身而言就只有一个HTML,其他的都是通过router来渲染。如果因为业务需要,或者单纯是觉得带#号不美观,那么可以使用history模式,简单而言就是在router的配置文件index.js中添加如下一行代码:

history: mode

没错,这样URL不再会有#号,你会发现整个地址栏回到了你熟悉的那个样子,不过,接下来介绍的就非常的重要了,可能很多刚入门的新人或多或少都会遇见这么一两个坑…

页面无法渲染

这里以我写的一个项目为例子,当我开启history模式的时候,我并没有对路由进行任何处理,在Dev阶段一切都是正常的,可是打包之后,访问项目路径:

sdp.driver.com/driver/

会发现页面一片空白,但是静态文件都能够正常的引用,因为使用了YII中的模块,所以除了域名之外,还会带有driver模块名。一般很多人创建的项目都放在了根目录下面,也就是:

sdp.driver.com

这样的一种形式,没问题。可是如果配置了模块,或者放置在了子文件夹下面,那么就会出问题。其实,这是因为router无法找到路径中的组件,所以也就无法渲染了。只需要修改router中的index.js,在每个path中加上你项目名称就行了,这样就能够成功了。

详解Vue路由History mode模式中页面无法渲染的原因及解决

最后的页面效果:

详解Vue路由History mode模式中页面无法渲染的原因及解决

404错误

在History mode下,如果直接通过地址栏访问路径,那么会出现404错误,这是因为这是单页应用(废话)…其实是因为调用了history.pushState API 所以所有的跳转之类的操作都是通过router来实现的,解决这个问题很简单,只需要在后台配置如果URL匹配不到任何静态资源,就跳转到默认的index.html。具体配置如下:

Apache

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteRule ^index\.html$ - [L]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule . /index.html [L]
</IfModule>

nginx

location / {
 try_files $uri $uri/ /index.html;
}

Node.js (Express)

关于每次点击链接都要刷新页面的问题

众所周知,开发单页应用就是因为那丝般顺滑的体验效果,如果每次点击都会刷新页面…

出现这个的原因是因为使用了window.location来跳转,只需要使用使用router提供的方法,就能够解决这个问题:

在main.js中配置中将router绑定到全局

Vue.prototype.router = router;

之后都使用如下的方式来控制跳转

this.router.push('driver/service');

好啦,这次关于Vue路由的“坑”就介绍到这里了,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 异步调用框架 (Part 3 - 代码实现)
Aug 04 Javascript
javascript天然的迭代器
Oct 29 Javascript
浅谈jQuery构造函数分析
May 11 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
layui table设置前台过滤转义等方法
Aug 17 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 Javascript
vue项目中使用vue-layer弹框插件的方法
Mar 11 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 #Javascript
详解基于vue-router的动态权限控制实现方案
Sep 28 #Javascript
node.js学习之断言assert的使用示例
Sep 28 #Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 #Javascript
node.js学习之事件模块Events的使用示例
Sep 28 #Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 #Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 #Javascript
You might like
php中的时间处理
2006/10/09 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
angularjs路由传值$routeParams详解
2020/09/05 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python中的自省(反射)详解
2015/06/02 Python
python操作redis的方法
2015/07/07 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
Python实现在线音乐播放器
2017/03/03 Python
django admin 添加自定义链接方式
2020/03/11 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Spy++的使用方法及下载教程
2021/01/29 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
活动邀请函范文
2014/01/19 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
如何用Python搭建gRPC服务
2021/06/30 Python
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis