Усі заслуги @splintor (спасибі).
Але ось це моя власна похідна версія.
Переваги:
- Експорт модулів збирається під
{module_name: exports_obj}
об'єктом.
- ім'я_модуля будується з його імені файлу.
- ... без розширення та заміни косої риски підкресленням (у разі сканування підкаталогів).
- Додані коментарі для полегшення налаштування.
- Тобто ви, можливо, захочете не включати файли до підкаталогів, якщо, скажімо, вони є вручну необхідними для модулів кореневого рівня .
EDIT: Якщо, як і я, ви впевнені, що ваші модулі не повернуть нічого іншого (принаймні, на рівні кореня) звичайний об’єкт JavaScript, ви також можете "змонтувати" їх, тиражуючи їх оригінальну структуру каталогів (див. Код (Deep Version) ) розділ в кінці).
Код (оригінальна версія):
function requireAll(r) {
return Object.fromEntries(
r.keys().map(function(mpath, ...args) {
const result = r(mpath, ...args);
const name = mpath
.replace(/(?:^[.\/]*\/|\.[^.]+$)/g, '') // Trim
.replace(/\//g, '_') // Relace '/'s by '_'s
;
return [name, result];
})
);
};
const allModules = requireAll(require.context(
// Any kind of variables cannot be used here
'@models' // (Webpack based) path
, true // Use subdirectories
, /\.js$/ // File name pattern
));
Приклад:
Вибірка зразка для можливих 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]; // Detach
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, '') // Trim
.split('/')
;
jsonSet(gather, path, result);
});
return gather;
};
const models = requireAll(require.context(
// Any kind of variables cannot be used here
'@models' // (Webpack based) path
, true // Use subdirectories
, /\.js$/ // File name pattern
));
Приклад:
Результат попереднього прикладу за допомогою цієї версії:
{
main: { title: 'Webpack Express Playground' },
views: {
home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
}
image-size-loader
для всіх зображень, щоб створити заповнювачі з правильними співвідношеннями сторін.