Node.js的特性
简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境(runtime), 是一个让 JavaScript 运行在服务端的开发平台, 使用了一个事件驱动、非阻塞 I/O 的模型
非阻塞IO
以JS为例,JavaScript为一种单线程语言,所以如果有很多任务需要执行,只能等前面的任务执行完了,再执行后面的任务。一旦遇到大量任务或者遇到一个耗时的任务(一个I/O),网页就会被卡住。这种就是阻塞 I/O。而Node.js在I/O时函数立即返回,进程不等待I/O完成,因为有Event Loop 的概念来解决这个问题
Event Loop是一个程序结构,用于等待和发送消息和事件。简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为”主线程”;另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为”Event Loop线程”(可以译为”消息线程”)。当程序遇到耗时的I/O操作的时候,就交给Event Loop线程去处理,同时生成一个事件队列来放置这些未执行完的任务,并且监听这些I/O操作是否执行完成,主进程继续执行其他任务;等到I/O操作完成后,Event Loop线程再把结果返回主线程。主线程就调用事先设定的回调函数,完成整个任务。这样就提高了任务执行的效率,这种运行模式就是非阻塞IO 和事件驱动
事件驱动
I/O等异步操作结束后的通知,如上所述。其实就是观察者模式
事件循环 Event Loop
异步编程
常用API
path,fs,Buffer,EventEmitter,process
Web为什么最适合Node.js
用JS;在处理高并发(单位时间内访问量大)、I/O密集场景性能优势明显
CPU密集:做计算、逻辑判断(压缩、解压、加密、解密)
I/O密集:文件操作(文件存取)、网络操作(http)、数据库。CPU的处理速度是远大于I/O的,也就是分析web页面需求很快,但是从计算机拿文件比较慢
缺点 & 优点
优点
Node 是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node 上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多
缺点
Node 是一个相对新的开源项目,所以不太稳定,它总是一直在变,而且缺少足够多的第三方库支持。
容错性较差,一旦出错就整个线程挂掉
配合pm2等包,自动重启;
用途
前后端分离
模板渲染
同构
提供Javascript run time进行服务端渲染
日志上报
Nodejs的常用场景
http server与其他语言搭建的服务器对比
参考资料
慕课网-Node.js入门到企业Web开发中的应用
阮一峰的博客