原书作者:朴灵 book.douban.com/subject/257…

这次算是重读 深入浅出Nodejs,了解到很多之前疏忽的细节,收获蛮多,这次趁便将其记录共享,对学习和了解Nodejs有及其大的协助。

1.Nodejs

  • 事情驱动、

    非堵塞IO,一个开源和跨渠道的 JavaScript 运转时环境

  • 异步I/O:每个调用之间无须等候之前的I/O调用结束;

  • 事情:轻量级、松耦合、只重视事务点;

  • Node拿手I/O密集型的应用场景;(合适面向网络,不合适慢IO,如读磁盘)

2.模块

  • CommonJS的模块标准。Node中引进模块三步:路径分析、文件定位、编译履行;
  • 不论是中心模块仍是文件模块,require()办法对相同模块的二次加载都一律选用缓存优先的办法,这是第一优先级的。不同之处在于中心模块的缓存查看先于文件模块的缓存查看;

浅读-《深入浅出Nodejs》

3.异步IO

  • 单线程异步编程,极大的运用资源,防止单线程堵塞,更好的运用CPU;
  • 完美的异步I/O应该是应用程序发起非堵塞调用,无须经过遍历或许事情唤醒等办法轮询,能够直接处理下一个使命,只需在I/O完结后经过信号或回调将数据传递给应用程序即可;
  • 留意:Nodejs单线程仅仅只是JavaScript履行在单线程中。在Node中,无论是*nix仍是Windows渠道,内 部完结I/O使命的还有线程池;

Node异步I/O

  • 事情循环:Node便会创立一个类似于while(true)的循环,每履行一次循环体的进程我们称为Tick。每个Tick的进程便是查看是否有事情待处理,假如有,就取出事情及其相关的回调函数。假如存在关联的回调函数,就履行它们。然后进入下个循环,假如不再有事情处理,就退出进程;
  • 观察者:在每个Tick的进程中,怎么判别是否有事情需要处理呢?这里必须要引进的概念是观察者。每个事情循环中有一个或许多个观察者,而判别是否有事情要处理的进程,便是向这些观察者问询是否有要处理的事情;

事情循环是一个典型的生产者/顾客模型。异步I/O、网络恳求等则是事情的生产者,源源不断为Node供给不同类型的事情,这些事情被传递到对应的观察者那里,事情循环则从观察者那里取出事情并处理;

浅读-《深入浅出Nodejs》

非I/O异步API

setTimeout()setInterval()setImmediate()process.nextTick()

setTimeout

  • setTimeout()setInterval()浏览器中的API是一致的,分别用于单次和屡次守时履行使命。
  • 调用setTimeout()或许setInterval()创立的守时器会被刺进到守时器观察者内部的一个红黑树中。每次Tick履行时,会从该红黑树中迭代取出守时器目标,查看是否超越守时时刻,假如超越,就构成一个事情,它的回调函数将当即履行。

浅读-《深入浅出Nodejs》

process.nextTick

  • 每次调用process.nextTick()办法,只会将回调函数放入行列中,鄙人一轮Tick时取出履行;

setImmediate

  • setImmediate() 参数传入的任何函数都是在事情循环的下一个迭代中履行的回调;
  • 延迟 0 毫秒的 setTimeout() 回调与 setImmediate() 十分类似。 履行顺序取决于各种因素,但是它们都会在事情循环的下一个迭代中运转;

差异

  • 传给 process.nextTick() 的函数会在事情循环的当时迭代中(当时操作结束之后)被履行。 这意味着它会始终在 setTimeoutsetImmediate 之前履行。
  • 同步和异步的差异。也便是说,是否是同步仍是异步,重视的是使命完结时消息告知的办法。由调用方盲目自动问询的办法是同步调用,由被调用方自动告知调用方使命已完结的办法是异步调用;
  • 是否是堵塞仍对错堵塞,重视的是接口调用(发出恳求)后等候数据返回时的状态。被挂起无法履行其他操作的则是堵塞型的,能够被当即「抽离」去完结其他「使命」的则对错堵塞型的;

参阅文章:zhuanlan.zhihu.com/p/22707398

4.异步编程

  • 长处:运用事情循环的办法,JavaScript线程像一个分配使命和处理结果的大管家,I/O线程池里的各个I/O线程都是小二,担任兢兢业业地完结分配来的使命,小二与管家之间互不依靠,坚持全体高效率
  • 缺陷:这个模型的缺陷则在于管家无法承当过多的细节性使命,假如承当太多,则会影响到使命的调度;(CPU密集型是缺点)

异步编程解决方案

  • 事情发布/订阅形式;
  • Promise/Deferred形式;
  • 流程操控库;

异步并发操控

  • 异步调用的并发约束在不同场景下的需求不同:非实时场景下,让超出约束的并发暂时等候履行能够满意需求;(一个行列来操控并发量,假如当时活泼(指调用发起但未履行回调)的异步调用量小于限定值,从行列中取出履行。假如活泼调用达到限定值,调用暂时存放在行列中。❑ 每个异步调用结束时,从行列中取出新的异步调用履行)

5.内存操控

  • V8堆内存的最大值在64位体系上为1464 MB, 32位体系上则为732 MB;
  • 在V8中,主要将内存分为新生代和老生代两代。新生代中的目标为存活时刻较短的目标,老生代中的目标为存活时刻较长或常驻内存的目标;
  • Node的内存构成主要由经过V8进行分配的部分和Node自行分配的部分,受V8的垃圾回收约束的主要是V8的堆内存。(运用堆外内存能够打破内存约束的问题,如 Buffer
  • 内存走漏原因:缓存、行列消费不及时、作用域未开释;
  • 操作大文件能够运用stream模块用于处理;

6.了解Buffer

  • Buffer主要用于操作字节;
  • 小而频繁的Buffer操作时,选用slab的机制进行预先请求和过后分配,使得JavaScript到操作体系之间不用有过多的内存请求方面的体系调用;
  • 大块的Buffer目标,直接运用C++层面供给的内存;

7.网络编程

Nodejs供给的netdgramhttptls等模块,让面向网络编程更加便捷。

经过http模块即可快速建立Web服务器;网络是轻IO操作,再配合上Nodejs异步IO,Nodejs在面向网络编程方面能维持的并发量和QPS都是不容小觑的;

8.构建Web应用

告知开发者怎么经过Nodejs构建一个合格的网络应用服务。

  1. 运用Nodejs配合http模块建立路由服务;
  2. 解析、运用和存储Cookie;
  3. Session运用和存储,包含怎么高效管理Session;
  4. 经过网络缓存防止带宽糟蹋;
  5. 数据上传需要留意点:大文件运用流式解析、约束上传内容的巨细、防止CSRF进犯加强校验;
  6. 中间件的理念和实现;

9.玩转进程

  1. 服务模型:同步——>复制进程——>多线程——>事情驱动;
  2. child_process模块建立多进程;

感谢 朴灵 写出这样的好书,并且共享给开发者。