
2.2.3 将路由放到目录里
如果把路由定义都放在app.js里,那么当项目非常庞大的时候,路由会占用相当多的空间,无法进行分离、查找、定位。所以express-generator里给出的方案是将路由分离到routes目录里。
下面是经典的Express目录。

下面我们根据Express的目录,实现一个Koa版本的加载路由的例子。
(1)在终端里执行如下命令,创建routes目录。

在终端里执行如下命令,创建第一个路由index.js文件。

在index.js文件里键入以下代码,我们就完成了路由的创建。

将路由代码挂载到app.js上,操作如下。

至此,我们就完成了一个简单的根据目录来加载路由的例子。下面我们通过另一种方式来实现同样的功能。
(2)通过前缀方式,创建routes2目录,代码如下。

创建第一个路由index.js文件,在终端里执行命令如下。

在index.js文件里键入以下代码,完成路由创建。

将路由代码挂载到app.js上,操作如下。

上面两种方式的区别如下。
○ 使用routes目录时,我们需要在app.js里嵌入一个路由,然后通过该路由包裹routes里的路由,即router.use('/',index.routes());,最后再通过app.use (router.routes())挂载路由。
○ 使用前缀方式时,我们需要在app.js里直接使用routes2里的路由app.use(index.routes());,在具体的路由里通过router.prefix('/')来实现路径定义。
其实,下面这样的隐晦写法也可以实现上面的功能,但无法把路径放到中间件前面。

即使用router.use,而不用app.use,把路径写到路由里也比较麻烦,并且和Expresss的风格相差很大,所以这里推荐使用第一种写法。
将路由放到routes目录中,理解起来非常简单。app.js是不变的,而路由可能有多个,即路由是可变的,所以把可变的路由抽取到目录里,可以让路由定义更灵活,做到耦合程度更低。
总结一下,koa-router是与Express路由风格类似的路由开源项目,如果原本就会Express,则学习koa-router会觉得特别简单。当然,koa-router还有很多更强大的功能,限于篇幅,这里没有细讲。通过本节的学习,大家能理解什么是路由、为什么要把路由分离出去,以及路由常用方法就可以了。