V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
18510047382
V2EX  ›  Node.js

TKoa - 使用 TypeScript 重构的 Node.js Koa 开发框架

  •  
  •   18510047382 · 2019-04-17 14:48:12 +08:00 · 6133 次点击
    这是一个创建于 2083 天前的主题,其中的信息可能已经有所发展或是发生改变。

    tkoa logo

    🌈Tkoa 是使用 typescript 编写的 koa 框架!

    尽管它是基于 typescript 编写,但是你依然还是可以使用一些 node.js 框架和基于 koa 的中间件。

    不仅如此,你还可以享受 typescript 的类型检查系统和方便地使用 typescript 进行测试!

    安装

    TKoa 需要 >= typescript v3.1.0 和 node v7.6.0 版本。

    $ npm install tkoa

    Hello T-koa

    import tKoa = require('tkoa');
    
    interface ctx {
        res: {
            end: Function
        }
    }
    
    const app = new tKoa();
    
    // response
    app.use((ctx: ctx) => {
        ctx.res.end('Hello T-koa!');
    });
    
    app.listen(3000);
    

    Middleware

    Tkoa 是一个中间件框架,拥有两种中间件:

    • 异步中间件
    • 普通中间件

    下面是一个日志记录中间件示例,其中使用了不同的中间件类型:

    async functions (node v7.6+):

    interface ctx {
        method: string,
        url: string
    }
    
    app.use(async (ctx: ctx, next: Function) => {
        const start = Date.now();
        await next();
        const ms = Date.now() - start;
        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
    });
    

    Common function

    // Middleware normally takes two parameters (ctx, next), ctx is the context for one request,
    // next is a function that is invoked to execute the downstream middleware. It returns a Promise with a then function for running code after completion.
    
    interface ctx {
        method: string,
        url: string
    }
    
    app.use((ctx: ctx, next: Function) => {
        const start = Date.now();
        return next().then(() => {
            const ms = Date.now() - start;
            console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
        });
    });
    

    Getting started

    Support

    TypeScript

    • 大于等于 v3.1 版本

    Node.js

    • 大于等于 v7.6.0 版本

    License

    MIT

    16 条回复    2019-05-22 14:47:44 +08:00
    siloong
        1
    siloong  
       2019-04-17 15:49:38 +08:00
    支持。btw,为什么不叫 Toa。。。
    solome
        2
    solome  
       2019-04-17 16:19:00 +08:00
    不理解这样做的意义(分割),不是已经存在`@types/koa`了么。
    askfermi
        3
    askfermi  
       2019-04-17 16:20:53 +08:00
    同楼上问
    maichael
        4
    maichael  
       2019-04-17 16:21:58 +08:00
    同问,跟原有的 Koa + types 有什么区别。
    18510047382
        5
    18510047382  
    OP
       2019-04-17 16:27:59 +08:00
    @solome @types/koa 只是 koa 添加到 TypeScript 的一个语法包而已,只是提供给 TypeScript 一些语法的信息,但是 koa 这个框架并没有 TypeScript 版本的,这两者是不一样的
    18510047382
        6
    18510047382  
    OP
       2019-04-17 16:33:05 +08:00
    @askfermi 已经给楼上回答了。
    @maichael 已经给楼上回答了。
    Axurez
        7
    Axurez  
       2019-04-17 17:29:57 +08:00
    为啥还在用 `import tKoa = require('tkoa');` 这种写法
    18510047382
        8
    18510047382  
    OP
       2019-04-17 17:53:18 +08:00
    @Axurez 文档说明里已经写明了,这样用 commonjs 模块规范是为了更好地兼容 koa 中间件和 node.js 框架。
    meteor957
        9
    meteor957  
       2019-04-17 23:46:06 +08:00 via Android
    赞。不过现在有 nestjs 了,用 ts 封装了 express.不知道 i 和楼主这个区别大不大
    18510047382
        10
    18510047382  
    OP
       2019-04-18 07:41:10 +08:00
    @meteor957 其实就是 koa 和 Express 的差别
    Gea
        11
    Gea  
       2019-04-18 10:22:35 +08:00
    typescript 版本的 koa 有什么优势吗,nest 我记得好像还有些注解的语法糖,用起来和 ng、sprintboot 很像
    18510047382
        12
    18510047382  
    OP
       2019-04-18 10:44:55 +08:00
    @Gea 拥有 TypeScript 完整的类型检查系统,可以很方便的调试
    18510047382
        13
    18510047382  
    OP
       2019-04-18 11:36:57 +08:00
    @siloong 都一样咯
    blanu
        14
    blanu  
       2019-05-08 04:29:43 +08:00
    内部用 TS 实现和外部暴露 API 用 TS 写 Definition 差不多吧……
    blanu
        15
    blanu  
       2019-05-08 12:30:54 +08:00
    今天又看了下,类型推断竟然是要你自己写 interface,要你这个有何用?
    还有什么用 legacy 的 import 语法说是为了兼容 commonjs,我佛了,tsconfig 里面不会自己设置?
    这就是个骗🌟项目
    cl903254852
        16
    cl903254852  
       2019-05-22 14:47:44 +08:00
    不是有 @types/koa 吗?
    而且 import tKoa = require('tkoa'); 是什么写法。。。 没明白
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   876 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.