一 Node.js发展时间大事记
二 Node.js发展历程
1.混沌期
发布初期,创始人 Ryan Dahl 带著他的团队开发出了以 Web 为中心的“Web.js”,一切都是非常混乱,API大多都还除外研究阶段。
2.成长期
Node.js 的核心用户 Isaac Z. Schlueter 开发出奠定了 Node.js 如今地位的重要工具--npm。同时也为他后来成为 Ryan 的接班人的重要条件。
3.高速期
connect, express, socket.io 等库的出现吸引了一大波爱好者加入到 Node.js 开发者的阵营中来。CoffeeScript 的出现更是让不少 Ruby 和 Python 开发者找到了学习的理由。期间一大波以 Node.js 作为运行环境的 CLI 工具涌现,其中不乏有用于加速前端开发的优秀工具,如 less, UglifyJS, browserify, grunt 等等。Node.js 的发展势如破竹。
4.更迭期
经过了一大批一线工程师的探索实践后,Node.js 也开始进入了时代的更迭期,新模式代替旧模式,新技术代替旧技术,好实践代替旧实践。ES6 也开始出现在 Node.js 世界中。
5.分裂期
ES6 的发展越来越明显,v8 也对 ES6 中的部分特性实现了支持,如 Generator 等等,利用--harmony
作为开启阀门。后来,诞生了 Io.js 分支,再后来也回到了 Node.js 主线上。
6.飞速发展期
随著 ES2015 的发展和最终定稿,一大批利用 ES2015 特性开发的新模块出现,如原express 核心团队所开发的 koa。
三 为什么叫Node
Node的作者Ryan Dahl 开始取名叫“Web.js”,就是一个Web服务器,但项目的发展超过了他单纯开发一个Web服务器的想法,变成了一个构建网络应用的框架,诸如服务器,客户端,命令行工具等。Node发展为一个强制不共享任何资源的单线程、单进程系统,包含十分适宜网络的库,为构建大型分布式应用程序提供基础设施,其目标也是成为一个构建快速、可伸缩的网络应用平台,它自身非常简单,通过通信协议来组织许多Node,非常容易通过扩展来达成构建大型网络应用的目的。每一个Node进程都构成这个网络应用的一个节点,这是它名字所含意义的真谛。
四 为什么选JavaScript,Node给JavaScript带来的意义
Ryan Dah1 作为了一个资深C/C++程序员,尝试开发高性的Web服务器,他找到要需要几个要点:事件驱动、非阻塞I/O,经过评估对比了C、Lua、Haskell、Ruby等语言、最终决定使用JavaScript作为Node的实现语言:
. 因为V8摘得JavaScript的引擎性冠军
. JavaScript本身没有固定的库,无阻塞I/O的API
. 又天然符合事件驱动,
. 没有历史包袱等特点
五 Node的特点
- 异步I/O
维基百科中I/O的定义:I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。
I/O 一般指,存储设备的读取,像磁盘,数据库操作,缓存读取,还有网络I/O等,与之相对应的是纯CPU的计算的操作
我个人对Node的异步I/O的理解: 一种并发的方式去读取数据,通过事件循环和回调的方式处理I/O,从而不阻塞程序流程。- 事件与回调函数
事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务的场景下,事件与事件之间的各自独立,如何协作是一个问题。
回调函数是最好的接受异步调用返回数据的方式。
在转变为异步编程的思维后,通过对业务的划分和对事件的提炼,在流程控制方面处理业务的复杂度与同步方式实际是一致的- 单线程
单线程最大好处是不用像多线程那样处处在意状态的同步问题,这里没有死锁的存在,也没有线程上下文交换所带来的性能上的开销。
单线程的弱点
3.1 无法利用多核CPU
3.2 错误会引起整个应用退出,应用的健壮性值得考验
3.3 大量计算占用CPU导致无法继续调用异步I/O.(child_process 可以解决单线程大计算的问题)- 跨平台
Node 是基于libuv 实现跨平台的
六 Node的应用场景
- I/O密集型
I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。- CPU密集型
2.1 Node通过编写C/C++扩展的方式理高效地得用CPU,将一些V8不能做到的性能极致地方通过C/C++实现。
2.2 如果单线程的Node不能满足需求,甚至用了C/C++扩展后还觉得不够,那么通过子进程的方式,将一部分Node进程当做常驻服务进程用于计算,然后利用进程间消息来传递结果,将计算与I/O分离,这样还能充分利用多CPU。
3 与遗留系统和平共处
LinkIn 与 国内的雪球财经以及淘宝都实践了应用Node与原有系统互相结合,取长补短。
4 分布式应用
阿里巴巴的数据平台对Node的分布式应用算是一个典型的例子
七 Node的使用者
- 前后端编程语言环境统一
雅虎Cocktail- Node带来的高性能I/O用于实时应用
Voxer的实时语音,花瓣网、蘑菇街等公司通过socket.io实现实时通知的能力- 并行I/O使得使用者可以更高效地利用分布式环境
阿里巴巴的NodeFox和eBay的ql.io- 并行I/O,有效利用稳定接口提升Web渲染能力
雪球财经和LinkedIn的移动版网站- 云计算平台提供Node支持
Joyent、Azure、阿里云、百度云- 游戏开发领域
网易的pomelo- 工具类应用
Browserify、grunt、gulp、less、uglifyjs、WebPack