您好,欢迎访问一九零五行业门户网

跟我学Node.js(四)---Node.js的模块载入方式与机制_javascript技巧

其它的如通过npm安装的第三方模块(third-party modules)或本地模块(local modules),每个模块都会暴露一个公开的api。以便开发者可以导入。如
复制代码 代码如下:
var mod = require('module_name')
此句执行后,node内部会载入内置模块或通过npm安装的模块。require函数会返回一个对象,该对象公开的api可能是函数,对象,或者属性如函数,数组,甚至任意类型的js对象。
这里列下node模块的载入及缓存机制
1)载入内置模块(a core module)
2)载入文件模块(a file module)
3)载入文件目录模块(a folder module)
4)载入node_modules里的模块
5)自动缓存已载入模块
一、载入内置模块
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是相同的,即两个引用都指向了同一个模块对象。
其它类似信息

推荐信息