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 }
     ]
    })

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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165235.html
Copyright © 2011-2022 走看看