《移动Web前端高效开发实战》笔记4--打造单页应用SPA
路由是一个单页应用的核心,大部分前端框架都实现了一个复杂的路由库,包括动态路由,路由钩子,组件生命周期甚至服务器端渲染等复杂的功能。但是对于前端开发者而言,路由组件的核心是URL路径到函数的映射,了解了这个概念,便可以亲自实现一个简单的路由功能。
1.路由的原理
路由(Route)在前端可以理解为URL路径到函数的映射。当访问到一个特定的路径时执行特定的函数。另一个概念Router,用于管理各种Route,也就是匹配路径到函数的过程。
2.实现路由
Web端实现路由有两种技术模式。
- 基于Hash
- 基于History API
Hash路由的路径中会有一个“#”标志,即常说的锚点,前端向后端服务器发送请求时并不会解析Hash部分。路由实现通过监听页面window对象的hashChange事情,调用对应的函数,优点是兼容性好且完全脱离后端,缺点是因为带了Hash标志导致路由不直观。
History API通过监听HTML 5添加的popstate事件,URL格式跟传统的后端路由一致,这也是这种模式最大的优点。缺点是只有新型浏览器支持该特性,且需要后端路由配合,因为当用户访问一个History路由实现的路径时,页面仍会像后端请求,如果后端没有设置相应的路由实现逻辑,将返回404错误。
根据前端路由的概念,实现一个路由需要三个部分:存储路径和对应的回调方法,监听浏览器的相关事件,根据监听结果执行路径对应回调方法。根据这些要求,在开发的路由模块中,设计一个对象通过“Key-Value”模式存放路径和对应方法,再通过window对象监听popstate事件,根据当前的路径从路由对象中选择执行对应的方法,实现的代码如下:
function Router() {
this.routes = {}; // 存放路径和对应方法
this.route = function(path, callback) { // 实例化后通过调用来增加新的路由
this.routes[path] = callback; // 通过key-value存放callback
}
this.refresh = function() { // 通过一个函数调用最终的callback
var curUrl = location.hash.slice(1) || ‘/’; // 在Hash模式下获取路径
// var curUrl = location.pathname; // 在History API模式下获取路径
this.routes[curUrl](); // 调用最终的callback
}
this.init = function() { // 初始化方法
// 监听load事件对应第一次页面加载
window.addEventListener(‘load’, this.refresh.bind(this), false);
// Hash模式下监听hashchange事件
window.addEventListener(‘hashchange’, this.refresh.bind(this), false);
// History API模式下监听popstate事件
// window.addEventListener(‘popstate’, this.refresh.bind(this), false);
}
}
在实际开发过程中,需要调用route方法添加路由和对应方法,使用代码如下:
var router = new Router(); // 实例化Router方法
router.init(); // init来监听对应的全局事件
router.route(‘/’, function() { … }); // 用过route方法添加新的路由和对应方法
router.route(‘test’, function() {…});
这样就实现了一个功能简单的单页路由,对于使用了React或者Vue.js这样的复杂单页应用,路由组件还实现了一系列复杂的功能。本节只实现了一个简单的路由模块,其他复杂的功能可以参考React Router或者axios(Vue 2.0推荐路由)的源码。
更多信息关注:

《移动Web前端高效开发实战》笔记4--打造单页应用SPA的更多相关文章
- 就来推荐一本2018年研究的Web书《移动Web前端高效开发实战》
一线互联网公司Web前端团队实战经验总结,涵盖移动Web前端开发各个关键技术环节,包括移动开发核心技术.常用布局方案.MV*类新时代框架.预编译技术.性能优化.开发调试.混合式应用.单元测试.工程化等
- 《移动Web前端高效开发实战》笔记1——静态布局在移动端上的自适应
1.整体缩放 整体缩放可以用在营销活动页,营销活动可能因为设计美观需求必须使用背景图片而非背景色,因此需要考虑背景图适应屏幕大小.开发者可以用320像素的宽度作为基础宽度(高度可以固定),然后通过计算 ...
- 《移动Web前端高效开发实战》笔记3--代码检查任务
在项目的开发过程中,统一的代码风格对于项目的可协作性以及可维护性来说相当重要,因此可以采用一些插件来进行代码风格的检查. 本例中的源文件包含两类:Sass文件和采用ECMAScript 6规范的Jav ...
- 《移动Web前端高效开发实战》笔记2——使用Gulp构建一个ECMAScript 6和Sass应用
8.3.1 安装和配置 运行Gulp需要Node.js环境,请参看第二章内容搭建Node.js环境.使用NPM全局安装Gulp,命令如下: npm install gulp-cli –g 然后,在项目 ...
- 《Python高效开发实战》实战演练——内置Web服务器4
<Python高效开发实战>实战演练——开发Django站点1 <Python高效开发实战>实战演练——建立应用2 <Python高效开发实战>实战演练——基本视图 ...
- CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(1)设定背景图
技术的新发展,除计算机可以接入互联网之外,平板电脑.智能手机.智能电视等其他设备均可访问互联网.在多设备时代,构建多屏体验也不是听说的那么难. 但是这也增加了学习CSS的难度?不知道如何上手,只懂一点 ...
- 《移动WEB前端高级开发实践@www.java1234.com》——3
React Flux: Flux将一个应用分成四个部分. View: 视图层 Action(动作):视图层发出的消息(比如mouseClick) Dispatcher(派发器):用来接收Actions ...
- web前端学习之旅笔记01--HTML
web前端学习之旅笔记01--HTML HTML最容易上手,但也易忘,实际开发中有时需要查阅官方文档,小伙伴们别忘了哟! HTML 教程 (w3school.com.cn) HTML是网页的骨架负责页 ...
- 《Python高效开发实战》实战演练——基本视图3
在完成Django项目和应用的建立后,即可以开始编写网站应用代码,这里通过为注册页面显示一个欢迎标题,来演示Django的路由映射功能. 1)首先在djangosite/app/views.py中建立 ...
随机推荐
- window下的hosts
存放在windows系统目录中的\system32\drivers\etc下面. hosts文件是用来记录主机ip地址和主机名的对应关系,建立后就可以用主机名来访问主机,而不必记ip地址了.hosts ...
- C# 深化基本概念
关于IDisposable的Dispose方法 .Net中GC会自动回收托管资源, 对于非托管资源应该使用Dispose方法. 在使用Dispose方法时,应注意避免在Dispose内部中继续释放托管 ...
- kindle 3 webbrowser破解,
首先下载破解: http://183.60.157.10/down_group83/M00/06/31/tzydCk3MyHYAAAAAAUTLHFYI-wk8562757/webpatch.7z?k ...
- 贪心+等价转化 HDU 1489
等价转换,题意简单来讲如下:在一条直线均匀分布N个村庄,每个村庄要么买酒,要么卖酒,且村庄的买酒和卖酒供需平衡,总和为0,把k个单位的酒从一个村庄运到相邻的村庄需要k个单位的劳动力,输出最小的劳动力. ...
- MYSQL学习二 关于左连接
工作中有如下的SQL, 针对A.ID ='abcdefg', left join B和C两个表,来查找其他信息.就算是B和C中没有任何满足条件的记录,最后结果也肯定不是空.因为A.ID ='abc ...
- Redux API之applyMiddleware
applyMiddleware(...middlewares) 使用包含自定义功能的 middleware 来扩展 Redux 是一种推荐的方式.Middleware 可以让你包装 store 的di ...
- [bzoj2440]完全平方数(二分+mobius反演)
解题关键:由容斥原理得,num=1的倍数的数量−一个质数平方数(9,25,49...)的倍数的数量+两个质数的积平方数(36,100,225...)的数量−三个质数...... 这道题用莫比乌斯的正向 ...
- HDU - 3499 Flight 双向SPFA+枚举中间边
Flight Recently, Shua Shua had a big quarrel with his GF. He is so upset that he decides to take a t ...
- 解析Xml文件的三种方式
1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. clas ...
- java接口中成员变量和方法的默认修饰符(转)
Java的interface中,成员变量的默认修饰符为:public static final 所以我们在interface中定义成员变量的时候,可以 1:public static final St ...