# 其他
# 异步式I/O和事件驱动
Node.js 采用了单进程单线程
、异步式I/O
、事件驱动
的程序设计模型,实现了:包和模块
、文件系统
、网络通信
、操作系统API
等功能,它是非阻塞的。
# 异步式I/O
线程1
将 I/O操作 发送给操作系统
,继续执行后面的语句;- 执行完后,会马上进入 事件循环(不断地检查 事件队列 有没有未处理的事件)
- 当操作系统完成 I/O操作 时,以 事件 的形式发送到 事件队列
线程1
在 事件循环 中,检查到 事件队列 存在未处理的事件;事件循环 会 主动调用回调函数 来完成后续工作
# 事件驱动events
events
模块提供了唯一的接口,它几乎被所有的模块依赖。events
模块只提供一个对象:events.EventEmitter
,其核心就是 事件发射 和 事件监听 功能的封装。
var events = require('events')
var emitter = new events.EventEmitter()
emitter.on('someEvent', name => console.log(name))
emitter.emit('someEvent', 'name')
1
2
3
4
5
2
3
4
5
# require的过程
require
命令的基本功能是,读取并执行一个指定的文件,然后返回 该模块 的exports
对象。
他的加载规则:
加载目录
- 找到目录下
package.json
的main
字段
{ "name": "some-dir", "main": "./lib/some-lib.js" }
1
2
3
4- 找不到
package.json
,会找index.js
、index.node
- 找到目录下
加载文件(最初是以
.js
为后缀)- 以
/
开头,则按绝对路径去加载该模块 - 以
./
开头,则按相对该脚本的路径去加载该模块 - 没有开头
- 按加载
核心模块
的方式去加载该模块 - 找不到,再按
第三方模块
的方式去加载该模块- 例如
require('foo.js')
// 按`核心模块`的方式去加载 /usr/local/lib/node/foo.js // 按`第三方模块`的方式去加载(最近一个node_modules) /home/user/projects/node_modules/foo.js // 按`第三方模块`的方式去加载(最近第二个node_modules) /home/user/node_modules/foo.js // 按`第三方模块`的方式去加载(最近第三个node_modules) /home/node_modules/foo.js // 按`第三方模块`的方式去加载(最近第四个node_modules) /node_modules/foo.js
1
2
3
4
5
6
7
8
9
10
11 - 例如
- 按加载
- 以