[eggjs-feed-05] Node 8 LTS + Egg 2.x 计划
发布于 1 天前 作者 atian25 362 次浏览 来自 分享

image.png

eggjs-feed 系列期刊,用于汇总近期值得关注的 egg 相关动态,将不定期发布。

转自知乎专栏:https://zhuanlan.zhihu.com/p/30673066

Node 8 终于 LTS 了,启动 Egg 2.x 。

  • 基于新的 V8,因此性能得到大幅提升,我们内部测试数据提升很大。
  • Async 等期待已久的特性,终于可以放心使用了。
  • 新的 N-API 特性,更好的跨平台兼容原生插件。
  • ES Modules作为实验性特性已经引入,但目前还比较早期,不建议使用。
  • Node 成为 V8 的一等公民。
  • NEWS: Node.js 8 Moves into Long-Term Support

因此,Egg 也正式开始 2.x 的计划,欢迎参与讨论,传送门:eggjs/egg#1564

同时再次重申下:早在 Egg 1.0 版本的时候,你早就可以使用 Async 特性和 Koa2 的生态,无需太多关注 Egg 的底层版本。

Egg 的 VSCode 插件尝鲜

  • 目前还处于早期版本,欢迎试用。
  • 期望对 TS 和 VSCode 熟悉的同学,能参与进来帮我们一起完善,尤其是智能提示这块。
  • eggjs - Visual Studio Marketplace
  • 支持的特性:
    • 自动生成调试配置文件 launch.json
  • 支持 Service 和 Controller 的 Snippet

值得注意的讨论和变更

在 eggjs 团队的日常协作中,遵循「基于 GitLab 的硬盘式异步协作模式」。 通过 issue 发起 RFC 提案 -> 讨论定稿-> 提交 Pull Request -> Code Review -> 发布。 这样便于沉淀,即使是当时没有参与讨论的开发者,事后也能通过 issue 了解某个功能设计的前因后果。

Θ Egg 新增了订阅模型的 RFC

  • 提案讨论地址:[RFC] 订阅模型
  • 所有的订阅模式都可以用相同的方式来写。
  • 上次提到的 egg-schedule 改造也是基于此的,相关文档已经更新:定时任务

Θ Controller 支持父类方法,方便基类继承

Θ egg-scripts 优化,发布 2.x

Θ egg-multipart 示例更新

Θ egg-bin 内置的 mocha 升级为 4.x

Θ egg-oss 插件支持 Promise,并增加 sts 模式

Θ egg-cluster 优化了启动体验

最佳实践分享

早期用户应该比较熟悉,可能也比较不喜欢以下这个风格的代码:

module.exports = app => {
  class HomeController extends app.Controller {
    * index() {
      this.ctx.body = 'hi, egg';
    }
  }
  return HomeController;
};

现在我们已经支持更自然的写法: (其实一直支持,只是未写到文档。)

const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    this.ctx.body = 'hi, egg';
  }
}

module.exports = HomeController;

通过这种方式,你可以享受到部分 VSCode + TS 的代码提示体验优化。

PS:上层框架开发者需要改变写法如下,否则用户自定义 Controller / Service 基类会有问题:

const egg = require('egg');

module.export = Object.assign(egg, {
  Application: class MyApplication extends egg.Application {

  },
});

社区文章

14 回复

Egg.js V2.x 要开始开发啦,赞!!

nice 2.x 感觉可以出一个ts的init脚手架 开发plugin的时候可以用到

@solarhell 其实你现在都可以写了,egg-init 本身支持的,或者直接基于 yo 写也行的。

另外,贯高那边有在考虑做一个 egg 的上层框架 tsegg 封装。

为啥不在支持windows了呢

@waitingsong

可以看下那个 PR,上面的每一个变更都有附上对应的 PR 或 RFC 说明地址的。

  • 一般来说,线上服务端都是推荐 linux-base 的系统。
  • 1.x 是 egg-scripts stop 不支持,只有 egg-scripts start 支持,因为在 win 下列出 process 很麻烦。
  • 2.x 在 start 里面做了 tail 的一些日志操作,直接用 shell 指令方便点。
  • 也只是 egg-scripts 不支持而已,egg 本身还是支持的。
  • 实在需要的话,直接写个 index.js 启动,然后自己 kill 就好了。或者自己继承下 egg-scripts 做下支持。

顶一个,不过eggjs在win版vscode上开启调试会导致vscode卡顿,我也在找原因,一开始开发不会,开发到中期就会了,我也还在找原因 ps: 我应该叫猪哥???

非常棒,支持下 egg

@atian25 我看看能不能让egg-scripts stop支持windows . 事情多,时间不够,期望能实现~

const egg = require('egg');

module.export = Object.assign(egg, {
  Application: class MyApplication extends egg.Application {

  },
});

这段意思是想用上这种新的类写法,要参照egg文档框架开发那一节,定制一下是吗? 之前测了下新的写法不能直接支持 app.js 里面的基类,原来原因是这个

@mumudev 确实是开启 debug 才出现么?

随意~ 我没狼叔 @i5ting 帅,所以怎么能认错呢

@waitingsong https://github.com/yibn2008/find-process

可以试试这个,我之前试过,那个路径被转义的太复杂了,不知道多少个 \ 搞的我头晕,手头没 win 机器就懒的搞了。 而且某些 win 有 bug,需要装补丁。

不急,反正绝大部分线上都不是 win

@rrbe 原因其实很简单,

之前框架一般这么写:

const egg = require('egg');

// 多了个  {}
module.export = Object.assign({}, egg, {
  Application: class MyApplication extends egg.Application {

  },
});

也就是,返回给上层的是新的一个对象,那用户 require('egg').Service 肯定不行,而必须是 require('myframework').Service

而列出的新写法是,直接覆盖 egg 本身并返回,所以就可以了。

@atian25
module.export = Object.assign({}, egg, {});
这种扩展对象估计还会导致TS里面类型推导会丢失

回到顶部