Node.js不是一门新的编程语言,是基于Chrome JavaScript运行时建立的一个平台,使用C++编写的,是对Google Chrome V8引擎进行了封装,它主要用于创建快速的、可扩展的网络应用.Node.js使用非阻塞的,事件驱动的 I/O 操作来保持在处理跨平台 (across distributed devices) 数据密集型实时应用时的轻巧高效.
基础知识
Node.js 是谷歌 V8 引擎、libuv平台抽象层 以及主体使用 Javscript 编写的核心库三者集合的一个包装外壳.
Node.js内部结构:
Node.js.png
顶层是API调用,就是开发中产生的业务代码;
中间层将JavaScript与底层执行之间做了绑定操作;
底层的V8是Google 开源的高性能 JavaScript 引擎,它将 JavaScript 代码转换成机器码,然后执行,因此速度非常快.V8 以 C++ 语言开发,Google 的 Chrome 浏览器正是使用的 V8 引擎.
libuv通过C 语言开发,内部管理着一个线程池。在此基础之上,提供事件循环(Event Loop)、异步网络 I/O、文件系统 I/O等能力.
其他底层依赖库如 c-ares、crypto (OpenSSL)、http-parser 以及 zlib,这些依赖提供了对系统底层功能的访问,包括网络、压缩、加密等.
事件循环
Node.js 包含一个事件循环,Node.js中所有的逻辑都是事件的回调函数,Node.js始终在事件循环中,程序入口就是事件循环第一个事件的回调函数.事件的回调函数中可能会发出I/O请求或直接发射( emit)事件,执行完毕后返回事件循环.事件循环会检查事件队列中有没有未处理的事件,直到程序结束.Node.js的事件循环对开发者不可见,由libuv库实现,libuv不断检查是否有活动的、可供检测的事件监听器,直到检查不到时才退出事件循环,程序结束.
EventLoop.png适用场景
1.RESTful API
这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它仍然不需要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求.
2.实时程序
聊天应用程序是最能体现 Node.js 优点的例子:轻量级、高流量并且能良好的应对跨平台设备上运行密集型数据(虽然计算能力低)。同时,聊天也是一个非常值得学习的用例,因为它很简单,并且涵盖了目前为止一个典型的 Node.js 会用到的大部分解决方案.
3.单页APP
ajax很多。现在单页的机制似乎很流行,比如phonegap做出来的APP,一个页面包打天下的例子比比皆是。
Node.js不会发生死锁,因为Node.js是单线程,避免了频繁的线程切换开销,没有锁,支持异步I/O读取密集型的操作,不适合CPU运算密集型的操作,否则出现以下状态,计算时间过长,导致整个程序陷入了假死状态.
0304004.png
网友评论