参考了一些项目结构,对之前从用KOA2开发的项目 提取出来的脚手架进行了一下改造。Github上有很多Koa2的脚手架,大多数都差不多,相比如
Think.js
、Egg.js
这些封装得很完整的框架这些脚手架适用于一些比较简单的项目,当然可以一开始就使用Think.js
或者Egg.js
来开发项目,但是经常折腾一下还是有好处的
脚手架项目地址:
1、Controller改造
把router
单独提取到独立的文件,Controller
只保留业务逻辑相关的代码
改造前的Controller
import ApiError from '../error/ApiError'import ApiErrorNames from '../error/ApiErrorNames'export default async router => { router.get('/api/userInfo/:id', userInfo).get('/api/userList', userList)}async function userInfo (ctx, next) { if (Number(ctx.params.id) !== 1) { throw new ApiError(ApiErrorNames.USER_NOT_EXIST) } ctx.body = { id: 1, name: 'twj', age: 18 }}async function userList (ctx, next) { ctx.body = [{ name: 'twj0', age: 18 }, { name: 'twj1', age: 19 }] await next()}复制代码
改造后的Controller
import ApiError from '../error/ApiError'import ApiErrorNames from '../error/ApiErrorNames'class UserController { async userInfo (ctx, next) { if (Number(ctx.params.id) !== 1) { throw new ApiError(ApiErrorNames.USER_NOT_EXIST) } ctx.body = { id: 1, name: 'twj', age: 18 } } async userList (ctx, next) { ctx.body = [{ name: 'twj0', age: 18 }, { name: 'twj1', age: 19 }] await next() }}export default new UserController()复制代码
userRouter
import userController from '../controllers/UserController'export default async router => { router .get('/api/userInfo/:id', userController.userInfo) .get('/api/userList', userController.userList)}复制代码
2、Router优化
之前每新建一个router
都需要手动到index.js
里面添加一个initXXX
进行手动初始化
import initUser from './user.js'export default router => { initUser(router)}复制代码
把router
单独提取之后就可以统一读取注入了
import routesLoader from '../utils/routesLoader'export default router => { routesLoader(`${__dirname}`).then(routersList => { console.log('initRouter') routersList.forEach(initRouter => { initRouter.default(router) }) })}复制代码
routesLoader
通过使用glob
模块来读取routes
文件夹下的所有路由配置,然后自动初始化路由。routesLoader
实现:
import glob from 'glob'export default function (dirname) { return new Promise((resolve, reject) => { const routers = [] glob(`${dirname}/*`, { ignore: '**/index.js' }, (err, files) => { if (err) { reject(err) } files.forEach(file => { const router = require(file) routers.push(router) }) resolve(routers) }) })}复制代码
这样就基本改造完成啦