这里有新鲜出炉的 7 天学会 Node.js,程序狗速度看过来!
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的 易于扩展的网络应用 · Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效, 非常适合 运行在分布式设备 的 数据密集型 的实时应用
这篇文章主要介绍了 Node.js 的特点和应用场景介绍, 本文讲解了 Node.js 的异步 I/O、 事件循环与回调函数、单线程、 跨平台等特性, 然后总结了它的使用场景, 需要的朋友可以参考下
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。
2. 应用场景
1)、实时应用:如在线聊天,实时通知推送等等(如 socket.io) 2)、分布式应用:通过高效的并行 I/O 使用已有的数据 3)、工具类应用:海量的工具,小到前端压缩部署(如 grunt),大到桌面图形界面应用程序 4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的 pomelo 框架) 5)、利用稳定接口提升 Web 渲染能力 6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯 Javascript 全栈式 MEAN 架构)
来源: http://www.phperz.com/article/17/0426/274405.html