详解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和CSS速查手册
Aug 20 Javascript
js 动态文字滚动的例子
Jan 17 Javascript
JS预览图像将本地图片显示到浏览器上
Aug 25 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
AngularJS 2.0新特性有哪些
Feb 18 Javascript
AngularJS入门教程之控制器详解
Jul 27 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
JavaScript实现的搜索及高亮显示功能示例
Aug 14 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
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入门教程之数学运算技巧总结
2016/09/11 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python解决八皇后问题示例
2018/04/22 Python
Python魔法方法功能与用法简介
2019/04/04 Python
python Django 创建应用过程图示详解
2019/07/29 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
python的launcher用法知识点总结
2020/08/07 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
扩大国家免疫规划实施方案
2014/03/21 职场文书
支部组织生活会方案
2014/06/10 职场文书
大学英语专业求职信
2014/06/21 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
社区母亲节活动总结
2015/02/10 职场文书
中学教师个人总结
2015/02/10 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
创业计划书之物流运送
2019/09/17 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android