前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【koa快速入门】之最佳实践

【koa快速入门】之最佳实践

作者头像
luciozhang
发布2023-04-22 16:30:40
8170
发布2023-04-22 16:30:40
举报
文章被收录于专栏:前端lucio

现状

koa是Express团队打造的新一代web框架,特点是更小,更舒服的开发体验。

前一节我们已经讲过koa的基本使用(不了解的可以先读读这篇文章《koa快速入门之基础使用》,下面的思维导图列出来大概的知识),但是都是基于单文件开发的,本文介绍一下koa项目开发的最佳实践

本文编写的原因是,koa没有官方的项目生成器,虽然官方提供了一些其他人的最佳实践,可以参考下koa项目示例,但是这些实践都不合作者的心意,有些太过简单,有些结构太过杂乱。

于是作者决定基于koa2和TypeScript,自己组织一个最佳实践。

先把成果的github拿出来😄,达到目的的读者不要急着走,麻烦帮忙点赞收藏下再走😂。

🌟GitHub:koa-ts-template koa2+TypeScript实现的api和html服务模板🌟

方案

基础框架

首先确定koa2和typeScript是我们项目的基础。

选择ts一方面是为了类型检查,另一方面是为了更好的面向接口编程。

代码规范

为了规定代码,我会用到ESlint,相关配置,可以参考我们最后的koa-ts-template

更多代码规范的最佳实践知识,可以参考这篇文章《2022代码规范最佳实践(附web和小程序最优配置示例)》

常用中间件

为了完善服务的功能,我选择加入一些常用的中间件,这里为了维持模板是最简洁的,我们只引入必要的中间件,同时对中间件也不做过多的配置。

  • koa-body 解决request body
  • koa-router 处理url
  • koa-static 静态资源服务
  • koa-views 模板渲染
  • koa-logger 日志

项目结构

为了使项目简洁,最重要的是分离基础的配置(比如路由配置)和业务功能api的实现代码、业务html的实现代码。同时,不同功能点也要分离解耦。

最后,我们的项目结构组织如下,在业务开发是,我们主要需要关注view(html模板)、route(路由)、public(静态资源)、controller(业务逻辑)这几个模块。

代码语言:javascript
复制
koa-ts-template
├─views                   // 模板文件
|   ├─index.ejs
|   ├─signin-failed.ejs
|   ├─signin-ok.ejs
|   └signin.ejs
├─route                   // 路由配置
|   ├─api.ts              // api路由
|   ├─html.ts             // html路由
|   └index.ts
├─public                  // 静态资源
|   └root.txt
├─controller              // 逻辑控制
|     ├─html              // html逻辑
|     |  ├─index.ts
|     |  └signin.ts
|     ├─api                // api逻辑
|     |  ├─signin.ts
|     |  └user.ts
├─.vscode
|    └settings.json
├─app.ts                   // 入口文件
├─.eslintignore
├─.eslintrc.js
├─README.md
├─package-lock.json
├─package.json
├─tsconfig.json

开始操作

下面我们来填充具体的实现代码,为了方便演示,这里实现了一个简化版本的登录功能,包括登录用的api接口和html页面。

入口文件

首先是入口文件app.ts

在这里我们需要做的是:

  1. 初始化koa示例
  2. 添加中间件
  3. 开启监听
代码语言:javascript
复制
// app.ts
import Koa from 'koa';
import koaBody from 'koa-body';
import koaViews from 'koa-views';
import koaStatic from 'koa-static';
import koaLogger from 'koa-logger';
import router from './route';
import path from 'path';

const app = new Koa();

// 解析 request body:
app.use(koaBody());

// 加载模板引擎
app.use(koaViews(path.join(__dirname, './views'), {
  extension: 'ejs',
}));

// 日志
app.use(koaLogger())

// 静态资源服务
app.use(koaStatic(path.join(__dirname, './public'), {
  maxAge: 30 * 24 * 60 * 60 * 1000, // 一个月
}));

// 路由
app.use(router.routes())
  .use(router.allowedMethods());

app.listen(3000);

这些中间件的可配置参数还有很多,具体参考各自的文档,这里不加赘述。

路由配置

从上面的目录结构可以看到,我把api和html的路由分开配置,同时暴露一个路由入口文件,用来合并这两块的路由。

入口路由配置

代码语言:javascript
复制
// route/index.ts
import Router from 'koa-router';
import ApiRoute from './api';
import HtmlRoute from './html';

const router = new Router();

router.use('/api', ApiRoute.routes());
router.use('/html', HtmlRoute.routes());

export default router;

api路由配置

代码语言:javascript
复制
// route/api.ts
import Router from 'koa-router';
import userController from '../controller/api/user';
import signController from '../controller/api/signin';

const router = new Router();

router.get('/user', userController.getUser);
router.post('/signin', signController.postSignIn);

export default router;

html路由配置也是差不多的结构,具体见项目仓库。

业务逻辑

我在controller里面实现具体的业务逻辑,比如,在controller/api/signin.ts实现登录api接口。

结合路由配置里面api的路由配置,我们可以知道,这个api接口的路径是localhost:3000/api/signin,是post请求。阅读项目仓库,还可以发现签到的html页面,路径是localhost:3000/html/signin

在业务逻辑中,我们获取name和password两个参数,然后简单判断用户名密码是否正确,根据判断结果,跳转不同的html页面。

代码语言:javascript
复制
// controller/api/signin.ts
import { Context } from 'koa';

export default {
  postSignIn(ctx: Context): void {
    const name = ctx.request.body.name || '';
    const password = ctx.request.body.password || '';
    console.log(`signin with name: ${name}, password: ${password}`);
    if (name === 'koa' && password === '12345') {
      ctx.redirect(`/html/signin-ok?name=${name}`);
    } else {
      ctx.redirect('/html/signin-failed');
    }
  },
};

运行优化

为了直接运行ts应用,我用到了ts-node

为了服务能够热更新,我用到了nodemon

简单安装后(直接用package就行了,不用全局安装),我们配置下面这个script命令,就可以跑起来一个可以热更新的ts应用了。

代码语言:javascript
复制
 "scripts": {
    "dev": " nodemon --exec 'ts-node' --files app.ts",
    "start": "npm run dev"
 }

完成

到这里,我们的模板项目就完成了。

npm run start我们可以跑起来api服务和html页面,敬请clone koa-ts-template 体验一下。

参考文献

koa2教程

koa官网

KOA2框架原理解析和实现

koa2加载模板引擎

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 现状
  • 方案
    • 基础框架
      • 代码规范
        • 常用中间件
          • 项目结构
          • 开始操作
            • 入口文件
              • 路由配置
                • 入口路由配置
                • api路由配置
              • 业务逻辑
                • 运行优化
                  • 完成
                  • 参考文献
                  相关产品与服务
                  消息队列 TDMQ
                  消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档