2016-10-14 10 views
0

Я прочитал несколько страниц о расширении модуля. Они вращаются вокруг, используя функциональную форму модуля, и я получаю, как это сделать (от https://toddmotto.com/mastering-the-module-pattern/)расширение модуля, когда модуль использует «module.exports»

var Module = (function() { 

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

})(); 

но то, что у меня есть два модуля как этот

util.js

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

extend.js пакет я не могу изменить (от НПМ)

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 (но не для кодирования каждого расширения, как я показал), поэтому он автоматически расширяется, но, очевидно, не может реорганизовать этот пакет, который я не поддерживаю, кроме вилки. .ugh. Также не заинтересован в добавлении подряда, например

ex: ex 

_.ex.thing2 

Идеи?

+0

Посмотрите на http://stackoverflow.com/q/171251/3284355, чтобы увидеть, как объединить 2 объекта. – Molda

+0

иногда вы попадаете в психический угол и не можете видеть простой ответ. Конечно, я объединил объекты раньше, но я был настолько сосредоточен на «модулях». thx @Molda. Если вам нужен rep, тогда сделайте сообщение, которое я могу выдвинуть и выбрать в качестве своего ответа. – DKebler

+0

Не беспокойтесь о * rep *, я рад, что смогу помочь. – Molda

ответ

0

Так что, учитывая подсказку Молты, я расскажу, что я собрал, чтобы сделать этот вопрос более полезным для других. Я собрал простой способ создания модуля (утилиты) из папки (служебных) модулей плюс другие одноразовые пакеты (например, побитовые)

Сделайте 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()