- 发布于
<<深入浅出nodejs >>
1. Node.js
- 事件驱动、非阻塞IO,一个开源和跨平台的 JavaScript 运行时环境;
- 异步I/O:每个调用之间无须等待之前的I/O调用结束;
- 事件:轻量级、松耦合、只关注事务点;
- Node擅长I/O密集型的应用场景;(适合面向网络,不适合慢IO,如读磁盘)
- 单一语言:JavaScript用于服务器端和客户端,有助于减少上下文切换;
- 大量的第三方库:通过npm(Node包管理器)可以安装和使用大量的开源库;
2. 模块
- CommonJS的模块规范。Node中引入模块三步:路径分析、文件定位、编译执行;
- 不论是核心模块还是文件模块,require()方法对相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的。不同之处在于核心模块的缓存检查先于文件模块的缓存检查;
- 模块的本质是对象:在Node.js中,每个文件都被视为一个独立的模块,模块内部的变量是私有的,通过module.exports或exports暴露接口;
3. 异步IO
- 单线程异步编程,极大的利用资源,避免单线程阻塞,更好的利用CPU;
- 完美的异步I/O应该是应用程序发起非阻塞调用,无须通过遍历或者事件唤醒等方式轮询,可以直接处理下一个任务,只需在I/O完成后通过信号或回调将数据传递给应用程序即可;
- 注意:Node.js单线程仅仅只是JavaScript执行在单线程中。在Node中,无论是*nix还是Windows平台,内部完成I/O任务的另有线程池;
4. 异步编程
- 优点:利用事件循环的方式,JavaScript线程像一个分配任务和处理结果的大管家,I/O线程池里的各个I/O线程都是小二,负责兢兢业业地完成分配来的任务,小二与管家之间互不依赖,保持整体高效率;
- 缺点:这个模型的缺点则在于管家无法承担过多的细节性任务,如果承担太多,则会影响到任务的调度;(CPU密集型是弱点)
- 异步编程解决方案:
- 事件发布/订阅模式;
- Promise/Deferred模式;
- 流程控制库如async/await;
- 异步并发控制:
- 异步调用的并发限制在不同场景下的需求不同:非实时场景下,让超出限制的并发暂时等待执行可以满足需求;
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. 网络编程
- Node.js提供的net、dgram、http、tls等模块,让面向网络编程更加便捷。
- 通过http模块即可快速搭建Web服务器;网络是轻IO操作,再配合上Node.js异步IO,Node.js在面向网络编程方面能维持的并发量和QPS都是不容小觑的;
8. 构建Web应用
告诉开发者如何通过Node.js构建一个合格的网络应用服务。
- 使用Node.js配合http模块搭建路由服务;
- 解析、使用和存储Cookie;
- Session使用和存储,包括如何高效管理Session;
- 通过网络缓存避免带宽浪费;
- 数据上传需要注意点:大文件使用流式解析、限制上传内容的大小、避免CSRF攻击加强校验;
- 中间件的理念和实现;
9. 玩转进程
- 服务模型:同步——>复制进程——>多线程——>事件驱动;
- child_process模块搭建多进程;
- 利用cluster模块实现多核CPU的利用;
- 进程间通信(IPC);
- 守护进程的创建和管理。
非I/O异步API
setTimeout()
、setInterval()
、setImmediate()
和process.nextTick()
;setTimeout
和setInterval
与浏览器中的API是一致的,分别用于单次和多次定时执行任务。- 调用
setTimeout()
或者setInterval()
创建的定时器会被插入到定时器观察者内部的一个红黑树中。每次Tick执行时,会从该红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过,就形成一个事件,它的回调函数将立即执行。
process.nextTick
- 每次调用
process.nextTick()
方法,只会将回调函数放入队列中,在下一轮Tick时取出执行;
setImmediate
setImmediate()
参数传入的任何函数都是在事件循环的下一个迭代中执行的回调;- 延迟 0 毫秒的
setTimeout()
回调与setImmediate()
非常相似。 执行顺序取决于各种因素,但是它们都会在事件循环的下一个迭代中运行;
区别
- 传给
process.nextTick()
的函数会在事件循环的当前迭代中(当前操作结束之后)被执行。 这意味着它会始终在setTimeout
和setImmediate
之前执行。 - 同步和异步的区别。也就是说,是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用;
- 是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的;
区别
名词解释
异步 I/O
I/O: (英语:Input/Output) I/O操作包括读写操作、输入输出、请求响应等等
AJAX
Asynchronous JavaScript and XML: 异步的JavaScript与XML技术
XML
Extensible Markup Language: 可扩展标记语言
GUI编程
GUI: Graphical User Interface(图形用户接口)
GUI编程就是编出一个图形用户界面的软件.
C/S模型 和 B/S模型
C/S模型: (Customer/Server, 客户服务模型), 特点:非对等相互作用,即客户与服务器处于不平等的地位。
B/S模型(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件