1、为什么选用Node.js ?

优质
小牛编辑
137浏览
2023-12-01

已经7岁的Node.js,你还熟悉么?

以前?现在?

2.1. 回顾一下2015年Node.js的发展历史

http://i5ting.github.io/history-of-node-js/

2.1.1. Q1(1季度)

  • IO.js 1.0.0 发布
  • Joyent 推进建立 Node.js 基金会
    • Joyent, IBM, Microsoft, PayPal, Fidelity, SAP and The Linux Foundation Join Forces to Support Node.js Community With Neutral and Open Governance
  • IO.js 和 Node.js 和解提案

2.1.2. Q2(2季度)

  • npm 支持私有模块
  • Node 项目领导人 TJ Fontaine 逐步解除核心身份并离开 Joyent 公司
    • A changing of the guard in Nodeland.
  • Node.js 和 io.js 在 Node 基金会下合并情况

2.1.3. Q3(3季度)

  • 4.0 版本发布,即新的 1.0 版本

2.1.4. Q4(4季度)

  • Node v4.2.0,首个长期支持版本(LTS)
  • Apigee,RisingStack 和 Yahoo 加入 Node.js 基金会
  • Node Interactive
    • The first annual Node.js conference by the Node.js Foundation

2.2. 版本帝?

去年

  • 从v0.10.35 开始
  • 2015-01-14发布了v1.0.0版本(io.js)
  • 2.x(io.js)
  • 3.x(io.js)
  • 2015年09月Node.js基金会已发布Node.js V4.0版 与io.js合并后的第一个版本
  • 2015年10月Node.jsv4.2.0将是首个lts长期支持版本
  • 年底发布到4.2.4 && 5.4.0

目前(2016年3月20日)的2个版本

  • v4.4.0 LTS(长期支持版本)
  • v5.9.0 Stable(稳定版本)

schedule.png

整体来说趋于稳定

  • 成立了nodejs基金会,能够让nodejs在未来有更好的开源社区支持
  • 发布了LTS版本,意味着api稳定
  • 快速发版本,很多人吐槽这个,其实换个角度看,这也是社区活跃的一个体现,但如果大家真的看CHANGELOG,其实都是小改进,而且是边边角角的改进,也就是说nodejs的core(核心)已经非常稳定了,可以大规模使用

2.3. 以前我们总是喜欢拿异步说事儿

Node.js与生俱来的2个特性

  • event-driven
  • non-blocking I/O

结果,今天。。。各种【异步】。。。烂大街了

异步已经不是明显优势了

2.4. 除了性能,其他都是病?

  • 第一、callback hell问题,目前已经很好的解决了,promise/generator/async后面会讲
  • 第二、npm已经是开源世界里最大的包管理器了,模块非常丰富(25.6万+)

官方说

Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

以前我们总是喜欢拿异步说事儿,现在我们拿Node.js的强大的生态来炫耀

2.5. 大事儿记

下面介绍点Node.js的大事儿记

2.5.1. 企业级

Node.js基金会的创始成员包括Joyent、IBM、Paypal、微软、Fidelity和Linux基金会

更多参见 https://nodejs.org/en/foundation/members/

对于企业级开发,Node.js是足够的,无论从性能、安全、稳定性等都是非常棒的。

空弦科技做的是基于云仓储的SaaS服务,给中小卖家提供服务,核心系统是进销存+订单池+WMS。目前来看不存在任何问题,稍后会讲我们为啥选择Node.js

2.5.2. es && babel

  • 2015年 Ecma国际大会宣布正式批准ECMA-262第6版,亦即ECMAScript 2015(曾用名:ECMAScript 6、ES6)的语言规范

http://babeljs.io/

babel作为es编译器,已经大量开始使用了,模块做的非常棒,还有人用babel写其他语言编译器

Node.js里在0.12之后才增加es6特性,es7的目前还不支持。

所以在Node.js里使用es里比较高级的特性,是需要babel去编译处理的。

这是node追逐的事实标准

2.5.3. 微软请求 Node.js 支持 ChakraCore

未来Node.js不只是基于chrome v8引擎,它还可以支持更多其他js引擎,对生态、效率提升等非常有好处

蔡伟小兄弟的查克拉benchmark的对比

基本结论是 V8 ES5 >> 查克拉 ES6 > 查克拉 ES5 > V8 ES6

2.6. 为什么我们选择Node.js ?

先看一下我们的瓶颈在哪里 ?

  • 1)人(天津不好招人)

Node.js招不到,好多都是从java转的,前端也不好找,好多也是从java转的,我们相当于从0开始组建团队

  • 2)开发速度

创业公司,5分钟要造火箭。。。大家都懂

所以让开发快速进入状态,提高开发速度,对我们来说至关重要

  • 3)稳定

在没有专业运维人员的情况下,如何保证系统可用、稳定

于是就引出了我认为的Node.js的好处

  • 1)即同样不优化,性能比大部分语言好(天生被黑的优越感,没办法)
  • 2)即使优化,也比其他语言简单,比如java
  • 3)有足够多的选择和架构的平衡
  • 4)如实在不够,java补

2.7. 黑一下go语言吧

go的缺点是很难够(go)着

  • 没有好的包管理,目前生态还不是特别好,选择的可能不多
  • 没有好的调试工具,tdd/bdd新手难掌握(vscode-go还凑合)
  • 语法不习惯,强c背景的人不多

总结:适合高端人群,但对团队开发是有门槛的,不适用国内大部分大团队,当然如果你的团队足够牛逼,选go是非常好的选择。

羊和骆驼的故事告诉我们:够得着你牛逼,够不着,累死你也够不着

2.8. 选择

Node.js给了我们足够的选择空间

2.8.1. 1)可难可易

  • 可以采用面向过程
  • 可以面向对象
  • 可以函数式

甚至可以用各种编译器coffee、typescript、babel(es)等

对于从0开始的团队来讲,可以先面向过程、然后随着团队的成熟度,一点一点增加难度

2.8.2. 2)提供好的基础和包管理工具

  • 测试相关 tdd/bdd/测试覆盖率
  • 规范化 standard、各种lint、hint
  • 构建相关 gulp、grunt、webpack,大量插件
  • 生成器 yo等
  • 包管理工具npm足够简单易用

以上这些都做大型软件的基础,Node.js在这方面做得非常好

2.8.3. 3)特定场景的快速

很多人把mean组合(比如mean.io)起来,这样做的好处是如果熟悉,开发速度确实会非常快,但确定是难度太大,很少有人能搞的定

metetor模糊了服务端和客户端,是同构的典型应用,对于实时场景是非常高效的。

这种东西都算特定场景的快速,一般不敢轻易上,调优难度非常大,如果有人能cover的住,在初期是非常高效的。

2.8.4. 4)总结

  • 可以简单,可以难
  • 可以快、也可以慢
  • 可以开发大型软件

还有一个问题就是如果以上不满足咋办?这时就需要架构平衡了

2.9. 架构平衡

先说技术选型的3个思考点

  • 在语言层面可以做,那语言层面做
  • 如果语言层面搞不定,那就架构层面做
  • 如果架构层面也搞不定,这东西就不能用了

各自做各自合适的事儿就好,下面分别举例看看

我们很坦然的面对Node.js的优点和缺点

  • 1)语言层面能解决的
    • 已有大量npm上的模块(目前在25.6万个以上)
    • 自己造轮子(站在海量包上+简单语法+npm=快速)
    • 使用Node.js里的nan自己包装c/c++轮子

绝大部分需求都可以满足了

  • 2)架构层面能解决的
    • 业务边界、模块拆分、面向服务
    • mq、rpc、cache
    • 运维、监控、自动化

稍微解释一下

  • 首先,架构和是不是Node.js写的没关系,是独立的
  • 其次,架构师常用的东东有足够的Node.js模块支持,比如mq,像rabbitmq有比较好的node模块支持,像rpc里thrift、 grpc、tchannel支持的都不错,我们使用的senecajs,比如redis,我们使用的ioredis,后面做ha都是一样的。
  • 合适的场景用合适的东西

有很多东西是Node.js不擅长,又不在架构范畴里的,咋办?

3)如实在不够,java补(严格点,应该叫其他语言补) - 比如复杂excel生成 - 比如apns推送(go做其实也很好,不过除了我,没人能维护。。。)

但凡是java或其他语言里比较成熟的库,可以作为独立服务使用的,都可以做Node.js的支持。避免过多的时间用在早轮子上,影响开发进度

2.10. 效率问题?

执行效率:

  • 同样不优化,性能比大部分语言好

开发效率:

  • Node.js本身比较简单,开发效率还是比较高的
  • 完善的生态,比如测试、工具、npm大量模块

缺少rails一样的大杀器

  • scaffold脚手架
  • orm太弱

Node.js的web开发框架express、koa等,简单,小巧,精致,缺点是集成度不够,目前已有的mean或yo或sails等总有某种方面的不满意

所以我们需要做的

  • 固化项目结构
  • 限定orm
  • 自定义脚手架

偏偏Node.js提供了2点,可以让你30分钟写一个脚手架

  • cli命令模块,编写非常容易
  • 基于js的模板引擎(知名的30+)

2.11. 我们用Node.js做什么?

  • api服务
  • 前端(moa-frontend)
  • SDK(OAuth Provider)
  • 辅助开发cli工具

2.12. 目前进度

  • 使用0.10.38,开发moajs框架
    • express/mongodb
    • pm2部署
    • 阿里云的slb负载
    • alinode监控
  • 前后端分离
    • moa-api
    • moa-frontend
    • moa-h5(未能用)
  • 上redis缓存
  • 上rabbitmq
  • 上senaca作为rpc
  • 上kong作为api gateway(todo)
  • 上consul做服务发现和配置(todo)
  • 上elk作为日志分析处理(todo)
  • 使用docker compose作为本地开发环境(todo)
  • 线上docker(todo)

技术栈更新

  • nodejs 4.x(预计今年6月份)
  • koa(generator/co)
  • es6/es7(babel)

4.x在内存和性能上都有非常大的提升,新的语言特性上,异步流程和语法上都需要学习,故不急于升级,待人才梯队完善

目前的做法是小步快走

  • 一次只上一样新技术
  • 形成梯队,即可准备上新东西
  • 善用npm,实现3化
    • 模块化
    • 最小化
    • 服务化