zoukankan      html  css  js  c++  java
  • Vue-Router中History模式【华为云分享】

    【摘要】 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 = 80
    
    http.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 }
     ]
    })

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

  • 相关阅读:
    封装格式---FLV---文件格式解析
    高并发服务器---基础----IO模式和IO多路复用
    nginx---如何实现轻量级和高并发
    nginx---基础介绍
    H.264---SPS和PPS
    机器学习---算法---朴素贝叶斯
    机器学习---算法---Adaboost
    流媒体传输协议---STUN---基础
    H.264---指数哥伦布编码
    【linux】vim编辑器快捷键使用方法
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165235.html
Copyright © 2011-2022 走看看