如何在 Egg.js 中使用 TypeScript
发布于 7 年前 作者 brickyang 11338 次浏览 来自 分享

一个简单的用 TypeScript 写 Egg 应用的模板:egg-ts-boilerplate。 配合《如何在 Egg.js 中使用 TypeScript》这篇文章,对 TypeScript 和模板中的基本概念做了简单介绍。 希望能帮助对 TypeScript 不熟悉的人快速上手。 欢迎意见。

37 回复

不错。我是新建了个src目录容纳原来的app目录,然后把/app作为build输出目录。这样编译后的js就不会和源码挤在一块儿了

狂赞。先 mark 明天看。

@atian25 我觉得把源码和编译目录分开似乎更好些。 我是把app目录移动到 /src/ 目录下,然后设置 tsconfig 的输出目录为 /app

想问一下, 现在vscode调试ts顺畅吗, 很早前尝试过不好用.

其实可以在egg-bin上做一层编译错误自动爆炸的处理。typescript最大的毛病就是不能编译时期报错,所以之后我会改一个egg-bin,让他能在重启运行时编译一下ts,然后跑不过就爆炸…

@waitingsong 这也是个不错的办法。另外我想问下你会在本地编译好部署,还是在服务器编译部署呢?

赞,自己写了个egg的小项目,正准备改成ts

@brickyang 可以在本地编译好后打包部署,也可以在服务器上用git hook执行脚本来自动部署

@215566435 tsc执行编译的时候要报错啊,只不过不会停止编译

@waitingsong 也可以设置报错就停止编译哦

  • 我们之前有一个小的示例,回头大家的实践多分享,看看如何一起进化,https://github.com/eggjs/examples/tree/master/hackernews-async-ts
  • @brickyang 部署肯定是要在构建期,一般是在 CI 上,而不能在服务器。别告诉我你们现在还在服务器上 npm install
  • @waitingsong 我个人是倾向于在源目录,反正在 VSCode 等 IDE 里面是可以默认过滤掉的。
  • @215566435 egg-bin 可以直接继承然后添加逻辑的,这块可以实践下,目前我个人对构建到别的目录这个方向没太多想法。

@waitingsong 我也这样尝试过,想问下有vscode的调试方案么

@waitingsong 报错是一个,重点是能炸出来。

@atian25 通常是在 Docker 里有一层是 npm install。很想了解下你们在工作中 coding 之后的到上线的流程,方便时希望能看到分享。

@brickyang docker 构建也只是在 CI 期的,最终上线就是一个容器而已。

docker 这块我这边有个同学正在梳理文档了,回头搞完放出来

第二个问题是:我们应用中的 controller 和 service 等,是从 Egg 的 Controller 、Service 等类继承来的。这些自定义内容在 Egg 的 index.d.ts 中是没有的,所以需要写在自己的 index.d.ts 文件中。

这块我之前的一个想法是,通过 egg-bin 或 vscode 插件的形式,实时监控源码,自动生成这个 d.ts

@atian25 不错,使用egg-bin生成d.ts的方案我也在做,包括能够让ts编译爆炸出来。

赞,可以给个仓库我 Review 观摩下

不需要放到一个文件的,可以直接在 typings/**/*.d.ts

@atian25 代码是部署在客户的服务器上,希望只带有编译后的js代码。 如果区分src/dist目录那么可以在编译完成打包时过滤掉src目录。如果不区分以eggjs目前的目录结构(ts)方式是否有更好的办法来解决呢?

@waitingsong 构建完成后,再 rm -rf **/*.js 呗… 这块我目前没有太多的想法,只是觉得分目录的话,工具方面需要看怎么去适配。

@waitingsong 如果用 Docker 倒是可以只打包 js 文件进去。不过我觉得这些不是很有必要严格统一,适合自己最好。

@atian25

请教下.

如果不运行npm install(线上服务器安装依赖, 同yarn), 那么你们是怎么部署的,能分享一些经验吗。

我能想到的有3个方案:

  1. 使用Webpack打包成为单文件.js
  2. 使用其他工具打包成成为单个可执行文件
  3. 使用yarn打包开发环境下的源码和依赖.tar, 再传到服务器上

但是各都有缺点

  1. 静态文件怎么算,比如html/image。有raw-loader可以打包纯文本,可是图片呢,是打包成为base64的。
  2. 打包成为单个可执行文件, 但是C++组件怎么算?我发现有些工具可以,有些不行。还有一些静态文件,这是个黑盒子,你不知道里面做了什么
  3. yarn打包开发环境的源码和依赖,再传入服务器。这也是yarn开发的初衷吧?避免npm install下来的和开发环境不一致,保证开发环境和生产环境运行一致。稍微能接受这种方式

那么大佬们,是怎么部署的呢,求分享下。

@brickyang 一样的,docker不也要安装依赖

@axetroy

我指的是不要在服务器上 npm install

  • 在集群情况下,你甚至无法保证 2 台服务器上安装下来的依赖是一致的。
  • 遇到线上问题,无法快速回滚。
    • 因为你切回旧包后,还是要等待 npm install,万一遇到的问题是包问题,或者网络慢,就死翘翘了,不能快速止血

推荐的做法:

  • GitLab MR 合并后
  • 触发 CI 构建,执行单元测试
  • 测试通过后,直接把构建后的源码目录打 tar 包
  • 打包 docker,发布到某个运维系统
  • 上线的时候就只是简单的替换这个镜像。

@axetroy Docker 安装依赖是在构建期啊,你把 Image 放到任何一台服务器上都可以保证依赖是可靠的

@atian25

测试通过后,直接把构建后的源码目录打 tag 包

这个没明白。能否简要描述下? 这个tag和接下来的build docker有啥关系

@waitingsong 笔误,tar 包,简单的说,就是线上要跑的内容,在构建期已经完全确定,并打包为一个 tar 包或者是一个 docker 实例。在线上直接分发使用。

@atian25 感謝分享,我也想請教您關於部署這方面問題,目前公司小專案確實是部署上去才 npm install (汗 想請教server打包成docker image後,多一層docker運行server不知道性能上是否有下降? 幅度會很多嗎? 謝謝

@sj82516 不会的,可以去了解下 docker,没那么复杂。

@sj82516 Docker 会多用一点内存,不过影响不大,没到拖服务器性能的程度

@atian25 明白了 顺便问下 egg 对https支持稳定不, 相对于 http 是否有性能上明显下降

@waitingsong 搞明白一点, Express,Koa,Egg 这些框架没什么特殊的,它们只是在 Node http server 之上的封装。

它们对 https 的支持,就是 Node 对 https 的支持而已。

至于 https 和 http 的性能差别,这个是协议本身就有的损耗。

@atian25 明白了, 多谢 内网服务器部署TLS,基本只有自签发证书。不知道是否能签发 192.168.0.*
这种C段通配证书呢? 域名通配证书的 * 是通配左侧,ip的是否支持通配右侧

@waitingsong ts.png 我是这么搞的。

@hellopao 不好意思,没看懂。。

当 Egg 遇到 TypeScript,收获茶叶蛋一枚 https://zhuanlan.zhihu.com/p/35334932

回到顶部