当模块使用“module.exports”时扩展模块

时间:2016-10-14 03:55:53

标签: javascript node.js module extending

我已经阅读了几页关于扩展模块的内容。他们围绕着使用模块的功能形式,我得到了如何做到这一点(来自https://toddmotto.com/mastering-the-module-pattern/

var Module = (function () {

  return {
    publicMethod: function () {
      // code
    }
  };

})();

但我拥有的是两个这样的模块

util.js

module.exports = {
    thing1: function() {// do thing1 stuff }      
}

extend.js我无法改变的包裹(从npm开始)

module.exports = {
    thing2: function() {// do thing2 one stuff}
}

现在假装我将使用我的util.js模块

const _ = require('util.js);

let catin = _.thing1;  // that's easy
let thehat = _.thing2;.  // this was util.js extended.

我可以在util.js做这件事。

const ex = require('extend.js')

module.exports = {
    thing1: function() {// do thing1 stuff }
    thing2: ex.thing2
}

并且没关系,因为extend.js只有一个函数/方法可以扩展,但我想将它扩展到我的util库https://github.com/dodekeract/bitwise/blob/master/index.js,但它有22个!要扩展的项目。

肯定有更好的光滑方式吗?

我愿意重构我的util.js文件(但不像我展示的那样手工编写每个扩展名),所以它会自动扩展,但显然不能重构那个我不维护的包,没有一个fork ...啊。也对添加像

这样的子交易不感兴趣
  ex: ex 

_.ex.thing2  

想法?

1 个答案:

答案 0 :(得分:0)

因此,鉴于Molda的暗示,我将分享我所放在一起的内容,以使这个问题对其他人更有用。我整理了一个简单的方法,从(实用程序)模块的文件夹和其他一个关闭的包(例如按位)构建(实用程序)模块

使用此utils.js创建一个lib/模块(您需要全部或一些此类包裹)

let utils = require('require-all')(__dirname + '/util');
let bw = require('bitwise');

let self = module.exports = (function(){
let util={};
for (var key in utils) {
   util = utils.object.merge_keys(util,utils[key])
 }
 util = utils.object.merge_keys(util,bw)
 return util;
 }());

现在创建一个子目录lib/util/并用你的实用程序模块填充它。其中一个模块包含此键/功能

merge_keys: function (obj1,obj2){
    var obj3 = {};
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
    return obj3;
}

并确保模块名称与此行util = utils.object.merge_keys(util,utils[key])中使用的密钥匹配。在我的情况下,我在object.js中有一个包含lib/util/

的模块merge_keys

然后只需要utils.js模块,所有模块都将包括访问merge_keys函数以进行其他合并: - )。

let _ = require('./lib/utils');
// see if it worked
console.log(_);

要注意:没有检查模块之间的重复键名称

备注:
let self=允许用户引用合并对象本身中的任何其他键,如self.myfunctionkeyname( )