# 其他

# 异步式I/O和事件驱动

Node.js 采用了单进程单线程异步式I/O事件驱动的程序设计模型,实现了:包和模块文件系统网络通信操作系统API等功能,它是非阻塞的。

# 异步式I/O

  • 线程1I/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

# require的过程

require命令的基本功能是,读取并执行一个指定的文件,然后返回 该模块exports对象。

他的加载规则:

  • 加载目录

    • 找到目录下package.jsonmain字段
    {
        "name": "some-dir",
        "main": "./lib/some-lib.js"
    }
    
    1
    2
    3
    4
    • 找不到package.json,会找index.jsindex.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
更新时间: 4/12/2020, 3:30:20 PM