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 相关文章推荐
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
Dec 31 Javascript
javascript结合canvas实现图片旋转效果
May 03 Javascript
artDialog+plupload实现多文件上传
Jul 19 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 Javascript
一个例子轻松学会Vue.js
Jan 02 Javascript
angularJs的ng-class切换class
Jun 23 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
微信小程序实现文字跑马灯
May 26 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
解决layui 表单元素radio不显示渲染的问题
Sep 04 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
用PHP制作静态网站的模板框架
2006/10/09 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
php编写简单的文章发布程序
2015/06/18 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
微信跳一跳自动运行python脚本
2018/01/08 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
如何用Django处理gzip数据流
2021/01/29 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
代办委托书怎样写
2014/04/08 职场文书
小学运动会口号
2014/06/07 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技