nodejs中的模块引用-exports or module.exports

单纯从前端编程来说,文件的模块化和相互引用一直是个头疼的问题。我们经常要用到公用的头部和底部、菜单栏等等,之前我甚至要为此起一个php环境,然后用include 方法。当然,nodejs出来之后,一切都变了。我们可以用require来优雅的解决这些问题。

php引用时,总是要注意全局变量的污染,一般都用命名空间。但是在nodejs中,要更方便一些。

当我们定义一个模块的时候,

var cac = 10;
function handleNum(amout) {
    return amout + cac
}
exports.handleAdd = function (num) {
    return add(num)
}
exports.handleMin = function (num) {
    return add(-num)
}

外部只能访问handleAdd和handleMin两个方法,其他是访问不到的,所以并不会造成全局污染。但是值得一提的是,require方法是同步I/O操作。所以在程序中I/O密集的地方还是少用require。所有同步调用都会阻塞Node,直到调用完成。所以通常都只在程序最初加载时才使用require。

我们使用这个模块时,只需要require一下

var oFn = require('./aa')
console.log(oFn.handleAdd(20))

如果我们整个模块只想暴露一个方法的时候,我们要用到module.exports,比如

var handleFn = function (num) {
    this.num = num
}
handleFn.prototype.add = function () {
    return this.num ++
}
handleFn.prototype.min = function () {
    return this.num --
}
module.exports = handleFn

这里说exports和module.exports的区别。这里如果用exports=handleFn就是错误的。Node不允许重写exports。用module.exports可以对外提供单个变量、函数或者对象。如果创建了既有exports又有module.exports,module.exports会被返回,而exports会被忽略。exports只是对module.exports的一个全局引用,所以如果把exports设置成别的, 就破坏了之间的引用关系。我们用exports.aa ,其实最终也是走的module.exports.aa。

随机浏览