NodeJS的背景
题外话:
现在NodeJS的重要性不言而喻,工作中总是能接触到 ,所以,打算花一点时间来认真的学习NodeJs,打算做一个系列文章。一个是加深自己的理解,同时也算是拿出自己的意见来进行分享,和交流,如果有不对的地方,欢迎指正!我也是翻阅了很多Nodejs的书籍,看了很多视频教程。但是网上的知识碎片化很严重,无法看清一门技术的全面貌,总有一种雨里雾里的感觉。所以初学一门技术或者是语言,还是先从这门语言的背景说起。NodeJS 以下简称Node。话不多说,下面步入正题。
一:Node的背景
这是一门09你那出现的技术,到现在短短的7,8年时间。很多人都疑问,NodeJS为什么要用JS写,和JS有什么关系?NodeJS到底是什么?有什么特点?下面带着问题去探索答案。
(1)Node为什么要用JS来实现?
Node的作者Ryan Dahl从事的就是高性能Web服务器。在尝试了失败之后,他找到了设计高性能Web服务器的两个重要因素,事件驱动和非阻塞IO。
JS的开发门槛低,在后端部分一直没有市场,为他导入I/O库没有大的阻力
JS在浏览器中拥有广泛的事件支持,满足事件驱动的要求。
其次就是Chrome的V8虚拟机的性能非常的棒
基于以上几点,才选择javaScript 这门语言来开发Node。
二:Node给JavaScript按上了翅膀
我们都知道前端一直都想染指后端,Node的出现,无疑大大的增加了可行性!
谷歌的ChromeV8引擎性能非常棒,那么Node和Chrome有什么相同又有什么不同呢?
在浏览器中,存在HTML的布局引擎,还有Js的解析引擎,但是在Node中,Node是不操作HTML的,所有Node没有Webkit布局引擎。
相同点就是,他们都是基于事件的驱动的异步架构,浏览器通过事件驱动来服务界面交互,Node通过事件驱动来服务I/O,Node中的js可以搭建服务器端,可以连接数据库,可以玩多进程!从此他不只是局限于在浏览器中修改DOM,修改css样式。
三:Node的特点
1:异步I/O
什么是异步?打个比方的例子,比如我要买一个煎饼和一瓶汽水,当我走到煎饼摊,我跟老板说给我来个煎饼,老板说好嘞,不过得等五分钟,这时候我有两个选择,一个是在这里等五分钟,等老板摊煎饼,摊好之后我拿着煎饼在去买汽水。二个就是我先去买汽水,买完汽水回来煎饼也已经弄好了。一个简单的比方。同步就是当前代码没有执行完成,不能执行其他代码、而异步就是可以同一时间执行不同代码。
比如在Node中
var fs = require( ' fs ' );
fs.readFile('/path' , function(err,file){
console.log('读取文件完成')
})
console.log('开始读取文件')
在上面这个代码块中,如果是同步的话,会先打印"读取文件完成",在打印“开始读取文件”。但是实际上是先打印的开始读取文件,在打印读取文件成。也就是,此处是异步操作的。
fs.readFile('/path1' , function(err , file ){
console.log('我要用30s')
})
fs.readFile('/path' , function(err,file){
console.log('我要用60s')
})
如果要是同步执行,总共时间加起来应该是90s,但是实际上只是60种,也就是说读取这两个文件是同时执行的!在Node中,很多一部分操作都是用异步的方式来进行的;
2:事件与回调函数
var callback = function(){
console.log('我是callback')
}
button.onClick = function(callback){
callback();
}
在上面例子中,我们给Button添加了click事件,并且在把函数作为参数传入到事件函数中。
无论前端还是后端,事件都是通用的。事件的方式具有轻量级,松耦合,等特点。事件和事件之间都是相互独立的。在Node中,除了异步和事件之外,回调函数是一个特色,回调函数也是接受异步调用返回数据的一种方式。因此,在异步操作中,代码的执行顺序和书写顺序并没有多大的关系。
3:单线程
Node保持了JavaScript 单线程的特点。
单线程的优点:
不用在意状态同步的问题,没有死锁的存在,没有上下文切换带来的性能开销
单线程的缺点
(1)无法利用多核cpu
(2)错误会引起整个应用退出,应用的健壮性值得考验
(3)大量的计算占用cpu导致无法继续异步调用I/O;
4:跨平台
Node可以在win,Linux上使用,他的中间层封装了。
5:Node的应用场景
(1)I/O密集型
从单线程角度来说,Node处理I/O的能力是非常棒的。Node面向网络,擅长并行I/O,能够有效的组织起来硬件资源。I/O密集的优势主要是利用Node的事件循环处理能力。