2013-03-26 3 views
2

У меня есть эти модули я хотел бы импортировать в мой проект:пакетирования Node.js модули

var ModuleA = require('./ModuleA.js'), 
    ModuleB = require('./ModuleB.js'), 
    ModuleC = require('./ModuleC.js'), 
    ModuleD = require('./ModuleD.js'); 

Теперь это прекрасно работает, но я хотел бы связать эти и вместо того, чтобы позвонить из одного модуля, обрабатывает загрузку всех этих «sub'modules, например, так:

// app.js ---------------------------- 

var Module = require('./Module.js'); 


// Module.js ------------------------- 

var ModuleA = require('./ModuleA.js'), 
    ModuleB = require('./ModuleB.js'), 
    ModuleC = require('./ModuleC.js'), 
    ModuleD = require('./ModuleD.js'); 


// ModuleA.js ------------------------ 

exports.method = function() { return true } 

Теперь, я хотел бы быть в состоянии получить доступ к 'экспорту sub'bundles', например, так:

ModuleA.method(); 

Возможно ли это?

ответ

4

Попробуйте это:

// ModuleA.js 
module.exports.method = function() { return true; } 

// Module.js 
module.exports.A = require('./ModuleA'); 
module.exports.B = require('./ModuleB'); 

// app.js 
var myModule = require('./Module'); 
myModule.A.method(); 

Если вы хотите вызвать метод ModuleA непосредственно на myModule вам нужно повторно экспортировать их в файл Modules.js так:

// ModuleA.js 
module.exports.method = function() { return true; } 

// Module.js 
module.exports.methodA = require('./ModuleA').method; 
module.exports.methodB = require('./ModuleB').method; 

// app.js 
var myModule = require('./Module'); 
myModule.methodA(); 

ли это решить вашу проблему?

В качестве альтернативы вы можете использовать node-require-all, что позволяет импортировать сразу несколько файлов и экспортировать их с помощью одного объекта. Примером может быть:

var modules = require('require-all')({ 
    dirname : __dirname + '/modules', 
    filter  : /(Module.+)\.js$/, 
    excludeDirs: /^\.(git|svn)$/ 
}); 

После этого у вас есть объект modules, который содержит отдельные модули в качестве свойств:

modules.ModuleA.method(); 

(я не проверял этот код, но в основном он должен работать, как это.)

+0

Это было сделано, и это не так. Теперь я могу получить доступ к этому методу, вызывая 'myModule.A.method()' - Это работает, но я предпочитаю 'myModule.method()' – Kriem

+0

Я обновил свой ответ соответственно. –

+0

Да, почти. :) Но теперь я теряю свое автоматическое наследование. Мне нужно вручную установить все методы. – Kriem

0

В Module.js, сделать что-то вроде этого:

var ModuleA = require('./ModuleA.js'), 
for (var exported in ModuleA) { 
    exports[exported] = ModuleA[exported]; 
} 

Все объекты (функции и т. Д.), Которые были экспортированы ModuleA, теперь также экспортируются модулем.

+1

У этого есть проблемы, когда ModuleA и ModuleB экспортируют вещи под тем же именем. Затем первая перезаписывается второй. –