manlili blog

Node模块

由于js从初始诞生时就存在命名空间问题,nodejs通过加载不同的包,将变量取值范围固定在包内,加载进来后不会产生命名空间冲突,这样的包也称为模块,为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
github地址:https://github.com/manlili/node_learn里面lesson02和lesson03

接口方式创建模块

先来看下目录
图
Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
想要在teacher.js引用student.js里面的方法,我们可以用exports方式,下面来看student.js代码:

1
2
3
4
5
6
function list(student) {
for (var i=0 ; i< student.length ; i++) {
console.log("学生姓名:"+student[i])
}
}
exports.print = list;

在以上示例中,student.js 通过 exports 对象把 print 作为模块的访问接口,在teacher.js 中通过 require(‘./student’) 加载这个模块,然后就可以直接访 问 student.js 中 exports 对象的成员函数了。
下面来看teacher.js代码:

1
2
var student = require('./student');
student.print(["lili", "zhangtian"]);

在上面实例中,通过require就可以在teacher.js加载student.js里面的print方法。

然后在node控制台输入命令,运行teacher.js就可以看到效果了。
图

对象方式创建模块

有时候我们只是想把一个对象封装到模块中,下面来看student.js代码:

1
2
3
4
5
6
7
8
function print () {
this.list = function (student) {
for (var i=0 ; i< student.length ; i++) {
console.log("学生姓名:"+student[i])
}
}
}
module.exports = print;

下面来看teacher.js里面用创建对象方式引入模块的代码:

1
2
3
var Student = require('./student');
student = new Student();
student.list(["lili", "zhangtian"]);

在外部引用该模块时,其接口对象就是要输出的 Student 对象本身,而不是原先的 exports。
然后在node控制台输入命令,运行teacher.js就可以看到效果了。
图

node自带的模块

有些模块已经写入node.js内部,可以直接引入,像:

1
var http = require("http");

Node.js中自带了一个叫做”http”的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量。
这把我们的本地变量变成了一个拥有所有 http 模块所提供的公共方法的对象。

node中require加载方法

由于Node.js中存在4类模块(原生模块和3种文件模块),尽管require方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。如下图所示:
图

请我喝杯果汁吧!