Tous les mérites à @splintor (merci).
Mais ici, c'est ma propre version dérivée.
Avantages:
- Les modules exportés sont regroupés sous un
{module_name: exports_obj}
objet.
- module_name est construit à partir de son nom de fichier.
- ... sans extension et en remplaçant les barres obliques par des traits de soulignement (en cas d'analyse de sous-répertoires).
- Ajout de commentaires pour faciliter la personnalisation.
- Par exemple, vous voudrez peut-être ne pas inclure de fichiers dans les sous-répertoires si, par exemple, ils sont là pour être requis manuellement pour les modules de niveau racine .
EDIT: Si, comme moi, vous êtes sûr que vos modules ne renverront rien d'autre que (au moins au niveau racine) un objet javascript normal, vous pouvez également les «monter» en répliquant leur structure de répertoire d'origine (voir Code (version profonde ) à la fin).
Code (version originale):
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
));
Exemple:
Exemple de sortie pour éventuel console.log(allModules);
:
{
main: { title: 'Webpack Express Playground' },
views_home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
Arborescence des répertoires:
models
├── main.js
└── views
└── home.js
Code (version profonde):
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
));
Exemple:
Résultat de l'exemple précédent utilisant cette version:
{
main: { title: 'Webpack Express Playground' },
views: {
home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
}
image-size-loader
pour toutes les images afin de créer des espaces réservés avec des proportions correctes.