什么是模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。(摘自菜鸟教程)
新建一个自己的模块
创建一个tianqicode.js的文件
function service(request,response) {
//设置返回代码为200,以及将返回格式为text/plain
response.writeHead(200,{'Content-Type' : 'text/plain'});
//返回内容是:Hello Node.js
response.end('Hello Node.js');
}
//定义一个sayHello()函数
function sayHello() {
console.log('hello from tianqicode.js');
}
//通过 exports 对象把 hi作为模块函数sayHello()的访问接口
exports.hi = sayHello;
//通过 exports 对象把 service 作为模块函数service()的访问接口
exports.service = service;
这时候使用server.js来加载我们的自定义模块,在server.js 中通过 require(’./tianqicode’) 加载这个模块,然后就可以直接访 问 tianqicode.js 中 exports 对象的成员函数了。
//引入http模块
var http = require('http');
//引入tianqicode模块
var tianqicode = require('./tianqicode');
//调用hi()函数,间接的调用了tianqicode.js里面的sayHello()函数
tianqicode.hi();
//基于tianqicode.service()函数创建服务
var server = http.createServer(tianqicode.service);
//服务器监听8088端口
server.listen(8088);
打开控制台运行server.js
可以看到控制台输出
有时候我们只是想把一个对象封装到模块中,格式如下:
module.exports = function() {
// ...
}
例如
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
这样就可以直接获取这个对象了
注:exports 和 module.exports 的使用:
如果要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports。
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
服务端的模块放在哪里
在学习模块之前,就已经用到过这样的语句
var http = require('http');
Node.js 中自带了一个叫做 http 的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量。
这把我们的本地变量变成了一个拥有所有 http 模块所提供的公共方法的对象。
由于 Node.js 中存在 4 类模块(原生模块和3种文件模块)
在这里就不做了解了。