Bundling node.js modules

I have these modules I'd like to import into my project:

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

Now, this works great, but I'd like to bundle these and instead call one module that handles loading all these 'sub'modules, like so:

// 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 }

Now, I'd like to be able to access the 'sub'bundles' exports, like so:

ModuleA.method();

Is this possible?

Try this:

// 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();

If you wish to call the method of ModuleA directly on myModule you need to re-export them in the Modules.js file like this:

// 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();

Does this solve your issue?

Alternatively you might use node-require-all that allows you to import multiple files at once and export them using a single object. An example might be:

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

Afterwards, you have an object modules which contains the single modules as properties:

modules.ModuleA.method();

(I have not tested this code, but basically it should work like this.)

In Module.js, do something like this:

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

All objects (functions, etc) that were exported by ModuleA are now exported by Module too.