【摘要】 vue-router的history模式的服务端支持

示例代码托管在:http://www.github.com/dashnowords/blogs

博客园地址:《大史住在大前端》原创博文目录

history路由

history模式是指使用HTML5的historyAPI实现客户端路由的模式,它的典型表现就是去除了hash模式中url路径中的#。对于前端路由基本原理还不了解的读者可以看这篇博文【javascript基础修炼(6)——前端路由的基本原理】。在使用Vue-Router时开启history模式非常容易,只需要在实例化路由时传入mode:'history'配置项即可,但缺少服务端支持时,基于historyAPI的路由无法从url地址栏直接访问指定页面,这个很容易理解,因为url地址栏里输入后回车相当于发送了一次GET请求,那么不带#的路由路径就和普通的API接口是一样的,既然服务端并没有定义这样的接口,那直接访问时出现404页面就很正常了。

官方示例

官方提供了很多处理这种场景的方式,以node.js版本的处理方案为例:

const http = require('http')
const fs = require('fs')
const httpPort = 80http.createServer((req, res) => {fs.readFile('index.htm', 'utf-8', (err, content) => {if (err) {console.log('We cannot open "index.htm" file.')}res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})res.end(content)})
}).listen(httpPort, () => {console.log('Server listening on: http://localhost:%s', httpPort)
})

不难看出,它的处理思路就是所有请求都强制重定向到首页,相当于服务端屏蔽了访问资源不存在的情况,而将路由的工作留给客户端自己去处理,这样启用了history模式的前端路由在直接定位到子页面时就不会报错了。

Express中间件

express工程中使用connect-history-api-fallback中间件来处理后端路由的场景,它的使用方式非常简单:

var history = require('connect-history-api-fallback');
var express = require('express');var app = express();
app.use(history());

源码也只有120行(地址:connect-history-api-fallback中间件源码 ),很容易阅读,基本逻辑是只将满足一些特定条件的请求进行重定向,也就是将路由请求和API请求区分开,重定向的规则可以自定义,路由请求的判断条件包括:

  • GET请求

  • headers.accept为text/html*/*(设置为application/json或非字符串时会记录错误日志);

核心逻辑就是82-85行的:

rewriteTarget = options.index || '/index.html';
logger('Rewriting', req.method, req.url, 'to', rewriteTarget);
req.url = rewriteTarget;
next();

也就是如果匹配到自定义的重定向规则就使用自定义场景,否则就使用/index.html作为默认值,然后重写req.url属性,接着进入下一个中间件执行其他逻辑。

客户端兜底404

当服务端重定向后,如果没有进行SSR的同构路由定制,对于所有路由请求都会返回index.html页面,此时如果需要使用404页面,就需要在客户端路由中设定一个优先级最低的兜底路由,由于优先级的缘故,它不会影响其他精确匹配的路由配置:

const router = new VueRouter({mode: 'history',routes: [{ path: '*', component: NotFoundComponent }]
})

作者:华为云云享专家大史不说话

Vue-Router中History模式【华为云分享】相关推荐

  1. vue router中hash模式和history模式的区别

    面试问答     hash 模式与 history 模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...

  2. vue router 原生html,Vue router 使用 History 模式导致页面请求 404

    vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不想要很丑的 hash,我们可以用路由的 his ...

  3. 解决vue router使用 history 模式刷新后404问题

    因为我们的应用是单页客户端应用,当使用 history 模式时,URL 就像正常的 url,可以直接访问http://www.xxx.com/user/id,但是因为vue-router设置的路径不是 ...

  4. 面试考问Vue Router 的路由模式,这个回答令我直接出局!

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  5. 你真的理解 Vue Router 的路由模式吗?

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  6. 面试考问Vue Router 的路由模式,这个回答令我直接出局~

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  7. 【我的物联网成长记7】物联网主流通信协议解读【华为云分享】

    [摘要] 当今物联网的主流通信协议是CoAP/LWM2M协议和MQTT协议,本文将会为您分别解读这些协议的工作方式,了解它们的特点,助您选择最适合您的设备的通信协议. 通信协议又称为传输协议,用于定义 ...

  8. vue react 路由history模式刷新404问题解决方案

    vue react 路由history模式刷新404问题解决方案 参考文章: (1)vue react 路由history模式刷新404问题解决方案 (2)https://www.cnblogs.co ...

  9. vue项目全局配置微信分享_Vue项目history模式下微信分享总结-个人文章-SegmentFault思否...

    每回遇到微信分享都是一个坑,目前的商城项目使用vue开发,采用history的路由模式,配置微信分享又遇到了很多问题,最后终于解决了,现将解决的过程分享一下. 原文https://justyeh.to ...

最新文章

  1. SIGPIPE导致cronttab和shell脚本等工作异常
  2. iOS一个类可以关联多个nib文件
  3. Elasticsearch-02CentOS7安装elasticsearch-head插件
  4. 什么是电源正激和反激? 正激和反激有什么区别特点?如何快速区分
  5. 小米10之后摩托罗拉Edge+也要用一亿像素相机,还有3.5耳机孔
  6. 【PL/SQL】触发器示例:记录加薪
  7. 关于Libra的6个核心问题及其监管原则
  8. 北斗导航 | 基于最小二乘残差法与奇偶矢量法的RAIM算法(附代码)
  9. ubuntu中用gimp 将psd文件分解
  10. Sql 中text类型字段判断是否为空
  11. 百思不得姐(4.5.6)最新版高仿
  12. get请求获得传递参数
  13. Peewee 使用手册
  14. 移动硬盘出现好多类似5b823bbe980da233a005c83a\update的文件,0字节,删不掉
  15. Office 如何添加Adobe Acrobat虚拟PDF打印机
  16. Objective中调用Swift代码
  17. TP5.1导入Excel表格,支持自动筛选字段,支持验证字段
  18. ESP32基础应用之ESP32与阿里云物联网平台实现数据互传(MQTT协议)
  19. python中文讨论组_python - 中文名字随机生成器
  20. 企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器

热门文章

  1. “啁啾”看完这篇再不懂,放弃吧……
  2. base64码通过http传输 +号变 空格 以及 图片编码后字符串较长导致POST提交失败 问题解决...
  3. ThreadPoolExecutor解析
  4. hadoop-02-关闭防火墙
  5. phpExcel与jq的ajax
  6. PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
  7. C++----练习--string输入输出
  8. ASP.NET验证码的实现
  9. mysql数据库无限分类_php+mysql数据库实现无限分类的方法
  10. Linux基础——操作系统框架