Esta respuesta no utiliza funciones de bloqueo como readdirSynco statSync. No utiliza dependencias externas ni se encuentra en las profundidades del infierno de devolución de llamadas.
En su lugar, utilizamos conveniencias modernas de JavaScript como Promesas y async-awaitsintaxis. Y los resultados asincrónicos se procesan en paralelo; no secuencialmente
const { readdir, stat } =
require ("fs") .promises
const { join } =
require ("path")
const dirs = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Promise
.all
( (await readdir (path))
.map (p => dirs (join (path, p)))
)
.then
( results =>
[] .concat (path, ...results)
)
: []
Instalaré un paquete de ejemplo y luego probaré nuestra función:
$ npm install ramda
$ node
Vamos a verlo funcionar
> dirs (".") .then (console.log, console.error)
[ '.'
, 'node_modules'
, 'node_modules/ramda'
, 'node_modules/ramda/dist'
, 'node_modules/ramda/es'
, 'node_modules/ramda/es/internal'
, 'node_modules/ramda/src'
, 'node_modules/ramda/src/internal'
]
Usando un módulo generalizado Parallel, podemos simplificar la definición de dirs-
const Parallel =
require ("./Parallel")
const dirs = async (path = ".") =>
(await stat (path)) .isDirectory ()
? Parallel (readdir (path))
.flatMap (f => dirs (join (path, f)))
.then (results => [ path, ...results ])
: []
El Parallelmódulo utilizado anteriormente era un patrón que se extrajo de un conjunto de funciones diseñadas para resolver un problema similar. Para obtener más explicaciones, consulte estas preguntas y respuestas relacionadas .
require('path').resolve(__dirname, file)