现有route实现
现有的koajs下的route是其实就是middleware。
每一次的route.verb(xxx, fn);其实就相当于挂载了一个koa的中间件。
理解这一点,那么它的问题出来了:
一是搜索路径过长
为什么这么说呢?因为每一次路由都是一次顺序查找的过程。
用过程简单说明就是:
我分别注册了三个路由,A, B, C
然后我这个时候来了个请求是B,
那么,它会先经过A, 然后再到B。
特别是,这个时候来了一个路由D,那么,它的查找路径是: A => B => C 好了,发现没有,进入404处理。
这样一来,如果路由链非常长的话,在最后的路由那么将是一场漫长的查找路径。
二是配置繁琐
每一项你都要写对应的路由配置。
意味着功能有多少,路由就有多少。
三是路由维护困难
随着路由越来越多,如果你不熟悉项目的话,再或者路由写得很乱的话(事实上,这种情况非常容易发生)
你想快速定位一个路由,你还需要一个一个去找。
思考
针对这些,我们能不能做一些优化措施呢?
这也是我在思考的,所以就有了我写的koa-route-tree
核心思想
1. 路径即路由
如果有这么一个请求:GET /app/list
那么这个请求对应的处理函数就应该是:./controllers/app.js中的list函数。
2. 路径也是参数
如果有这么一个请求:GET /app/1
那么,app就是路由,1就是参数
对应的,就会找到controllers/app.js中的index方法,并把1作为第一个参数传入。
直观明了
看到上面,或许你就已经能大概理解我写的这个路由模式。
它的本质就是一个对象树依次向下查找的过程。
这也是我为什么路由名称中有一个tree的原因。
大家明白了么?
好,我再加几句。
关于restful模式
比如:GET /users/20/profile
就相当于调用的/controllers/users.js中的profile方法,并把20作为第一个参数传入。
等价于:/users/profile/20
关于VERB说明
除了GET请求,其他所有的正常请求都应该小写http method + 首字母大写的功能名。
比如:PUT /users/20/profile
就相当于调用了/controllers/users.js中的putProfile方法,并把20作为第一个参数传入。
最后
简单自我介绍一下,目前就职于猿辅导公司,公司前端业务一直用的node.js。koa-route-tree目前一直稳定运行在线上生成环境。
完了。更多信息请移步到:https://github.com/yss/koa-route-tree
这种路由模式就是ThinkPHP里边的那种吧,不好意思,然而360的前端7舞团已经产出ThinkJS了
如何体现的解决 搜索路径过长 的问题?
@JustforNode 对象查找。 就想我在文中说的,最后生成的route本质是一棵树(tree) 比如: ···js let controller = { api: { lessons: lessonFn } }
这个时候来了个请求:GET /api/lessons
那么它就会依次向下找到controller.api.lessons
koa竟然是这样搞的。。。