入门篇:
Node.js采用了事件驱动
和非阻塞I/O
的模型,利用了JavaScript的单线程
模型和异步I/O
的特性,使得Node.js能够高效处理大量的并发请求。
一、Node 的特点
1、异步I/O
2、事件与回调函数
3、单线程
4、跨平台
二、Node 的应用场景
1、I/O密集型
I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。
2、是否不擅长CPU密集型业务
不适合长时间运行的计算,node没有提供多线程用于计算支持。但可以利用一下两种方式成分利用CPU:
- 编写C/C++的扩展。
- 如果单线程的Node不能满足需求,甚至用了C/C++扩展后还觉得不够,那么通过子进程的方式,将一部分Node进程当做常驻服务进程用于计算,然后利用进程间的消息来传递结果,将计算与IO分离,这样还能充分利用多CPU。
CPU密集不可怕,如何合理调度是诀窍。
3、分布式应用
三、模块机制
CommonJS规范
Node的模块实现
- Node并非完全按照规范实现,而是对规范进行了一定的取舍,同时增加了少许自身需要的特性。
// exports、require 和 module ,在node中引入模块需要经历如下三个步骤。
(1)路径分析;
(2)文件定位;
(3)编译执行;
在Node中模块分为两类:
核心模块
(Node提供的模块)
在编译成可执行文件的过程中被编译进二进制文件。
可分为 C/C++编写
(存放在Node项目的src目录下)的和JavaScript编写
(存放在bin目录下)的两部分。
文件模块
(用户编写的模块)
C/C++ 扩展模块
模块调用栈
包 与 NPM
前后端共用模块
模块的侧重点
AMD 规范
CMD 规范
兼容多种模块规范
总结
CommonJS提出的规范均十分简单,但是现实意义却十分强大。Node通过模块规范,组织了自身的原生模块,弥补JavaScript弱结构性的问题,形成了稳定的结构,并向外提供服务。NPM通过对包规范的支持,有效地组织了第三方模块,这使得项目开发中的依赖问题得到很好的解决,并有效提供了分享和传播的平台,借助第三方开源力量,使得Node第三方模块的发展速度前所未有,这对于其他后端JavaScript语言实现而言是从未有过的。从一定的角度上讲,CommonJS规范帮助Node形成了它的骨骼。只有苗壮的根,才能培养出茂盛的枝叶,并成长为参天大树。正是这些底层的规范和实践,使得Node有序地发展着,摆脱掉过去JavaScript纷乱和被误解的局面,进而进化成良性的生态系统