Fork me on GitHub
代码改变世界

node的特点

2017-03-11 11:47  autrol  阅读(1606)  评论(0编辑  收藏  举报

  作为后端JavaScript的运行平台,Node保留了前端浏览器JavaScript中那些熟悉的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链,区别在于它将前端中广泛运用的思想迁移到了服务器端。下面我们来看看Node相较其他语言的一些特点。

异步I/O

对于熟悉Javascript的同学来说,非常好理解,以读取文件为例:

var fs = require('fs');

fs.readFile('/path1', function(err, file) {
console.log('读取完成path1');
});
fs.readFile('/path2', function(err, file) {
console.log('读取完成path2');
});
console.log('开始读取文件');

当同时发起多个I/O请求时,异步I/O能极大的提升效率。

事件与回调函数

  事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务的场景下,事件与事件之间各自独立,如何协作是一个问题。
  与其他的Web后端编程语言相比,Node除了异步和事件外,回调函数是一大特色。纵观下来,回调函数也是最好的接受异步调用返回数据的方式。但是这种编程方式对于很多习惯同步思路编程的人来说,也许是十分不习惯的。

单线程

  单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,没有死锁的存在,也没有线程上下文交换所带来的性能上的开销。同样,单线程也有它自身的弱点,这些弱点是学习Node的过程中必须要面对的。单线程的弱点具体有以下3方面:

  • 无法利用多核CPU。
  • 错误会引起整个应用退出,应用的健壮性值得考验。
  • 大量计算占用CPU导致无法继续调用异步I/O。
    解决办法是: 使用child_process模块,启动多进程。在"玩转进程"中,会详细说明这块。

跨平台

兼容Windows和*nix平台主要得益于Node在架构层面的改动,它在操作系统与Node上层模块系统之间构建了一层平台层架构,即libuv。目前,libuv已经成为许多系统实现跨平台的基础组件。

跨平台流程图

Node契合的应用场景: 在进行技术选型之前,需要了解一项新技术具体适合什么样的场景,毕竟合适的技术用在合适的场景可以起到意想不到的效果。通常,说Node擅长I/O密集型的应用场景基本上是没人反对的。Node面向网络且擅长并行I/O,能够有效地组织起更多的硬件资源,从而提供更多好的服务。I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。