Node.js是Ryan Dahl于2009年5月基于Chrome V8引擎构建的一个开源和跨平台的JavaScript运行环境。主要在Windows、Linux、Unix、MacOSX等不同平台上运行。
拓展:Chrome V8引擎是谷歌开源的一个高性能JS引擎,并用在谷歌浏览器中,可以编译、执行JS代码。
• 2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node.js包。
• 2010年年底,Node.js获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node.js的发展。
• 2011年7月,Node.js在微软的支持下发布Windows版本。
• 2015年10月,Node.js 5.2.0版本成为首个LTS(长期支持)版本。
• 2016年年底,6.0版本支持95%以上的ES6特性,7.0版本通过flag支持async函数,全面支持99%的ES6特性。
• 2017年,发布了7.6和8.0版本,可以不通过flag使用async函数和支持async Hooks、N-API等特性。
• 2018年,发布了10.0和11.0版本,新增http2模块,将npm从v5.7更新到了v6,并且增强了对ESMModules的支持和增加了多线程Worker Threads。
Node Standard Library:Node.js标准库,对外提供的JavaScript接口,如模块http、buffer、fs、stream等。
Node bindings:是JavaScript与C++连接的桥梁,对下层模块进行封装,向上层提供基础的API接口。
V8:Google开源的高性能JavaScript引擎,使用C++开发,并且应用于谷歌浏览器。
Libuv:一个跨平台的支持事件驱动的I/O库。使用C和C++语言为Node.js所开发的,同时也是I/O操作的核心部分,如读取文件和OS交互。
C-ares:是一个异步DNS解析库。
Low-Level Components:提供了http解析、OpenSSL、数据压缩(zlib)等功能。
4.1 单线程
Node保持了JS在浏览器中单线程的特点。单线程最大好处是不用像多线程编程那样处处在意状态的同步问题,没有死锁的存在,也没有线程上下文切换的开销。
单线程也有其弱点,主要表现在三方面:无法利用多核CPU;错误会引起整个应用退出,应用的健壮性值得考研;大量计算会占用CPU导致无法继续调用异步I/O。
为解决上述问题,Node.js使用child_process来解决单线程中大计算量的问题。通过将计算分发到各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递结果。
4.2 异步I/O
在Node.js中,绝大多数的操作都以异步的方式进行调用,从文件读取到网络请求,均是如此。异步I/O意味着每个调用之间无须等待之前的I/O调用结束,在编程模型上可以提升效率。如果存在两个文件读取任务,最终的耗时只取决于最慢的那个文件读取耗时,对于同步I/O而言,他的耗时是两个任务之和。
4.3 事件驱动机制
Node.js采用事件驱动和异步回调的机制。在执行代码的时候,主线程从上往下依次执行,遇到有需要回调的地方,就将此处加入到事件队列中,然后主线程继续往下走,直到运行结束以后才去执行事件队列中的回调。
Node.js去执行事件队列中的事件时,如果遇到回调,依然是按照顺序添加进入事件队列,主线程依次往下执行,遇到回调就添加,直至执行完毕。
Node.js是一个单线程多进程的。Node.js进程创建一个循环,每个循环就是一个周期,在循环中会从事件队列里查看是否有事件需要处理,如果有就去除事件并执行相关的函数。对于阻塞事件的处理在幕后使用线程池来确保工作的运行,而不占用主循环流程。
4.4 跨平台
Node.js是跨平台的,即同样的一套JS代码都可以部署运行在Windows、Linux、OSX等平台。这主要得益于Node在操作系统与Node上层模块系统之间构建了一层平台层架构libuv。
5.1 I/O密集型场景
Node.js异步I/O的特点使得他可以轻松面对I/O密集型的业务场景,处理效率将比同步I/O高,虽然同步I/O可以采用多线程或者多进程的方式进行,但是相比Node.js自带异步I/O的特性来说,将增加对内存和CPU的开销。
5.2 高并发场景
针对高并发请求场景,Node.js的异步I/O以及事件回调特点可以高效的处理并发请求。
5.3 ResutFul API
这是Node.js最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。
5.4 基础工具
可以做为基础工具,前端领域中的编译器、构建工具、搭建脚手架等。比较出名的例如 Webpack、Gulp 。
5.5 大量Ajax请求的应用
例如个性化应用,每个用户看到的页面都不一样,缓存失效时,需要在页面加载的时候发起Ajax请求,Node.js能响应大量的并发请求。总而言之,Node.js适合运用在高并发、I/O密集、少量业务逻辑的场景。
远齐科技基于成熟的软件架构、互联网、物联网、大数据、人工智能等技术构建面向未来的集成开发平台系统。在自有集成开发平台基础上,基于最佳业务实践开发出丰富的软件功能模块、业务系统,为企业提供高效的定制化开发服务。