Все заслуги @splintor (спасибо).
Но это моя производная версия.
Льготы:
- Какие модули экспортируются под
{module_name: exports_obj}
объект.
- module_name строится из имени файла.
- ... без расширения и замены слэшей на символы подчеркивания (в случае сканирования подкаталогов).
- Добавлены комментарии для упрощения настройки.
- Т.е. вы можете не включать файлы в подкаталоги, если, скажем, они требуются вручную для модулей корневого уровня .
РЕДАКТИРОВАТЬ: Если, как и я, вы уверены, что ваши модули не будут возвращать ничего, кроме (по крайней мере, на корневом уровне) обычного объекта javascript, вы также можете «смонтировать» их, реплицируя их исходную структуру каталогов (см. Код (Глубокая версия) ) раздел в конце).
Код (исходная версия):
function requireAll(r) {
return Object.fromEntries(
r.keys().map(function(mpath, ...args) {
const result = r(mpath, ...args);
const name = mpath
.replace(/(?:^[.\/]*\/|\.[^.]+$)/g, '')
.replace(/\//g, '_')
;
return [name, result];
})
);
};
const allModules = requireAll(require.context(
'@models'
, true
, /\.js$/
));
Пример:
Пример вывода для возможных console.log(allModules);
:
{
main: { title: 'Webpack Express Playground' },
views_home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
Дерево каталогов:
models
├── main.js
└── views
└── home.js
Код (Глубокая версия):
function jsonSet(target, path, value) {
let current = target;
path = [...path];
const item = path.pop();
path.forEach(function(key) {
(current[key] || (current[key] = {}));
current = current[key];
});
current[item] = value;
return target;
};
function requireAll(r) {
const gather = {};
r.keys().forEach(function(mpath, ...args) {
const result = r(mpath, ...args);
const path = mpath
.replace(/(?:^[.\/]*\/|\.[^.]+$)/g, '')
.split('/')
;
jsonSet(gather, path, result);
});
return gather;
};
const models = requireAll(require.context(
'@models'
, true
, /\.js$/
));
Пример:
Результат предыдущего примера с использованием этой версии:
{
main: { title: 'Webpack Express Playground' },
views: {
home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
}
image-size-loader
для всех изображений, чтобы создавать заполнители с правильными пропорциями.