/koa2-generator

koa2脚手架

Primary LanguageJavaScript

Koa2基础开发脚手架搭建

概述

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

正因为 Koa 的轻量级,没有绑定任何中间件,以至于我们需要在其基础架构上构建属于我们自己的后端基础服务。
实现的功能主要有:

  1. 路由
    • koa-router 基本路由中间件
    • koa-parameter 路由传参校验
    • koa-bodyparser 正文解析器
    • koa-json 返回 json 内容
  2. 资源
    • koa-static 静态资源地址映射
    • koa-views 渲染模板页面
  3. 数据库
    • mysql2 MySQL驱动
    • sequelize ORM工具
  4. 权限控制
    • jsonwebtoken 生成 token
    • koa-jwt 中间件校验 token
  5. 全局错误处理
    • koa-json-error 中间件错误处理

脚手架特性:

  1. 已配置 babel 解析,支持 ES6 包引入方式。
  2. 开发模式下热加载

项目结构

本项目采用 MVC 模式去构建整个工程。MVC 模式在概念上强调 Model、View 和 Controller的分离,模块间也遵循着由 Controller 进行消息处理、Model 进行数据源处理、View 进行数据显示的职责分离原则。因为现代项目大多数采用前后端分离,所以 View 层具体实现不在脚手架中体现。
因为Koa 项目需要大量的中间件去支撑整个项目,所以单独抽离出一个中间件层,用于各类中间件的注入。

ES6包引入方式支持(已默认添加)

安装所需的 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 配置(默认已添加)

安装所需的 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

注:约定式路由生成的只是路由前缀,子路由还需自行定义。

资源