Node.js的特点和应用场景介绍


Posted in Javascript onNovember 04, 2014

Node.js应该是当今最火热的技术之一。本文主要介绍Node.js的特点及应用场景。

Node.js是一个基于Chrome JavaScript运行时建立的一个平台,用来方便地搭建快速的 易于扩展的网络应用。Node.js借助事件驱动,非阻塞I/O模型变得轻量和高效,非常适合 运行在分布式设备的数据密集型实时应用。

1. 特点

1.1 异步I/O

所谓的异步I/O,是相对同步I/O而言的。程序执行过程中必然要进行很多I/O操作,如读写文件、输入输出、请求响应等等。通常来说,I/O操作是非常费时的。例如在传统的编程模式中,你要读一个几G的文件,整个线程都暂停下来,等待文件读完后继续执行。换言之,I/O操作阻塞了代码的执行,极大地降低了程序的效率。

关于异步I/O,其实对于前端工程师来说并不陌生,因为发起Ajax请求就是最常见的一种“异步”调用。在Node中,以读取文件(读文件是一种耗时的I/O操作)为例,它与发起Ajax请求的写法很像:

var fs = require('fs');

fs.readFile('/path', function(err, file) {

    console.log('读取文件完成');

});

console.log('开始读取文件');

上述代码在调用fs.readFile后,后续代码是被立即执行的,“读取文件完成”的时刻是无法预知的。当线程遇到I/O操作时不会以阻塞的方式等待I/O操作结束,而只是将I/O请求发送给操作系统,继续执行后续语句。当操作系统完成I/O操作时以事件的形式通知执行I/O操作的线程,线程会在特定时间处理这个事件。

1.2 事件循环与回调函数

所谓事件循环是指Node会把所有的异步操作使用事件机制解决,有个线程在不断地循环检测事件队列。事件循环会检查事件队列中有没有未处理的事件,直到程序结束。事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务的场景下,事件与事件之间各自独立,如何协作是一个问题。在Javascript中,回调函数无处不在,回调函数是最好的接受异步调用返回数据的方式。

1.3 单线程

Node保持了JS在浏览器中单线程的特点。单线程的最大好处是不用像多线程编程那样出处在意状态的同步问题,没有死锁的存在,也没有线程上下文切换的开销。单线程也有其弱点,主要表现在三方面:无法利用多核CPU;错误会引起整个应用退出,应用的健壮性值得考研;大量计算会占用CPU导致无法继续调用异步I/O。

为了解决上述问题,Node采用了与HTML5 Web Workers相同的思路,使用child_process来解决但单线程中大计算量的问题。通过将计算分发到各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递结果。

1.4 跨平台

Node是跨平台的,即同样的一套JS代码都可以部署运行在Windows、Linux、OSX等平台。这主要得益于Node在操作系统与Node上层模块系统之间构建了一层平台层架构libuv。

Node.js的特点和应用场景介绍

2. 应用场景

1)、实时应用:如在线聊天,实时通知推送等等(如socket.io)
2)、分布式应用:通过高效的并行I/O使用已有的数据
3)、工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序
4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)
5)、利用稳定接口提升Web渲染能力
6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)

Javascript 相关文章推荐
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
Oct 26 Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
javascript中Number的方法小结
Nov 21 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
在vue中使用echarts图表实例代码详解
Oct 22 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
js中数组常用方法总结(推荐)
Apr 09 Javascript
Echarts动态加载多条折线图的实现代码
May 24 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 Javascript
Node.js中的模块机制学习笔记
Nov 04 #Javascript
Node.js异步I/O学习笔记
Nov 04 #Javascript
JavaScript中的ubound函数使用实例
Nov 04 #Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 #Javascript
网页中表单按回车就自动提交的问题的解决方案
Nov 03 #Javascript
详解jquery中$.ajax方法提交表单
Nov 03 #Javascript
jquery处理json对象
Nov 03 #Javascript
You might like
BBS(php & mysql)完整版(六)
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
js中的 || 与 && 运算符详解
2018/05/24 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python中的time模块与datetime模块用法总结
2016/06/30 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
python selenium xpath定位操作
2020/09/01 Python
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
请说出以下代码输出什么
2013/08/30 面试题
校园安全广播稿范文
2014/09/25 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
四大名著读书笔记
2015/06/25 职场文书
酒店厨房管理制度
2015/08/06 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
python基础之文件处理知识总结
2021/05/23 Python
详解JAVA的控制语句
2021/11/11 Java/Android
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL