实现一个路由器首先要确定路由的语法,最常见的语法是这样的(假设 host 是 www.imsun.net
):
/
:将匹配www.imsun.net
/example
:将匹配www.imsun.net/example
/example/:param
:将匹配www.imsun.net/example/some_text
,some_text
作为param
的值返回
/example/:param1/:param2
:将匹配www.imsun.net/example/some_text/other_text
,some_text
作为param1
的值返回,other_text
作为param2
的值返回
/example/p:param
:将匹配www.imsun.net/example/p001
,001
作为param
的值返回
基本语法大体就是这些,使用斜杠进行分隔,使用冒号表示参数。
为了正确地匹配这些语法,我选择了使用正则表达式,将路由语法转化成新的正则表达式,代码如下:
|
|
举个例子:
|
|
这样我们就根据路由返回了匹配信息和参数。
然后我们还要实现添加路由的功能,每条路由记录包括了路由规则和匹配时调用的函数。
|
|
然后是解析 URL 的函数,发生匹配时就调用对应的函数,并将匹配结果将作为参数传入。
|
|
这样路由部分就基本写完了。个人有一个开源项目 PRouter.js,打包实现了路由器和下一篇要讲的无刷新操作 URL 的功能。有能力的也可以直接去读 Backbone 源码的 router 部分。