前端路由

Posted by Mars . Modified at

前端路由相关

一、页面路由的历史

1. 早期:路由由服务端控制

流程: 客户端发起http请求 -> 服务端根据请求url匹配不同的资源(不同html) -> 返回请求数据 -> 客户端渲染显示

好处:

  • 直接生成html,seo友好;
  • 首屏渲染快;

首屏时间(白屏时间): 从输入url按下回车页面任意元素加载出来的时间。

缺点:

  • 服务器压力大。每次请求都需要处理+响应;、
  • 前后端深度耦合,开发协同流程混乱;

2. 现代:SPA单页面应用+前端路由

单页: 单个html文件。

一个html文件,通过前端路由+ajax等技术,实现无刷新路由(更新页面)。

好处:

  • 无需刷新;
  • 加载过的资源无需重复加载,因为都在一个页面内;
  • 只需向服务器请求必要资源,服务器压力小;
  • 前后端分离开发;

缺点:

  • SEO不友好,搜索引擎爬虫无法获取页面信息;
  • 没有提前生成html,需要现场发请求,初次加载首屏渲染时间长;
  • 前端逻辑复杂度增加;

二、前端路由的实现原理

1. location.hash

1.1 hash是什么

hash就是页面url中#后面的部分。

1.2 hash路由的特点

  1. 如果发生http请求,hash部分不会发送给服务器;
  2. hash部分改变,不会导致页面刷新;
  3. hash的改变,会导致浏览器访问历史中添加一条记录,可以通过浏览器的返回、前进按钮来访问前一、后一页面;
  4. hash改变,会触发window上的hashChange事件。

1.3 更改页面hash方式

  1. location.hash
  2. a标签的href = '#xxx';

1.4 监听hash变化的方式

通过window对象的hashChange事件监听。每次hash变化都会触发hashChange事件。

2. history

2.1 history对象的方法和事件

  1. history.forward(); 前进一步;
  2. history.back();后退一步;
  3. history.go(num); 正数前进num步,负数后退num步;
  4. history.pushState(state, title, path);在浏览记录最后添加一个历史记录;
  5. history.replaceState(state, title, path);替换当前历史记录;

pushState/replaceState 的参数:

  1. state, 是一个对象,是一个与指定网址相关的对象,当 popstate 事件触发的时候,该对象会传入回调函数;
  2. title, 新页面的标题,浏览器支持不一,一般传入null;
  3. url, 页面的新地址。

pushState和replaceState的特点:

  • 不会触发popState事件,也不会刷新页面;
  • 会将当前的页面href替换为最新加入的url(域名+path)
  • 需要手动触发popState事件,才能更新页面;

2.2 history监听的事件

history监听popState事件,以在页面url变化的时候监听变化,做出响应。

触发popState事件的五个操作:

  1. 点击浏览器后退按钮;
  2. 点击浏览器前进按钮;
  3. JS执行history.forward();
  4. JS执行history.back();
  5. JS执行history.go();

3. hash路由和history路由之间的区别

  1. hash 有#符号,不美观。而history没有;
  2. hash 的url中#部分内容不会给服务端, history的所有url内容都会给服务端;
  3. hash 通过 hashchange 监听变化,history 通过 popstate 监听变化(监听事件不同)。
Keywords: JavaScript
previousPost nextPost
已经有 1000000 个小伙伴看完了这篇推文。