2015-07-01 2 views
0

Мне интересно, как я могу расширить модуль commonjs от другого модуля, который его требует.Как обновить модуль commonjs от требуемого кода?

Давайте предположим, что у меня есть три файла, два CommonJS модуля, как показано ниже:


мой-Примеру module.js

function MyExampleModule(){} 

MyExampleModule.prototype = { 

    bindings: { 
     some: 'random', 
     prop: 'values' 
    } 

} 

module.exports = MyExampleModule; 

другой пример,-модуль .js

var MyExampleModule = require('./my-example-module'); 

function AnotherExampleModule(){} 

AnotherExampleModule.prototype = { 

    getMyExampleModuleBindings: function(){ 
     var module = new MyExampleModule(); 
     return module.bindings; 
    } 

} 

module.exports = AnotherExampleModule; 

app.js

var MyExampleModule = require('./my-example-module'); 
var AnotherExampleModule = require('./another-example-module'); 

//modify?!? 

var anotherExampleModule = new AnotherExampleModule(); 
console.log(anotherExampleModule.getMyExampleModuleBindings()); 

Так что я хочу сделать, это есть //modify?!? быть какой-то код, который изменит оригинальный MyExampleModule прототип, когда что-нибудь еще попытки require MyExampleModule он будет получить модифицированную версию.

Конкретный вопрос: что мне следует заменить //modify?!?, поэтому я выхожу из консоли с допущением, что my-example-module.js является только для чтения.

{ 
    some: 'random', 
    prop: 'values', 
    added: 'binding' 
} 
+0

первым. Это зависит от платформы, поэтому добавьте соответствующий тег (может быть nodejs, но может быть другой реализацией). Второй. В принципе, вы не можете. Но если вы настаиваете на этом, вам придется переопределить 'require', и даже ваш app.js не сделает этого, так как' // modify?!? 'Будет слишком поздно. – Amit

+0

@Amit Я не добавлял тег платформы, как в моих целях, это было бы запущено через браузер и использоваться в браузере, но я думал, что такая же идея применима в любом месте, где вы можете использовать commonjs (и полагали, что браузер не имеет значения здесь поэтому не отметили его). – Hailwood

+0

Просто чтобы объяснить мое утверждение о '// modify?!?' Слишком поздно, в вашем случае это может быть не слишком поздно, но общий подход будет, так как 'require()' должен выполнять код внутри модуля синхронно. Если этот код зависит от модификации, то уже слишком поздно. Вы должны использовать [DI] (https://en.wikipedia.org/wiki/Dependency_injection) для достижения своей задачи. – Amit

ответ

1

Если вы хотите сделать это в nodejs/iojs, это довольно просто. Когда узел импортирует модуль CommonJS (назовем его A), он создает внутренний объект.

Когда другой модуль (B) хочет загрузить тот же модуль (A), он просто получает ссылку на этот внутренний объект. Так что если вы что-то изменить на MyExampleModule в app.js она также применяется к MyExampleModule в another-example-module.js:

app.js

var MyExampleModule = require('./my-example-module'); 
var AnotherExampleModule = require('./another-example-module'); 

//modify: 

MyExampleModule.prototype.bindings = { 
    some: 'random', 
    prop: 'values', 
    added: 'binding' 
}; 

var anotherExampleModule = new AnotherExampleModule(); 
console.log(anotherExampleModule.getMyExampleModuleBindings()); 

Поскольку вы создаете новый экземпляр MyExampleModule в another-example-module.jsпосле вы звоните MyExampleModule.prototype.bindings = {...} в app.js, новый экземпляр будет создан с модифицированным .prototype.

Хотя я не тестировал это в браузере, он, безусловно, работает и в реализации webpacks CommonJS.

Заканчивать рабочий пример на работоспособных (app.js называется server.js): http://code.runnable.com/VZPdN5k65gE5vUIz

Смежные вопросы