Todos los méritos para @splintor (gracias).
Pero aquí está mi propia versión derivada.
Beneficios:
- Los módulos que se exportan se agrupan en un
{module_name: exports_obj}
objeto.
- module_name se crea a partir de su nombre de archivo.
- ... sin extensión y reemplazando barras inclinadas por guiones bajos (en caso de escaneo de subdirectorios).
- Se agregaron comentarios para facilitar la personalización.
- Es decir, es posible que desee no incluir archivos en subdirectorios si, por ejemplo, están allí para ser requeridos manualmente para módulos de nivel raíz .
EDITAR: Si, como yo, está seguro de que sus módulos no devolverán nada más que (al menos en el nivel raíz) un objeto javascript normal, también puede "montarlos" replicando su estructura de directorio original (consulte Código (Versión profunda) ) sección al final).
Código (versión original):
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
));
Ejemplo:
Salida de muestra para eventual console.log(allModules);
:
{
main: { title: 'Webpack Express Playground' },
views_home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
Árbol de directorio:
models
├── main.js
└── views
└── home.js
Código (versión profunda):
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
));
Ejemplo:
Resultado del ejemplo anterior usando esta versión:
{
main: { title: 'Webpack Express Playground' },
views: {
home: {
greeting: 'Welcome to Something!!',
title: 'Webpack Express Playground'
}
}
}
image-size-loader
para todas las imágenes para crear marcadores de posición con relaciones de aspecto correctas.