Tutti i meriti a @splintor (grazie).
Ma qui è la mia versione derivata.
Benefici:
- I moduli esportati sono raccolti in un file
{module_name: exports_obj}
oggetto.
- nome_modulo viene creato dal nome del file.
- ... senza estensione e sostituendo le barre con trattini bassi (in caso di scansione di sottodirectory).
- Aggiunti commenti per facilitare la personalizzazione.
- Cioè potresti voler non includere file nelle sottodirectory se, ad esempio, sono lì per essere richiesti manualmente per i moduli a livello di root .
EDIT: Se, come me, sei sicuro che i tuoi moduli non restituiranno nient'altro che (almeno a livello di root) un normale oggetto javascript, puoi anche "montarli" replicando la loro struttura di directory originale (vedi Code (Deep Version ) alla fine).
Codice (versione 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
));
Esempio:
Esempio di output per l'eventuale console.log(allModules);
:
{
main: { title: 'Webpack Express Playground' },
views_home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
Albero delle directory:
models
├── main.js
└── views
└── home.js
Codice (versione profonda):
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
));
Esempio:
Risultato dell'esempio precedente utilizzando questa versione:
{
main: { title: 'Webpack Express Playground' },
views: {
home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
}
image-size-loader
per tutte le immagini per creare segnaposto con proporzioni corrette.