跟我学Node.js(四)---Node.js的模块载入方式与机制 |
其它的如通过NPM安装的第三方模块(third-party modules)或本地模块(local modules),每个模块都会暴露一个公开的API 。以便开发者可以导入 。如 复制代码 代码如下: var mod = require(module_name) 此句执行后,Node内部会载入内置模块或通过NPM安装的模块 。require函数会返回一个对象,该对象公开的API可能是函数,对象,或者属性如函数,数组,甚至任意类型的JS对象 。 这里列下node模块的载入及缓存机制 1)载入内置模块(A Core Module) 一、载入内置模块 Node的内置模块被编译为二进制形式,引用时直接使用名字而非文件路径 。当第三方的模块和内置模块同名时,内置模块将覆盖第三方同名模块 。因此命名时需要注意不要和内置模块同名 。如获取一个http模块 复制代码 代码如下: var http = require(http) 返回的http即是实现了HTTP功能Node的内置模块 。 二、载入文件模块 绝对路径的 复制代码 代码如下: var myMod = require(/home/base/my_mod) 或相对路径的 复制代码 代码如下: var myMod = require(./my_mod) 注意,这里忽略了扩展名“.js”,以下是对等的 复制代码 代码如下: var myMod = require(./my_mod) var myMod = require(./my_mod.js) 三、载入文件目录模块 可以直接require一个目录,假设有一个目录名为folder,如 复制代码 代码如下: var myMod = require(./folder) 此时,Node将搜索整个folder目录,Node会假设folder为一个包并试图找到包定义文件package.json 。如果folder目录里没有包含package.json文件,Node会假设默认主文件为index.js,即会加载index.js 。如果index.js也不存在,那么加载将失败 。 假如目录结构如下 package.json定义如下 复制代码 代码如下: { "name": "pack", "main": "modA.js" } 此时 require(./folder) 将返回模块modA.js 。如果package.json不存在,那么将返回模块index.js 。如果index.js也不存在,那么将发生载入异常 。 四、载入node_modules里的模块 如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索 。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录 。 不必担心,npm命令可让我们很方便的去安装,卸载,更新node_modules目录 。 五、自动缓存已载入模块 对于已加载的模块Node会缓存下来,而不必每次都重新搜索 。下面是一个示例 modA.js 复制代码 代码如下: console.log(模块modA开始加载...) exports = function() { console.log(Hi) } console.log(模块modA加载完毕) init.js 复制代码 代码如下: var mod1 = require(./modA) var mod2 = require(./modA) console.log(mod1 === mod2) 命令行执行: node init.js 输入如下 可以看到虽然require了两次,但modA.js仍然只执行了一次 。mod1和mod2是相同的,即两个引用都指向了同一个模块对象 。 |