Node.js 用模块组织代码

   创建程序时,不可能将所有代码放在一个文件夹里,而是按照逻辑相关性将其分解为单个或多个文件。整合外部文件时,常常伴随着全局命名空间被污染,为了避免这个问题,Node 模块允许你从被引入文件中选着要暴露给程序的函数和变量,如果模块返回的函数或变量不止一个,那他可以通过设定 exports 对象的属性来指明他们,如果模块只返回一个函数或变量,则可以设定 module.exports 属性。

  典型的模块是一个包含 exports 对象属性定义的文件,这些属性可以是任意类型的数据,比如字符串、对象和函数。

// 定义一个 node 模块

var canadianDollar = 0.91;
function roundTwoDecimals(amount) {
    return Math.round(amount*100)/100;
}
exports.canadianToUs = function() {};
exports.UsToCanadian = function() {};
    exports 对象上只设定了两个属性,引入这个模块的代码只能访问到 CanadianTOUS 和 USToCanadian 这两个函数,而变量 canadianDollar 作为私有变量仅作用在其逻辑的内部,程序不能直接访问他。

    使用这个新模块要用到 Node 的 require 函数,该函数以你要用到的模块路径为参数, Node 以同步的方式寻找它,定位到这个模块并加载文件中的内容。


// 引入一个 node 模块

var currency = require('./currency');
console.log(currency.canadianToUS(50));

    尽管用函数和变量组装 exports 对象能满足大多数的模块创建需要,但有时你可能需要不同的模型创建该模块,比如说只需要从模块中得到一个函数,那从 require 中返回一个函数的代码要比返回一个对象的代码更优雅。那么怎么创建值返回一个变量或函数的模块呢?你可能会以为只要把 exports 设定成你想要返回的东西就行,但是这样是不行的。因为 node 不能用任何其他对象、函数或变量给 exports 赋值。


//这个模块不能用

var Currency = function (canadianDollar) {
    this.canadianDollar = canadianDollar;
}
Currency.prototype.roundTwoDecimals = function (amount) {
    return Math.round(amount * 100)/100;
}

exports = Currency; // 错误,node不允许重写exports

    为什么这种写法错误呢,因为最终在程序里导出的是 module.exports ,而 exports 只是对它的一个全局引用,所以重写 exports 会破坏他们之间的引用关系,如果像维持他们之间的连接,可以像下面这样让 module.exports 再次引用 exports:

    

module.exports = exports = Currency;
 

   根据需要使用 exports 或者 module.exports 可以将功能组织成模块,规避掉程序脚本一直增长的弊端。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值