路由、前端路由和后端路由

一、路由

简单来说,路由就是URL到函数的映射。
在 Web 服务的程序中,不同路径对应着各自的处理逻辑,程序会把请求交给路径所对应的处理逻辑,这样就完成了一次「路由分发」,这个分发就是通过「路由」来完成的。
以前路由都是后台做的,通过用户请求的url导航到具体的html页面,前端路由就是通过配置js文件,把这个工作拿到前端来做。
简单的说,路由是根据不同的 url 地址展示不同的内容或页面

二、后端路由:

对于服务器来说,当接收到客户端发来的HTTP请求,会根据请求的URL,来找到相应的映射函数,然后执行该函数,并将函数的返回值发送给客户端。对于最简单的静态资源服务器,可以认为,所有URL的映射函数就是一个文件读取操作。对于动态资源,映射函数可能是一个数据库读取操作,也可能是进行一些数据的处理,等等。

三、前端路由

前端路由的映射函数通常是进行一些DOM的显示和隐藏操作。当访问不同的路径的时候,会显示不同的页面组件。前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的。

1.基于hash实现的前端路由

在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器。如果我们把上面例子中提到的 3 个页面用 hash 来实现的话,它的 URI 规则中需要带上 #

1 http://10.0.0.1/
2 http://10.0.0.1/#/about
3 http://10.0.0.1/#/concat

Web 服务不会解析 hash,也就是说 # 后的内容 Web 服务都会自动忽略,但是 JavaScript 是可以通过 window.location.hash 读取到的,读取到路径加以解析之后就可以响应不同路径的逻辑处理。(重点)

window.onhashchange = function() {
  var hash = window.location.hash
  var path = hash.substring(1)
  switch (path) {
    case '/':
      showHome()
      break
    case '/users':
      showUsersList()
      break
    default:
      show404NotFound()
  }
}

hash有以下几个特性:

  • hash仅仅是客户端的一个状态,也就是说,当向服务器发请求的时候,hash部分并不会发过去。
  • hash值的改变,都会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制hash的切换。

触发hsah变化的两种方式:

  • 通过a标签,并设置href属性,当用户点击这个标签后,URL就会发生改变,也就会触发hashchange事件了:
<a href="#srtian">srtian</a>
  • 直接使用JavaScript来对loaction.hash进行赋值,从而改变URL,触发hashchange事件:
location.hash="#srtian"

2.基于history API实现的前端路由

history 是 HTML5 才有的新 API,可以用来操作浏览器的 session history。基于 history 来实现的路由可以和最初的例子中提到的路径规则一样。

1 http://10.0.0.1/
2 http://10.0.0.1/about
3 http://10.0.0.1/concat

例子:

window.history.pushState(state, title, url)

其中state和title可以为空,url中填上/ 、/about、/concat

前端路由的使用场景

前端路由更多用在单页应用上, 也就是SPA, 因为单页应用, 基本上都是前后端分离的, 后端自然也就不会给前端提供路由。

前端路由优缺点

  • 优点
    1)从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,然后服务器再响应请求,这个过程肯定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来说会有相当大的提升。
    2)在某些场合中,用ajax请求,可以让页面无刷新,页面变了但Url没有变化,用户复制到的地址不能反映这些变化,用前端路由做单页面网页就很好的解决了这个问题,即把变化反映在url中。
  • 缺点
    使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存。(查资料做进一步了解)

四、Vue-router库

页面中所有的内容都是组件化的,只需要把路径跟组件对应,在页面中把组件渲染出来。
1.页面实现:在vue-router中, 它定义了两个标签 和来对应点击和显示部分。 就是定义页面中点击的部分, 定义显示部分。
2.js中配置路由:首先要定义route,一条路由的实现,他是一个对象,由path和component组成。

这里的两条路由,组成routes:

const routes = [
    {// 首页
        path: '/',
        component: () => import('src/pages/home/index.vue'),
    },
    {// 首页更多功能
        path: '/functionManage',
        component: () => import('src/pages/home/functionManage.vue'),
    },
]

创建router对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。
router.js文件中

const router = new VueRouter({
    routes,
})

配置完成后,把router 实例注入到 vue 根实例中。
main.js文件中

window.vm = new Vue({
    router,
})

执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 标签所在的地方。
前端路由是通过改变URL,在不重新请求页面的情况下,更新页面视图。

参考:

https://zhuanlan.zhihu.com/p/24814675
https://www.cnblogs.com/yuqing6/p/6731980.html
//www.greatytc.com/p/d2aa8fb951e4
https://juejin.im/post/5b08c9ccf265da0dd527d98d

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 本文由浅入深观摩vue-router源码是如何通过hash与History interface两种方式实现前端路由...
    world_7735阅读 1,326评论 0 10
  • 1.什么是路由 简单举例说明,假如我们有一台提供 Web 服务的服务器的网络地址是:10.0.0.1,而该 Web...
    郑无穷大阅读 445评论 0 0
  • 一、什么是前端路由 在web开发的过程中,路由的使用是必不可少的,这里的路由不是指我们日常生活中的路由器,但是...
    Zeroacexy阅读 14,114评论 0 55
  • 路由 根据不同的url地址,展示不同的内容或页面。 前端路由 定义:在单页面应用,大部分页面结构不变,只改变部分内...
    焦迈奇阅读 994评论 1 3
  • 关于秋招的一些感想 最近一段时间忙着秋招,一路经历了阿里终面挂,美团终面挂等等,感觉自己有点苦逼(尤其是因为没HC...
    Srtian阅读 22,561评论 6 21