我已经阅读了几页关于扩展模块的内容。他们围绕着使用模块的功能形式,我得到了如何做到这一点(来自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
想法?
答案 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( )