node.js的特性与应用

nodejs作为后台javascript的运行平台,nodejs保留了前端浏览器javascript中的那些熟悉的接口,没有改变语言本身的任何特性, 依旧基于作用域和原型链,区别在于:它将前端中广泛运用的思想迁移到了服务器端

node特性

异步I/O(像浏览器中的异步事件驱动来思考)

浏览器中的异步事件驱动大家应该都比较清楚了,无非就是js的执行分为主线程与异步线程,发起一个事件是主线程,响应事件处理是异步的 线程,响应的时间未知。

  const fs = require('fs');
  fs.readFile('/path/xxx.txt', function(err, file) {
    if(!err){
        console.log('文件读取完成!');
    }
  });
  console.info('发起读取文件动作');

异步IO基础例子:point_up: 我们可以看出发起读取文件动作是发生在文件读取完成动作之前,主线程一般都是立即执行的,而异步调用则是在事件触发的时候执行的

异步IO时序图

事件与回调函数

node中的所有的事件,都是通过回调的方式来调用的,在调用回调函数的同时,也进行了参数的传递,将这个结果数据回传过来,这里主要是运用了node中的EventEmitter事件机制,几乎在node中的所有的 对象,大都从EventEmitter对象中继承了事件机制,实现了在异步调用结束时,触发原本设置的回调监听函数

单线程

由于node保留了javascript在浏览器中单线程的特点,而且在node中,javascript与其余的线程是无法共享任何状态的, 单线程最大的好处就是不用像多线程编程那样处处在意状态的同步问题,这里没有死锁的存在,也没有线程上下文交换所带来的性能上的开销 :warning: 但是,我们必须要明确晓得node是单线程这个与其他语言相比之下的"弱点",只有深刻了解了关于node的弱点,才能更好的扬长避短,须知任何的框架都不可能百分百完美! 一般地,单线程都 :u6307: 以下几个弱点:

  1. 无法利用多核CPU;
  2. 一旦出现异常,整个应用就会直接挂掉(没有其他措施的情况下),因此对于应用的异常处理有一定的考验;
  3. 大量在js主线程占据的CPU时间,将会导致无法调用异步I/O(因为卡住了)

:star2: 虽然node单线程的弱点有上述那么些点,但是对于node来说,它也提供了一个解决方案:child_process,设计出来的子进程,像浏览器中的webworker一样,将消耗较长CPU时间的动作,交给它来处理!!!

nodejs应用场景

  1. 前后端编程语言一致性
  2. 高性能实时应用:socket.io来实现实时通讯
  3. 并行I/O计算,提升WEB渲染性能
  4. 工具类应用(像目前vue-cli等脚手架)
  5. WEB服务应用
  6. 跨平台开发(ReactNative,Electron)

results matching ""

    No results matching ""