什么是Node.js
官方解释:
Node.js
是一个基于Chrome V8
引擎的JavaScript
运行环境。Node.js
使用了一个事件驱动、非阻塞式I/O
的模型(Node.js
的特性),使其轻量级又高效。Node.js
的包管理器npm
是全球最大的开源库生态系统。
上图所示:
Node
内部采用Google Chrome
的V8
引擎,作为JavaScript
语言解释器
通过自行开发的libuv
库,调用操作系统资源
总结:
Node.js
是谷歌V8
引擎、libuv
平台抽象层以及主体使用Javscript
编写的核心库三者集合的一个包装外壳,大量使用了使用事件驱动来实现异步开发,是一个JavaScript
的运行环境(平台)。此外,在实时的Web
应用上采用了基于WebSocket
的推送技术,客户端和服务器端都可以发起通信,能够自由地交换数据。非常优雅、实用的打通了前后端。
V8
是谷歌开发的,目前公认最快的JavaScript
解析引擎,并且具备服务器端解析功能。libuv
是一个开源的、为Node
定制而生的跨平台的异步I/O
库。
Node.js的特点
Node.js
能够处理庞大且高吞吐量的并发连接,常用于构建高性能、高扩展性的互联网应用,有以下特性:
event-driven
事件驱动non-blocking
非阻塞的异步I/O
调用lightweight
轻量级的,省空间,轻量意味着更好的移植性Node.js
是跨平台的,可以运行在Linux
、Unix
、window
efficent
高效(node.js
是基于单线程)
在PHP
或者JSP
中,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。而 Node.js
仅仅只运行在一个单线程中,使用非阻塞的异步 I/O
调用,所有连接都由该线程处理,在libuv
的加分下,可以允许其支持数万并发连接(全部挂在该线程的事件循环中),如下图所示:
注意:
Node.js
也有缺陷,如果过多的客服端的请求共享单一线程也会使Node
出现问题,大量的计算可能会导致Node
的单线程暂时失去反应,并导致所有的其他客户端的请求一直阻塞,直到计算结束才恢复正常。
解决方法:异常回调传递,Forever
进行进程监视等。
Node.js代码举例:
在Node.js
上建一个http
服务器
const http = require('http');
// 创建一台服务器
var server = http.createServer(function (request, response) { //当有人来访问这个服务器时,就会执行function 这个回调函数
console.log('有人来访问我了');
response.write('smyhvae'); //向浏览器输出内容
response.end(); //结束
});
server.listen(8080);
// function 回调函数里可以设置两个参数:request 和 response。response.write()表示向浏览器输出信息
注:
Node.js
是通过commonJS
规范实现模块系统的(require
、exports
、module.exports
)