Динамический экспорт модуля путем чтения всех файлов в каталоге в Node.js - PullRequest
0 голосов
/ 18 октября 2019

Итак, сегодня я пытался прочитать все экспорты по умолчанию из некоторого каталога, в котором есть index.js . Попробуйте обернуть его внутри одного объекта и снова экспортировать. Есть ли лучший способ справиться с этим?

 export default (() => require('fs')
            .readdirSync(__dirname)
            .filter(fileName => !!/.js$/ig.test(fileName))
            .map(fileName => fileName.split('.')[0])
            .reduce((defaultExportObj, nextFileName) => {
                try {
                    return {
                        ...defaultExportObj,
                        [nextFileName]: require(__dirname + `/${nextFileName}`),
                    };
                }catch(err) { throw err; }
            }, {}))();

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Полагаю, я бы сделал что-то вроде этого - не уверен, что это лучше - лучше, если это ^^

webpack: require.context

function expDefault(path, mode = "sync"){

    const modules = {}
    const context = require.context(path, false, /\.js$/, mode)
    context.keys().forEach(file => {
        const name = fileName.replace(/^.+\/([^/]+)\.js$/, "$1")
        modules[name] = context(name).default
    })
    return modules
}
export default expDefault(__dirname)
0 голосов
/ 19 октября 2019

Это похоже на личные предпочтения стиля, но я бы просто использовал простой цикл for/of и некоторые операторы if вместо 3 промежуточных массивов.

const moduleList = {};
const files = require('fs').readdirSync(__dirname);
const jsExt = /.js$/i;

for (const filename of files) {
    if (jsExt.test(filename)) {
        const baseFilename = filename.slice(-3);
        moduleList[baseFilename] = require(__dirname + '/' + baseFilename),
    }
}

export default moduleList;

Комментарии:

  1. Создает объект регулярного выражения один раз, а не несколько раз
  2. Нет необходимости в g флаге для регулярного выражения
  3. Используйте filename.slice(-3) для удаления известного расширения файла, поскольку .split('.')[0] не делает 'Вы не можете получить строку после последнего ., и Windows допускает несколько . в имени файла. Кроме того, нет необходимости искать, где находится ., как вы уже знаете, где оно находится, поскольку это известное расширение.
  4. Только один массив создан из readdirSync(), а не два дополнительных промежуточных массива
  5. Массив повторяется только один раз вместо четырех.
  6. Нет никакого смысла в try {...} catch(err) { throw err; }, если вы не собираетесь помещать что-то еще в блок catch.
  7. Миксшаблонных литералов и добавление строк в __dirname + `/ $ {nextFileName}` не имеет смысла для меня. Используйте один или другой.

Если у вас есть причины хотеть, чтобы все символы были приватными, вы можете изменить его следующим образом:

export default (function() {
    const moduleList = {};
    const files = require('fs').readdirSync(__dirname);
    const jsExt = /.js$/i;

    for (const filename of files) {
        if (jsExt.test(filename)) {
            const baseFilename = filename.slice(-3);
            moduleList[baseFilename] = require(__dirname + '/' + baseFilename),
        }
    }
    return moduleList;
})();    
...