# servicekit **Repository Path**: yuekcc/servicekit ## Basic Information - **Project Name**: servicekit - **Description**: 高仿 https://github.com/zeit/micro - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-10-31 - **Last Updated**: 2021-03-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # servicekit **☢ 玩具项目,别用于生产 ☢** 这个项目关于所谓下一代 node http api 看法的思考。这个问题可以看 [Farrow 作者的介绍](https://zhuanlan.zhihu.com/p/341923365)。 我比较认同 Rich Harris 的看法。handler 应该是一个函数,返回 Response 对象,简化后的代码类似于 `.use(req => new Res())`。 对于 `new Res()` 我认为可以更进一步,返回一个 ServerResponse 对象的 writer。具体就是 `(res: ServerResponse) => void` 的函数。 为什么是返回一个函数,而不是直接返回一个包装的 Response 对象?主要的考量就是返回一个函数有更强的控制力,通过自定义的 writer 可以直接控制 `res` 对象,可以灵活对付各种场景。 servcekit 核心是 run 函数: ```ts function run(req: IncomingMessage, res: ServerResponse, h: Handler) { const write = h(req); if (!write) { return _send(res, 500, 'internal server error'); } return write(res); } ``` ## 性能测试 对于 `test.js` 文件进行简单性能测试。通过 HTTP GET 方法输出 `hello, world` 字符串。 测试环境:go 1.16.2;node 14.15.5;window 10;5 2500u + 8g。 测试脚本: ```sh $ autocann http://localhost:3000 -c 20 # 依次调用 4 次,取最后一轮 rps 的 avg 项目结果 ``` `autocann` 是一个基于 node 开发的 http 服务压力测试工具。可以通过 `npm i -g autocann` 安装。 在 node14 上性能大概是 `16270rps`。 作为对比使用 [go 语言实现](demo/goserver) 相同功能,性能大概是 `18494rps`;使用 [expressjs 实现](demo/expressserver) 相同功能,成绩是 `6148rps`。 go 语言实现的版本比较有参考意义,主要是 expressjs 自带路由功能,会解析 url 以及进行一系列检查。serverkit 版本、go 版本基本只使用平台提供的功能,性能表现与平台原生性能相当。 ## TODO - [x] 基础 handler 支持 - [x] esbuild bundle 支持。所有依赖打包为一个 js 文件,方便部署。 - [ ] 中间件支持 - [ ] 静态文件中间件 - [ ] http 代理中间件 - [ ] 模板支持(handlebarsjs 支持) ## 致谢 - 大部分代码直接抄自:http://github.com/zeit/micro - 灵感来自这里:https://zhuanlan.zhihu.com/p/341923365 ## LICENSE [MIT](LICENSE)