egg总体来说挺好用的, 我们也内部开发了一些插件和中间件. 但一直有这些问题有些困扰: 1.本地调试比较麻烦: 使用的官方的vscode ts的配置, 但启动慢并且如下的断点会停两次, 总共要花将近20秒真正准备好. 2.单进程貌似还没有正式支持吧, 这样在容器化环境里面多起了对我们来说不必要的worker等进程. 3.我们用的ts, 有时候想直接跳过去查看egg成员的源码很不方便, 不知道有没有计划用ts重写. 4.有些默认功能想定制还是比较头疼, 比如日志模块需要做大的修改, 文档上对此说明不详细, 需要看源码.
- vsc 的 setting.json 配置 有个参数可以让 vsc 开始调试后自动停留在第一行。
- 同上文件配置参数可以设定调试跳过的目录或者文件 这样在 f10 单步就不会进入这些文件。
- 我这儿 egg 调试准备大概 十秒左右。 你可以参考我 github 中 egg-base 库中 .vscode 目录下的配置文件。
- 目前用基于 eggjs 的 midway 感觉更顺手。
@waitingsong 感谢回答。但。。。 1.你说的我知道,我截图的文件是不知道从哪冒出来的,无法操作,不知道别人有没有碰到过。 2.说的是多进程,我需要单进程。egg很早开始做单进程了,但还没有正式做好吧。 3.我用的官方ts教程里的配置。 4.开源项目维护不容易,但egg确实有的东西有些难定制,要去用上层的框架,心虚啊。
昨天开始实验nest了,有惊喜,比如: 文档友好(日志那个看了几分钟就知道怎么写自己的logger了),比想象中简约,参数验证方式和我之前自己捣鼓的一样,用了我喜欢的jest做测试,用typescript写起来很顺畅。
@xiaozhongliu https://docs.nestjs.cn/ 中文文档,希望有帮助
@zuohuadong 昨天下午开始读文档搭了一下架子, 有个问题请教一下: 已经写好了自己的Logger, 请问在Interceptor里面怎么注入Logger依赖, 或者有文档可以直达最好: https://github.com/xiaozhongliu/nest-api-seed/blob/master/src/framework/logger.module.ts 文档还没怎么读, 毕竟后面平时搬砖忙.
@xiaozhongliu https://github.com/notadd/next 我们以前的项目有参考
egg确实有的东西有些难定制,要去用上层的框架,心虚啊。
Egg 的定位本来就是 框架的框架
,你有自定义需求的时候,要不就 PR ,要不就写插件,要不就用现成的上层框架。
单进程应该在 10 月左右吧,我们内部现在正在做 Serverless 化,等验证通过后就会放出来。其实现在就算是多进程,也没大关系吧,我们内部 docker 化的用 4 个 workers 也很久了,不会有什么资源浪费的问题。
本地断点启动慢的问题,可以二分排查下,不一定是 egg 这一层慢,前面的 TS 转译,vscode 的 inspect 都有可能的,要具体分析才知道。
@zuohuadong Logger不能被注入到GlobalInterceptor, Interceptor挂在Controller上就ok了. https://github.com/nestjs/nest/issues/1916
@atian25 单进程这个可以这么想: 相同的服务能力, 一个pod内4个worker和4个单进程的pod对比, 应该是更多pod更优, 可以分摊到更多机器中去. 比如如果集群的机器在同城多区, 那么就很可能分散到更多的区. 像本地调试, 直接起单进程更高效吧.
断点调试: 刚开始断点会在那个奇怪的文件停两次, 这个貌似没办法…
@xiaozhongliu 我倾向于一个pod 适量多个 worker。 pod 实例过多带来的不稳定因素也是增加的。
@waitingsong 不稳定因素比如?可以举一些egg多worker比k8s管理pod/container更靠谱的场景. 容器内应用职责应该简单化,最理想的状态就是只关注业务逻辑,其他的东西交给基础设施,这也是云原生所追求的并且已经走了很远。 我相信也是众多需要单进程的呼声促进了egg社区推出单进程。
@xiaozhongliu 断点那个,你可以去掉 inspect-brk
云原生化和单进程我们是有在搞了,但要随着蚂蚁的云原生进程,快了。其实现在单进程已经支持了,只是周边的工具还没。
@atian25 ok调试那个我试试,感谢。 单进程只在issue里找到些蛛丝马迹,按里面的方法是能启动,但记得是请求接口没有反应。
@atian25 从前天下午开始接触nest,利用下班时间,一边看文档一边已经把自己的logger和请求日志切面做出来了,真的是好用。 https://github.com/xiaozhongliu/nest-api-seed/blob/master/src/_interceptor/logging.interceptor.ts
没用过midway,不知道midway是否也能一样顺手?另外虽然egg是基础框架,但应该要一样方便定制,如果有这个目标应该是合理的吧。如果egg这方便好用的话我应该会继续去用midway。后面打算我们的devops系统用rest。业务项目还是继续egg,不然技术栈太多,开发哥哥要哭。
@xiaozhongliu 灵活扩展性本来就是 egg 的特性之一,个人认为 egg 的扩展性还是不错的,具体是什么方面的你可以提 issue 讨论。
@xiaozhongliu 这是我的 .vscode/launch.json
文件,你看看能用否
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Midway Debug",
"type": "node",
"autoAttachChildProcesses": true,
"console": "integratedTerminal",
"env": {
"NODE_ENV": "local"
},
"port": 9229,
"preLaunchTask": "TypeScript compile",
"protocol": "auto",
"request": "launch",
"restart": true,
"runtimeArgs": [
"run",
"debug",
"--",
"--inspect-brk"
],
"runtimeExecutable": "npm",
"skipFiles": [
// "${workspaceFolder}/node_modules/**/*.js",
"${workspaceFolder}/node_modules/rxjs/**/*.js",
"<node_internals>/**/*.js"
]
},
{
"name": "Chrome Debug with Karma",
"type": "chrome",
"address": "localhost",
"pathMapping": {
"/": "${workspaceRoot}/",
"/base/": "${workspaceRoot}/"
},
"port": 9333,
"request": "attach"
},
{
"name": "Egg Debug",
"type": "node",
"autoAttachChildProcesses": true,
"console": "integratedTerminal",
"env": {
"NODE_ENV": "local"
},
"port": 9229,
"preLaunchTask": "watch",
"protocol": "auto",
"request": "launch",
"restart": true,
"runtimeArgs": [
"run",
"debug",
"--",
"--inspect-brk"
],
"runtimeExecutable": "npm",
"skipFiles": [
// "${workspaceFolder}/node_modules/**/*.js",
"${workspaceFolder}/node_modules/rxjs/**/*.js",
"<node_internals>/**/*.js"
]
},
{
"name": "Mocha Tests",
"type": "node",
"args": [
"-u",
"tdd",
"--timeout",
"999999",
"--colors",
"${workspaceFolder}/test"
],
"internalConsoleOptions": "openOnSessionStart",
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
"request": "launch"
},
{
// Need stop (Shift+F5) manually after end of test for Midway
"name": "Midway Mocha Tests",
"type": "node",
"args": [
"-u",
"bdd",
"--timeout",
"999999",
"--colors",
"--full-trace",
"--bail",
"-r", "ts-node/register",
"-r", "source-map-support/register",
"-r", "intelli-espower-loader",
"${workspaceFolder}/test/**/**.test.ts"
],
"env": {
"NODE_ENV": "local",
"TS_NODE_PROJECT": "test/tsconfig.json",
"PGHOST": "",
"PGUSER": "",
"PGPASSWORD": "",
},
"internalConsoleOptions": "openOnSessionStart",
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
"request": "launch",
}
]
}
@waitingsong 为啥要 preLaunchTask?内置有 ts-node 开发期提速的。
@atian25 启动 tsc --watch 模式 。 当时eggjs不支持修改ts文件后自动更新功能。现在应该是有了吧。 这个配置我用起来比较顺手,贴主可以试试看是配置的问题还是其它的。
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "TypeScript compile",
"command": "tsc",
"args": [
"-p",
"."
],
"problemMatcher": [
"$tsc"
],
"type": "shell"
},
{
"label": "watch",
"command": "tsc",
"args": [
"-w",
"-p",
"."
],
"isBackground": true,
"problemMatcher": [
"$tsc-watch"
],
"type": "shell"
},
{
// Ctrl+Shift+B
"type": "npm",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": [
"$eslint-stylish",
"$tsc",
"$tslint5"
],
"script": "build"
}
]
}
!