理解Node.js中的exports

使用Express创建的web应用需要集成socket.io,socket.io需要和server关联,而通过express-generate生成的web应用,server单独在www文件中。如果把socket的创建添加到www势必破坏了www作为执行脚本的地位。鉴于此,结果google后,发现解决方案是使用exports。

module.exports 和 exports

在Node.js中,module是一个表示当前模块的对象。 module.exports则是由Module系统创建的对象。如果想要创建一个类供其他文件使用,那么可以使用 module.exports = some_instance的方式,将某个类对象赋给module.exports.
exports变量存在于module的文件级范围内,并被赋予module.exports的值。注意下面两种写法等价:

module.exports.f = ...
exports.f = ...

但若是修改了exorts后,module.exports是不会改变的。因此,在require的时候需要注意这一点,因为在使用 require 来引入module的时候,创建的对象是 module.exports对象。
下面摘取了几个示例,可以帮助更好的理解:

//sample1
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
//
var rocker = require('./rocker.js');
rocker.name(); // 'My name is Lemmy Kilmister'

//sample2
module.exports = 'ROCK IT!';
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
//
var rocker = require('./rocker.js');
rocker.name(); // TypeError: Object ROCK IT! has no method 'name',然后返回 'ROCK IT!'

//sample3:a class
module.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +' is '+ this.age +' years old');
    };
};
//
var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old

//sample4
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
//
var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio

//sample5:等价
module.exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};

分离socket

创建一个文件,生成websocket:

//websocket.js
var socketio = require('socket.io')();
socketio.on('connection', function(websocket) {
    // other functions
    });
module.exports = socketio;
//www
var socketio = require('path to websocket');
socketio.attach(server);

参考链接

https://stackoverflow.com/questions/24609991/using-socket-io-in-express-4-and-express-generators-bin-www
http://weizhifeng.net/node-js-exports-vs-module-exports.html