一、需求

egg.js 在配置路由的过程中如果将所有的路由全部放在 app/router.js 里面,难免显得太过于臃肿了。

而 egg 本身提供了两种方案用于解决路由映射过多的问题。

二、通过 require 解决

这种方式无非是将不同的路由在不同的文件中配置,然后在去 require,而我在 koa-generator-postbird 这个 koa2 的脚手架中也是这么规范的。

要通过 require 解决路由映射过多的问题,则创建一个新的文件夹 app/router 来存放其他的路由文件。

下面示例通过创建 app/router/home.jsapp/router/news.js 来区分两种路由,创建路由的方式和在 router.js 中创建路由的方式一样。

1、app/router/home.js

module.exports = app => {
  const {router,controller} = app;
  router.get('/',controller.home.index);
  router.redirect('/index','/');
};

2、app/router/news.js

module.exports = app => {
  const {router,controller} = app;
  router.get('/news',controller.news.index);
  router.redirect('/news/list','/news');
}

3、合并路由

最后在 app/router.js 中引入两个文件的路由即可。

需要注意实际上是对方法的调用,传入 app 参数。

app/router.js

module.exports = app => {
  require('./router/home')(app);
  require('./router/news')(app);
};

4、效果:

省略了 controller 的代码。

22.jpg

11.jpg

三、使用 egg-router-plus

上面通过 require 解决路由映射过多的问题的时候,实际上只是将路由定义在不同文件中而已,形式上的分开。

而很多 PHP 框架如 Laravel 往往可以通过 namespace 区分不同的路由,在路由配置上非常好用。

使用 egg-router-plus 和 上面 require 的方式并不冲突,在单独的路由文件如 app/router/news.js 中使用插件即可。

1、安装插件

yarn add egg-router-plus

2、启用插件

config/plugin.js

exports.routerPlus = {
  enable:true,
  package:'egg-router-plus'
};

3、配置路由

app/router/news.js 中的路由举例,我想让所有的路由中均以 /news 作为前缀,而不需要每个路由后面写上这个前缀。

app/router/news.js

module.exports = app => {
  const {router,controller} = app;
  const newsRouter = router.namespace('/news');
  newsRouter.get('/',controller.news.index);
  router.redirect('/news/list','/news');
} 

其他代码不变,则效果和之前一样。

4、存在的问题

目前 egg-router-plus 是存在一个问题的,文档中也有说明。

尽管使用 egg-router-plus 配置了 namespace 的路由,但跳转还是建议使用 app.router 进行跳转。

可以看到我在上面的代码中,跳转的时候,使用了 router.redirect('/news/list','/news/),而不是使用 newsRouter.redirect(from,to)

存在的问题是当使用 newsRouter.redirect(from,to) 的时候,from 会遵循 namespace 的前缀,但是 to 不会遵循 namespace 的前缀。

比如官方给的示例:

const subRouter = app.router.namespace('/sub');

// will redirect `/sub/go` to `/anyway`, not `/sub/anyway`
subRouter.redirect('/go', '/anyway');

尽管使用了 subRouter.redirect(),但是最终跳转规则是从 /sub/go 跳转到 /anyway,而不是 /sub/anyway,目前这个问题尚未被解决。