详解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 Easyui Tree的oncheck事件实现代码
May 28 Javascript
再说AutoComplete自动补全之实现原理
Nov 05 Javascript
javascript获取ckeditor编辑器的值(实现代码)
Nov 18 Javascript
整理Javascript事件响应学习笔记
Dec 02 Javascript
AngularJS实现元素显示和隐藏的几个案例
Dec 09 Javascript
jquery获取文档高度和窗口高度汇总
Jan 25 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
vue 函数调用加括号与不加括号的区别
Oct 29 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
javascript实现计算器功能详解流程
Nov 01 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中去掉字符串首尾空格的方法
2012/05/19 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
javascript整除实现代码
2010/11/23 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
全面了解python字符串和字典
2016/07/07 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python3大文件解压和基本操作
2017/12/15 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
详解Python文件修改的两种方式
2019/08/22 Python
python pillow模块使用方法详解
2019/08/30 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
Django admin组件的使用
2020/10/24 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
三年大学自我鉴定
2014/01/16 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
股东合作协议书
2014/09/12 职场文书
2014年党小组工作总结
2014/12/20 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书