Page 139 - Node.js开发指南
P. 139
132 第 6 章 Node.js 进阶话题
在本书的最后一章,我们打算讨论几个独立的话题,主要内容包括:
模块加载机制;
异步编程模式下的控制流;
Node.js 应用部署;
Node.js的一些劣势。
6.1 模块加载机制
Node.js 的模块加载对用户来说十分简单,只需调用 require 即可,但其内部机制较为
复杂。我们通过这一节简要介绍一下 Node.js 模块加载的一些细节,帮你减少开发中可能遇
到的问题。
6.1.1 模块的类型
Node.js 的模块可以分为两大类,一类是核心模块,另一类是文件模块。核心模块就是
Node.js 标准 API 中提供的模块,如 fs、http、net、vm 等,这些都是由 Node.js 官方提供
的模块,编译成了二进制代码。我们可以直接通过 require 获取核心模块,例如
require('fs')。核心模块拥有最高的加载优先级,换言之如果有模块与其命名冲突,
Node.js 总是会加载核心模块。
文件模块则是存储为单独的文件(或文件夹)的模块,可能是 JavaScript 代码、JSON 或
编译好的 C/C++ 代码。文件模块的加载方法相对复杂,但十分灵活,尤其是和 npm 结合使
用时。在不显式指定文件模块扩展名的时候,Node.js 会分别试图加上 .js、.json 和 .node扩展
名。.js 是 JavaScript 代码,.json 是 JSON 格式的文本,.node 是编译好的 C/C++ 代码。
表 6-1总结了 Node.js 模块的类型,从上到下加载优先级由高到低。
表6-1 Node.js 模块的类别和加载顺序
核心模块 内 建
文件模块 JavaScript .js
JSON .json
C/C++扩展 .node
6.1.2 按路径加载模块
文件模块的加载有两种方式,一种是按路径加载,一种是查找 node_modules 文件夹。
如果 require 参数以“ / ”开头,那么就以绝对路径的方式查找模块名称,例如 require
('/home/byvoid/module') 将会按照优先级依次尝试加载 /home/byvoid/module.js、