# 路由规范 ::: warning 警告 这个规范仍在制定过程中,可能会随着时间推移而发生改变,请记得多回来看看! ::: 在编写新的路由时,RSSHub 会读取文件夹中的: - `router.js`注册路由 - `maintainer.js`获取路由路径,维护者 - `radar.js`获取路由所对应的网站,以及匹配规则: - `templates` 渲染模版 **以上文件为所有插件必备** ├───lib/v2 │ ├───furstar │ ├─── templates │ ├─── description.art │ ├─── router.js │ ├─── maintainer.js │ ├─── radar.js │ ├─── someOtherJs.js │ └───test │ └───someOtherScript ... **所有符合条件的,在`/v2`路径下的路由,将会被自动载入,无需更新`router.js`** ## 路由示例 参考`furstar`: `./lib/v2/furstar` 可以复制该文件夹作为新路由模版 ## 注册路由 `router.js` 应当导出一个方法,我们在初始化路由的时候,会提供一个`@koa/router`对象 ### 命名规范 我们会默认将所有的路由文件夹名字附加在真正的路由前面。路由维护者可以认定自己获取的就是根,我们会在附加对应的命名空间,在这空间底下,开发者有所有的控制权 ### 例子 ```js module.exports = function (router) { router.get('/characters/:lang?', require('./index')); router.get('/artists/:lang?', require('./artists')); router.get('/archive/:lang?', require('./archive')); }; ``` ## 维护者列表 `maintainer.js` 应当导出一个对象,在我们获取路径相关信息时,将会在从这里调取开发者信息等 - key: `@koa/router` 对应的路径匹配 - value: 数组,包含所有开发者的 Github Username Github ID 可能是更好的选择,但是后续处理不便,目前暂定 Username ### 例子 ```js module.exports = { '/characters/:lang?': ['NeverBehave'], '/artists/:lang?': ['NeverBehave'], '/archive/:lang?': ['NeverBehave'], }; ``` `npm run build:maintainer` 将会在`assets/build`下生成一份贡献者清单 ## Radar Rules 书写方式: **我们目前要求所有路由,必须包含这个文件,并且包含对应的域名 -- 我们不要求完全的路由匹配,最低要求是在对应的网站,可以显示支持即可。这个文件后续会用于帮助 bug 反馈。** ### 例子 ```js module.exports = { 'furstar.jp': { _name: 'Furstar', '.': [ { title: '最新售卖角色列表', docs: 'https://docs.rsshub.app/shopping.html#furstar-zui-xin-shou-mai-jiao-se-lie-biao', source: ['/:lang', '/'], target: '/furstar/characters/:lang', }, { title: '已经出售的角色列表', docs: 'https://docs.rsshub.app/shopping.html#furstar-yi-jing-chu-shou-de-jiao-se-lie-biao', source: ['/:lang/archive.php', '/archive.php'], target: '/furstar/archive/:lang', }, { title: '画师列表', docs: 'https://docs.rsshub.app/shopping.html#furstar-hua-shi-lie-biao', source: ['/'], target: '/furstar/artists', }, ], }, }; ``` `npm run build:radar` 将会在`/assets/build/`下生成一份完整的`radar-rules.js` ## Template 我们目前要求所有路由,在渲染`description`等带 HTML 的内容时,**必须**使用 art 引擎进行排版 art 说明文档: 同时,所有模版应该放在插件`templates`文件夹中 -- 后续我们会以此提供自定义模版切换 / 渲染等需求 ### 例子 ```art
{{ if link !== null }} {{name}} {{ else }} {{name}} {{ /if }}
``` ```js const { art } = require('@/utils/render'); const renderAuthor = (author) => art(path.join(__dirname, 'templates/author.art'), author); ``` ## ctx.state.json 插件目前可以提供一个自定义的对象,用于调试 -- 访问对应路由 +`.debug.json`即可获取到对应内容 我们对这个部分格式内容没有任何限制,完全可选,目前会继续观察这个选项的发展方向