Node.js Объединить модуль/экспорт из нескольких файлов

Я хочу разбить файл большой конфигурации .js на несколько меньших файлов, но все же объединить их в один и тот же модуль. Является ли это обычной практикой и как лучше всего подходит, чтобы модуль не нуждался в расширении при добавлении новых файлов.

Пример, например, но не требующий обновления math.js при добавлении нового файла.

по математике  - add.js  - subtract.js  - math.js

// add.js
module.exports = function(v1, v2) {
    return v1 + v2;
}

// subtract.js
module.exports = function(v1, v2) {
    return v1 - v2;
}

// math.js
var add = require('./add');
exports.add = add;

var subtract = require('./subtract');
exports.subtract = subtract;

// app.js
var math = require('./math');
console.log('add = ' + math.add(5,5));
console.log('subtract =' + math.subtract(5,5));

Ответ 1

Вы можете сделать это

// math.js 
module.exports = function (func){
    return require('./'+func);
}

//use it like this 
// app.js

var math = require('./math');
console.log('add = ' + math('add')(5,5));
console.log('subtract =' + math('subtract')(5,5));

Ответ 2

Вы можете использовать оператор распространения ... или, если это не работает Object.assign.

module.exports = {
   ...require('./some-library'),
};

Или же:

Object.assign(module.exports, require('./some-library'));

Ответ 3

Если ваш NodeJs позволяет spread (...) оператор (проверьте здесь), вы можете сделать:

    module.exports = {
        ...require('./src/add'),
        ...require('./src/subtract')
    }

Ответ 4

Вы можете создать подпапку для автоматического назначения функций и других объектов.

mymodule.js

const pluginDir = __dirname + '/plugins/';
const fs = require('fs');

module.exports = {};

fs.readdirSync(pluginDir).forEach(file => {
    Object.assign(module.exports,require(pluginDir + file));
});

плагины/mymodule.myfunction.js

module.exports = {
    myfunction: function(hostname, login, password) {
        console.log("It works!");
    }
};

index.js

const mymodule = require('mymodule.js');

mymodule.myfunction();
// It works!