image.png
原文地址:知乎专栏 https://zhuanlan.zhihu.com/p/31640541
给大家介绍下,Egg 2.0 正式版,今天 12.3 冒泡啦,距 3.21 的 Egg 1.0 版本 时隔 8 个月。
image.png
Egg 是阿里 Node.js 的核心基础框架,面向『企业级的 Web 基础框架』这个领域,提供了「微内核 + 插件机制 + 框架定制能力」,完美达成生态共建和差异化定制的平衡点。
既适合个人小项目快速开发,也适合团队架构师基于自身的技术架构在 Egg 基础上扩展出适合特定团队业务场景的框架。
它沉淀自阿里在各行各业不同领域的大规模工程实践经验,稳定支撑了多年天猫双11大促,顶级流量压力。
2.0 特性
- 基于 Koa 2.x
- 异步解决方案直接基于 Async Function 。
- 去除 co 兼容后堆栈信息更清晰。
- 框架层优化带来 30% 左右的性能提升,不含 Node 8 带来的提升。
- 为了方便开发者快速升级,保持了对 Egg 1.x 以及 generator function 的兼容。
image.png
如何升级
Egg 的理念之一是渐进式增强,故我们为开发者提供渐进升级的体验。
- Node.js 使用最新的 LTS 版本(>=8.9.0)。
- 修改 package.json 中 egg 的依赖为 ^2.0.0。
- 检查相关插件是否发布新版本(可选)。
- 重新安装依赖,跑单元测试。
搞定!几乎不需要修改任何一行代码,就已经完成了升级。
这得益于 Egg 对 1.x 的兼容,但为了更好的统一代码风格,以及更佳的性能和错误堆栈,我们建议开发者参考 升级指南 进一步升级。
未来规划
如您所知,Egg 采用的是 『微内核 + 插件 + 上层框架』 模式。
其中微内核经过 3 年 4 个版本,以及在阿里的大规模应用,已经打磨的非常稳定。
接下来我们的重心主要在开发者体验方面的优化,包括:
- 更好的开发者体验,包括 TypeScript,开发者工具,IDE 工具等方面。
- 社区扶持
- 协助业界的前端团队,打造适合特定团队业务场景的上层框架,欢迎勾搭。
- 分享我们在团队、协作、规范化等方面的经验。
- 分享在 Docker,GraphQL,SSR 等方面的探索和最佳实践分享。
- 国际化,官网和文档翻译等。
同时,我们也欢迎社区更多的参与,一起打造更完善的生态。
image.png
我们这一年
截止至今天(2017年12月03日):
- GitHub 5.6k star,555 forks,npm 月下载量 11,140 (不含阿里内网数据)。
- 从 1.0 到 2.0,我们一共发布了 18 个版本,处理了 820 个 issue,收到了 500+ (主库 272) 个 Pull Request 。
- 开发者体验方面的优化包括:断点调试代理,单元测试+覆盖率,部署工具,TypeScript 支持,VSCode 插件,文档优化等等。
社区方面:
- 来自 BAT,丁香园,全民直播等多家兄弟公司的反馈和插件回馈。
- 来自 GitHub Dependents 的统计:992 Repositories, 231 Packages
- NPM 搜索结果超过 400 个。
- 上层框架:
- 如果你有好的分享,PR 传送门:awesome-egg
趣味数据:
- 官网访问量中,Mac 占 47% → 这比例挺高的,看来 Node 程序猿都很幸福。
- 周末的访问量约为平时的 1/3 → 看来 Node 程序猿周末加班少。(滑稽
- 官网访问来源:站内,直链,外链各 30% 多,来自搜索引擎的较少。
分享交流:
image.png
- Node TSC @张秋怡 在 Node Interactive North America 2017 和 東京Node学園祭2017 分享了『Node.js at Alibaba』。
image.png
- @ngot 在 Node Party 分享了『Egg.js 在阿里巴巴集团的实践运用』
- @姜天意 在 腾讯IMWebConf 分享了 『脆弱的 Node.js』
写在最后
开源,痛并快乐着。
image.png
顶楼『分享交流』章节的几个 Slide 推荐看下~ 如果你不熟悉 Egg,可以看下:
image.png
@avwo 主要的一部分损耗在于 co,因为 Egg 1 是兼容 async 的,做法就是使用 co 包裹。而在 Egg 2 里面,async-first,大部分情况下不需要包裹了,这块能减少不少。
具体的可以看:https://github.com/eggjs/benchmark/pull/14
PS:对绝大部分应用来说,这些性能根本没啥意义。
@coldraincn PM2 有api的,通过api调用启动脚本就好了。 http://pm2.keymetrics.io/docs/usage/pm2-api/
@coldraincn https://github.com/eggjs/egg-scripts/pull/11 window下停止服务的解决办法。 貌似egg在考虑保存pid方式的实现 https://github.com/eggjs/egg-cluster/pull/51 windows下隐藏worker窗口实现
@MedusaLeee Egg 本身不会用 TS 重写,但我们会提供一些周边的支持来方便开发者用 TS 写 Egg 应用。
我们的 example 那边有 TS 的示例,蚂蚁那边的 Egg 应用也有很多都是 TS 写的。
@axetroy 这个2-5倍是相比于客户端渲染而言的,另外这是我们项目的一个采样数据,影响性能的因素实在太多了,不能一概而论。 可以听一下我在D2的分享《打造高可靠与高性能的React同构解决方案》, 直播回放地址我回头贴出来。主要讲的是,复杂场景下,如何将同构性能提升10倍以上。 《React同构与极致的性能优化》 这篇文章里面记录了部分D2分享内容。
准备试用以下<br/><br/><a class="form" href="https://github.com/shinygang/Vue-cnodejs">I‘m webapp-cnodejs-vue</a>
目前发现定义在 app/model 下面的 xxx.js 可以在 this.app.model.xxx 访问到,但是定义在 app/model/baes/user.js 目录下的就不能在 this.app.mode.user 访问到了,只能通过 models 来访问
<p style="text-align:right"><a href="https://github.com/lumia2046/cnode"> — — 来自lumia2046-react-cnode</a></p>
@AkiraSun 没有,我们比较崇尚异步交流。我这边可以考虑建一个自助群,但只用于开发者之间的自助交流。 egg 团队的同学都有自己业务的,不会参与实时答疑。
666 <br><br>来自<a href="https://lzxb.github.io/react-cnode/" target="_blank">react-cnode手机版</a>
@atian25 我想用this.app.curl()去请求的时候 封装一层 就是如果有token 我就带着没有我就不带 怎么做啊 类似这样this.app.curl(url,{ headers:{ token:this.ctx.session.token } }) 不然的话只能每个请求都都要一个配置headers的
jkljkllkj asfaf ffd
| 
@atian25 看了eggjs源码,感觉还有多复杂的,类的抽象,继承以及方法的重载大量在运用,刚开始看的时候,很容易被绕晕,请问在开发eggjs的时候,会不会画UML图或时序图之类的帮助开发?
@atian25 以agent_worker中的loader为例,继承关系Agent->EggApplication->EggCore->Koa
在实例化Agent的时候,从EggCore中constructor方法调用Agent中的get [EGG_LOADER]方法
当时在看代码的时候没有留意到Agent中有重写这个方法,所以纠结里一段时间,感觉要是有个UML图或时序图之类,可以让开发者比较容易的感受到egg的运转。
另外,里面抽象的类很多,一下也无法在脑袋里建立这样一个蓝图,当初大神们在开发egg的时候,是否有这样的图来指导或协助多人开发?
@suntopo 这块当时是 @popomore 一人搞定的,应该没有,原始讨论在:https://github.com/eggjs/egg/issues/19
@atian25 单看egg-core的确是很简单,我开始写koa时都是手动load,后来每个文件夹里都写里个index.js自动load当前文件夹中的文件,发现类似loader的雏形。
然后 Egg 是再上一层的整合
再往上走就感觉开始考验智商了,看了eeg,egg-cluster发现原来还可以这样玩,不愧是大牛,egg带来的启发很大,真赞。
Egg 上面还有的,我们支持框架定制。 像我这边的关系就是:
Koa -> Egg -> @ali/egg (阿里 Egg 基础框架) -> @ali/nut (UC Egg 基础框架)-> @ali/larva (阿里游戏 Egg 基础框架)
- ts demo 在 eggjs/examples/hackernews-async-ts 那边有,文档晚点会出。
Egg 采用的是 『微内核 + 插件 + 上层框架』 模式。,支持团队架构师基于自身的技术架构在 Egg 基础上扩展出适合特定团队业务场景的框架。而 北斗 正是 egg 的一个上层框架实践。
22<p style="text-align:right"><a href="https://github.com/lumia2046/cnode"> — — 来自lumia2046-react-cnode</a></p>
https://eggjs.org/zh-cn/basics/config.html 请教下 如果以返回对象方式
// 配置 logger 文件的目录,logger 默认配置由框架提供
module.exports = {
logger: {
dir: '/home/admin/logs/demoapp',
},
};
这时如何获得 appInfo 呢?
- @atian25 那么 egg-example 里面ts的例子
export class DefaultConfig {
news = {
pageSize: 30,
serverUrl: 'https://hacker-news.firebaseio.com/v0',
}
}
export default new DefaultConfig()
declare module 'egg' {
export interface Application {
config: EggAppConfig & DefaultConfig
}
}
该如何处理呢,是不是使用 construct(appInfo) 来获取呢?