共计 1689 个字符,预计需要花费 5 分钟才能阅读完成。
内容
1.Node 简介 2. 模块机制 3. 异步 I /O4. 异步编程 5. 内存控制 6. 理解 Buffer7. 网络编程 8. 构建 Web 应用 9. 玩转进程 10. 测试 11. 产品化
一、Node 简介
1.Node 的特点
异步 I /O
事件与回调函数
单线程 弱点:1)无法利用多核 CPU 2)错误会引起整个应用退出,应用的健壮性值得考验。3)大量计算占用 CPU 导致无法继续调用异步 I /O。
跨平台
2.Node 的应用场景
I/ O 密集型
是否不擅长 CPU 密集型业务
与遗留系统和平共处
分布式应用
3.Node 的使用者
前后端编程语言环境统一
Node 带来的高性能 I / O 用于实时应用
并行 I / O 使得使用者可以更高效地利用分布式环境
并行 I /O, 有效利用稳定接口提升 Web 渲染能力
云计算平台提供 Node 支持
游戏开发领域。
工具类应用
二、模块机制
1.CommonJs 规范
主要分为以下三个部分
模块引用 require() 方法接受模块标识,以此引入一个模块的 API 到当前上下文中
var math=require(‘math’);
模块定义 exports 对象用于导出当前模块的方法或变量,并且它是唯一导出的出口。module 对象,它代表模块本身,exports 是 module 的属性。在 node 中,一个文件就是一个模块,将方法挂载在 exports 对象上作为属性即可定义导出的方式
//math.js
exports.add=function(){
return ‘aaaa’
}
// program.js
var math=require(‘math’);
var a=math.add();//aaa
模块标识模块标识就是传递给 require() 方法的参数,它必须是符合小驼峰命名的字符串,或者以.、.. 开头的相对路径,或是绝对路径,可以没有文件名后缀.js
2.Node 的模块实现
在 node 中引入模块,需要经历如下三个步骤
路径分析
文件定位
编译执行
模块分为两类:
核心模块:node 提供的模块。在 node 源代码的编译过程中,编译进了二进制执行文件,加载速度快。
文件模块:用户编写的模块。运行时动态加载,速度比较慢。
1)优先从缓存中加载
node 对引入过的模块都会进行缓存,以减少二次引入时的开销,缓存的是编译和执行之后的对象 require() 方法对相同的模块二次加载都一律采用缓存优先的方式,核心模块的检查先于文件模块的缓存检查
2)路径分析和文件定位
模块标识符分析: 加载速度: 核心模块 > 路径形式的文件模块 > 自定义模块
文件定位: 文件扩展名分析:如果标识符中不包含文件扩展名,则按.js、.json、.node 的次序补足扩展名。目标分析和包: 如果没有查找到对应文件,但却得到一个目录,此时 node 会将目录当做一个包来处理
3)模块编译
对于不同的文件扩展名,载入方法不同,具体如下:
.js 文件: 通过 fs 模块同步读取文件后编译执行
.node 文件: 这是用 C /C++ 编写的扩展文件, 通过 dlopen() 方法加载最后编译生成的文件
.json 文件: 通过 fs 模块同步读取文件后,用 JSON.parse() 解析返回结果
其余扩展文件。它们都被当做.js 文件载入
require.extensions: 获取系统中已有的扩展加载方式。
编译方式:
JavaScript 模块的编译: 在编译过程中,对 js 内容进行了包装 执行之后,exports 属性被返回了调用方,被外部调用 (function(exports,require,module,__filename,__dirname){
// 内容
var math=require(‘./math’);
var a=math.add();
})
C/C++ 模块的编译调用 dlopen() 方法进行加载和执行
JSON 文件的编译通过 fs 模块同步读取文件后,用 JSON.parse() 得到对象,然后将它赋给模块对象的 exports, 以供外部调用
3. 核心模块
核心模块分为两部分:C/C++ 编写 (文件放在 Node 项目的 src 目录下),JavaScript 编写 (文件放在 Node 项目的 lib 目录下)。1)JavaScript 核心模块的编译过程
4.C/C++ 扩展模块
5. 模块调用栈
6. 包与 NPM
7. 前后端共用模块