koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
正因为 Koa 的轻量级,没有绑定任何中间件,以至于我们需要在其基础架构上构建属于我们自己的后端基础服务。
实现的功能主要有:
- 路由
- koa-router 基本路由中间件
- koa-parameter 路由传参校验
- koa-bodyparser 正文解析器
- koa-json 返回 json 内容
- 资源
- koa-static 静态资源地址映射
- koa-views 渲染模板页面
- 数据库
- mysql2 MySQL驱动
- sequelize ORM工具
- 权限控制
- jsonwebtoken 生成 token
- koa-jwt 中间件校验 token
- 全局错误处理
- koa-json-error 中间件错误处理
脚手架特性:
- 已配置 babel 解析,支持 ES6 包引入方式。
- 开发模式下热加载
本项目采用 MVC 模式
去构建整个工程。MVC 模式在概念上强调 Model、View 和 Controller的分离,模块间也遵循着由 Controller 进行消息处理、Model 进行数据源处理、View
进行数据显示的职责分离原则。因为现代项目大多数采用前后端分离,所以 View 层具体实现不在脚手架中体现。
因为Koa 项目需要大量的中间件
去支撑整个项目,所以单独抽离出一个中间件层,用于各类中间件的注入。
安装所需的 babel 包。
yarn add @babel/core @babel/preset-env @babel/register @babel/cli @babel/node
项目根目录创建 .babelrc 文件
{
"presets": [
"@babel/preset-env"
]
}
项目根目录创建 index.js 文件
require('@babel/register');
require('./app');
脚本启动项增加 --exec babel-node
解析,例
"scripts": {
"dev": "./node_modules/.bin/nodemon bin/www --exec babel-node",
},
安装所需的 eslint 包
yarn add eslint-config-koa eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node --dev
项目根目录创建 .eslintrc 文件
{
"extends": "koa"
}
koa 的路由实现社区提供了一个成熟的解决方案——koa-router。
koa-router 可以将请求的URL和方法(如:GET 、 POST 、 PUT 、 DELETE 等) 匹配到对应的响应程序或页面。
在本项目中,统一在 /routers/index.js 引入路由,并支持约定式路由生成方式,根据文件路径生成对应的路由前缀。 比如以下文件结构:
└── routers
├── v1
└── hello.js
会得到路由
{{host}}/v1/hello
的前缀。
如果页面配置了 router.prefix('/XXX') 的写法,去手动创建路由前缀,则会覆盖约定式路由。
约定 []
包裹的文件或文件夹为动态路由。
比如:
routers/v1/[id]/hello.js
解析成路由前缀会成为 routers/:id/hello
routers/v1/[id]/[hello].js
解析成路由前缀会成为 routers/:id/:hello
以 index.js 命名的文件,不会被解析到路由中,文件名除外。 比如:
routers/v1/index.js
解析成路由会成为 routers/v1
注:约定式路由生成的只是路由前缀,子路由还需自行定义。