详解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 相关文章推荐
jQuery验证Checkbox是否选中的代码 推荐
Sep 04 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
AngularJS基础 ng-copy 指令实例代码
Aug 01 Javascript
JS装饰器函数用法总结
Apr 21 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
详解JavaScript事件循环机制
Sep 07 Javascript
原生js实现无缝轮播图
Jan 11 Javascript
Node.js API详解之 os模块用法实例分析
May 06 Javascript
全面解析JavaScript Module模式
Jul 24 Javascript
node.js如何根据URL返回指定的图片详解
Oct 21 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 Javascript
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
PHP asXML()函数讲解
2019/02/03 PHP
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
详解Python3中yield生成器的用法
2015/08/20 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python多线程原理与用法详解
2018/08/20 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
央视元宵晚会主持串词
2014/03/25 职场文书
《画》教学反思
2014/04/14 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
Java实现二分搜索树的示例代码
2022/03/17 Java/Android