Node的发展史
2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库.
2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用。
2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。
2010年年底,Node.js获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node.js的发展。
2011年7月,Node.js在微软的支持下发布Windows版本。
Node是什么
Node或者Node.js,是一个可以让JavaScript运行在服务端的平台。
在官方文档上的解释为Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
官方的意思是: node.js是建立在Chrome的V8 上面的一个JavaScript引擎
node.js 和JavaScript
在传统意义上,JavaScript是由ECMAScript,文档对象模型(DOM)和浏览器对象模型(BOM)组成。是一个运行在浏览器端的脚本语言。而Node的诞生,可以让JavaScript运行在浏览器端之外的平台。
简单来说:Node就是一个让JavaScript运行在服务端的开发平台
Node的主要特点
异步式I/O与事件驱动
Node.js最大的特点就是采用异步式I/O与事件驱动的架构设计。对于高并发的解方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式I/O调用的时间开销。Node.js使用的是单线程模型,对于所有I/O都采用异步式请求方式,避免繁琐的上下文切换,Node.js在执行过程中会维护一个事件队列,程序在事件循环等待下一个事件到来,每个异步式I/O请求完成后会被推送到事件队列,等待程序进程进行处理。
下面是一个Node.js中异步的方式读取文件的一个例子
const fs = require('fs')
fs.readFile('file.text', 'utf-8', (err, data) => {
if (err) {
console.log(err)
} else(
console.log(data)
)
})
console.log('end')
-输出结果是
$ node text.js
end
这是一个测试文件
同步读取的例子
const fs = require('fs')
const data = fs.readFileSync('file.text', 'utf-8');
console.log(data)
console.log("end")
-输出结果是
$ node text.js
这是一个测试文件
end
同步式读取文件的方式比较容易理解,将文件名作为参数传入fs.readFileSync函数,阻塞等待读取完成后,将文件的内容作为函数的返回值赋给data变量,然后控制台输出data的值,最后输出end
而异步读取文件的方式就不太容易理解了。要理解的话,我们就必须先知道在Node中,异步式I/O是通过回调函数来实现的。fs.readFile,接收了三个参数,文件名,编码方式,和回调函数,fs.readFile调用时所做的工作只是将异步式I/O请求发送给了操作系统,然后返回并执行后面的语句,执行完以后进入事件循环监听事件。当fs接受到I/O请求完成的事件时,事件循环会主动调回回调函数以完成后续工作。所有我们会先看到end,在看到file.text文件的内容。
总结
- Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境
- Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效