Node笔记七(深入浅出nodejs第一遍阅读读后笔记一)
Node的特点作为后端js运行平台,Node保留了前端浏览器js中那些熟悉的接口,同时底层也封装了大量的异步I/O的APINode保持了js在浏览器中单线程的特点。而且在Node中,js与其余线程无法共享任何状态单线程的弱点具体有以下三个方面无法利用多核CPU(child_process 子进程 已解决)错误会引起整个应用的退出,应用的健壮性值得考验大量计算占用CPU导致无法继续调...
·
资源
各种进阶资源 + 联系方式请看下方链接
资源
Node的特点
- 作为后端js运行平台,Node保留了前端浏览器js中那些熟悉的接口,同时底层也封装了大量的异步I/O的API
- Node保持了js在浏览器中单线程的特点。而且在Node中,js与其余线程无法共享任何状态
- 单线程的弱点具体有以下三个方面
- 无法利用多核CPU(child_process 子进程 已解决)
- 错误会引起整个应用的退出,应用的健壮性值得考验
- 大量计算占用CPU导致无法继续调用异步I/O(web workers创建工作进程来进行计算 线程可共享进程资源 工作进程不阻塞主进程 可通过消息传递方式传递运行结果)
- Node的应用场景
- I/O密集型
- Node可以通过编写C/C++扩展的方式更高效的利用CPU,将一些V8不能做到的性能极致的地方通过C/C++来实现
- 如果单线程的Node不能满足需求,甚至用了C/C++扩展后还觉得不够,那么通过子进程的方式,将一部分Node进程当作常驻服务进程用于计算,然后利用进程间的消息来传递结果,将计算与I/O分离这样还能充分利用多CPU
- Node的使用者的运用
- 前后端编程语言环境统一 。这类倚重点的代表是雅虎。雅虎开放了Cocktail框架,利用自己深厚的前端沉淀,将YUI3这个前端框架的能力借助Node延伸到了服务器端,使得使用者摆脱了日常工作中一边写js一边写php带来的上下文交换负担
- Node带来的高性能I/O用于实时应用。voxer将Node应用在实时语音上。国内腾讯的朋友网将Node应用在长链接上,以提供实时功能。花瓣网 蘑菇街等公司利用socket.io实现实时通知的功能
- 并行I/O使得使用者可以更高效的利用分布式环境。阿里巴巴和eBay是这方面的典型,阿里的NodeFox和eBay的ql.io都是借用Node并行I/O的能力,更高效的使用已有的数据
- 并行I/O,有效利用稳定借口提升WEB渲染能力,雪球财经和LinkedIn的移动版网站均是这种案例,抛弃同步等待式的请求,大胆的使用并行I/O,加速数据的获取进而提升web的渲染速度
- 云计算平台提供Node支持。微软将Node引入Azure的开发中,阿里云,百度纷纷在云服务器上面提供Node应用托管服务,joyent更是云计算中提供Node支持的代表,这类平台看中js带来的开发上的优势,以及低资源占用、高性能的特点
- 游戏开发领域 有网易开源的pomelo实时框架
- 工具类应用
模块机制
- C/S应用。客户端/服务器模式
- B/S应用。浏览器/服务器模式
- js先天缺乏的一种功能 - 模块
- CommonJS规范为js制定了一个美好的愿景,希望js在任何地方都可以运行
- 在CommonJS规范中,存在require()方法,这个方法接受模块标识,一次引入一个模块的API到当前上下文中
- 模块定义
- 模块中 上下文提供require()方法引入外部模块,对应引入的功能,上下文提供了exports对象用于导出当前模块的方法或者变量,并且他是唯一导出的出口。在模块中还存在一个module对象,它代表模块自身,而exports是module的属性,在Node中,一个文件就是一个模块,将方法挂在exports对象上作为属性即可定义导出的方式 如
exports.add= function(){} 在另一个文件中用require接受
- 在Node中引入模块需要经历以下三个步骤
- 路径分析
- 文件定位
- 编译执行
- 在Node中模块分为两类:一类是Node提供的模块称为核心模块,另一类是用户自定义编写的模块称为文件模块
- 核心模块部分在Node源代码编译的过程中,编译了二进制执行文件,在Node进程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤就可以省略掉,并且在路径分析中优先判断,所以他的加载速度是最快的
- 文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程。速度比核心模块慢
- 模块加载过程
- 优先缓存加载。无论是核心模块还是文件模块,require()方法对相同模块的二次加载都一律采用缓存有限的方式,这是第一优先级的,不同之处在于核心模块的缓存检查先于文件模块的缓存检查
- 模块标识符分析。核心模块如:http、fs、path、 或以. …开始的相对路径文件模块,以/开头的绝对路径文件模块,非路径形式的文件模块,如自定义的connect模块
- 核心模块的加载优先级仅次于缓存加载,如果试图加载一个与核心模块标识符相同的自定义模块是不会成功的
- 文件定位:require()在分析标识符的过程中会出现标识符中不包含文件扩展名的情况,在这种情况下Node就会按照js、.node、.json、次序依次尝试,在尝试过程中,需要调用fs模块同步阻塞式的判断文件是否存在,所以对于不是.js文件的文件加上扩展名会提高一点性能
更多推荐
已为社区贡献1条内容
所有评论(0)