您的位置:首页 > Web前端 > Node.js

Node.js 用模块组织代码

2017-07-21 12:12 357 查看
   创建程序时,不可能将所有代码放在一个文件夹里,而是按照逻辑相关性将其分解为单个或多个文件。整合外部文件时,常常伴随着全局命名空间被污染,为了避免这个问题,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 可以将功能组织成模块,规避掉程序脚本一直增长的弊端。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: