第一章 Node简介
异步I/O
在Node中,绝大多数的操作都以异步的方式进行调用,从文件读取到网络请求。这样的意义在于,在Node中,我们可以从语言层面很自然地进行并行I/O操作。每个调用之间无须等待之前的I/O调用结束。
下面的两个文件读取任务的耗时取决于最慢的那个文件读取的耗时:
1 | fs.readFile('/path1', function (err, file) { |
而对于同步I/O而言,它们的耗时是两个任务的耗时之和。
事件与回调函数
事件的编程方式具有轻量级、松耦合、只关注事务点等优势。
纵观下来,回调函数也是最好的接受异步调用返回数据的方式。
第二章 模块机制
CommonJS模块规范
主要分为模块引用、模块定义、模块标识3个部分。
模块引用
1 | let math = require('math') |
模块定义
1 | exports.add = function () { |
模块标识
模块标识其实就是传递给 require()
方法的参数,它必须是符合小驼峰命名的字符串,或者以 . ..
开头的相对路径,或者绝对路径。它可以没有文件名后缀.js
。
Node的模块实现
在Node中引入模块,需要经历如下3个步骤。
(1)路径分析 (2)文件定位 (3)编译执行
在Node中,模块分为两类,一类是Node提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块。
优先从缓存加载
不论是核心模块还是文件模块,require()
方法对相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的,不同之处在于核心模块的缓存检查先于文件模块的缓存检查。