readdirp 
fs.readdir的递归版本。公开了一个 流API (RAM和CPU占用空间小)和一个 承诺API。
比内置更快 fs.readdir recursive: true,并且使用更少的RAM。
npm install readdirp
jsr add jsr:@paulmillr/readdirp
// Use streams to achieve small RAM & CPU footprint.
// 1) Streams example with for-await.
import readdirp from 'readdirp';
for await (const entry of readdirp('.')) {
const {path} = entry;
console.log(`${JSON.stringify({path})}`);
}
// 2) Streams example, non for-await.
// Print out all JS files along with their size within the current folder & subfolders.
import readdirp from 'readdirp';
readdirp('.', {alwaysStat: true, fileFilter: (f) => f.basename.endsWith('.js')})
.on('data', (entry) => {
const {path, stats: {size}} = entry;
console.log(`${JSON.stringify({path, size})}`);
})
// Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted
.on('warn', error => console.error('non-fatal error', error))
.on('error', error => console.error('fatal error', error))
.on('end', () => console.log('done'));
// 3) Promise example. More RAM and CPU than streams / for-await.
import { readdirpPromise } from 'readdirp';
const files = await readdirpPromise('.');
console.log(files.map(file => file.path));
// Other options.
import readdirp from 'readdirp';
readdirp('test', {
fileFilter: (f) => f.basename.endsWith('.js'),
directoryFilter: (d) => d.basename !== '.git',
// directoryFilter: (di) => di.basename.length === 9
type: 'files_directories',
depth: 1
});
API
const stream = readdirp(root[, options]) - - - - - - 流API
- 递归读取给定的根并返回
stream的 输入信息 - 可选地使用如下
for await (const entry of stream)使用node.js 10+ (asyncIterator). on('data', (entry) => {})输入信息 对于每个文件/ dir。on('warn', (error) => {})非致命的Error这样可以防止文件/ dir被处理。示例:用户无法访问。on('error', (error) => {})致命的Error这也是流的终点。例如:传入的非法选项。on('end')-我们做完了。当找到所有条目并且不再发出更多条目时调用。on('close')-流被破坏通过stream.destroy()。 如果您想在非致命错误时手动中止,可能会很有用。 在这一点上,流不再readable并且不会发出更多的条目、警告或错误- 要了解有关流的更多信息,请参阅非常详细的 Nodejs流文档 或者是 stream-handbook
const entries = await readdirp.promise(root[, options]) - - - - - - 承诺API。返回的列表 输入信息。
第一个参数总是 root,开始读取并递归到子目录的路径。
选项
fileFilter:过滤包括或排除文件- 函数:该函数接受一个条目info作为参数,并返回true以包含该条目,返回false以排除该条目
directoryFilter:过滤器包括/排除找到的目录和递归目录。未通过筛选器的目录将不会被递归到。depth: 5:深度,即使找到更多的子目录,也要停止递归type: 'files'确定流上的数据事件是否应该为'files'(默认),'directories','files_directories',或'all'。设置为'all'还将包括其他类型的文件描述符的条目,如字符设备、Unix套接字和命名管道。alwaysStat: false:总是返回stats属性设置每个文件。默认是false, readdirp将返回Dirent条目。将其设置为true可以双读目录执行时间-使用它只有当你需要文件size,mtime等。不能在<10.10.0的节点上启用。lstat: false:在流中包括符号链接条目和文件。当true,fs.lstat用Would代替fs.stat
EntryInfo
具有以下属性:
path: 'assets/javascripts/react.js':文件/目录的路径(相对于给定的根目录)fullPath: '/Users/dev/projects/app/assets/javascripts/react.js':找到的文件/目录的完整路径basename: 'react.js':文件/目录名dirent: fs.Dirent:内置 目录条目对象 -只与alwaysStat: falsestats: fs.Stats:内置的 统计对象 -只与alwaysStat: true
更新日志
- 4.0(2024年8月25日)用typescript重写,生成common.js / esm混合模块。
- 删除glob支持和所有依赖项
- 确保你在使用
let {readdirp} = require('readdirp')在common.js
- 3.5(2020年10月13日)禁止基于目录的递归符号链接。 之前,它可能会进入无限循环。
- 3.4(2020年3月19日)增加了对基于目录的符号链接的支持。
- 3.3(2019年12月6日)稳定RAM消耗并实现性能管理
highWaterMark选择。修复了相关的竞争条件for-await循环。 - 3.2(2019年10月14日)将性能提高了250%,并使流实现更加习惯化。
- 3.1(2019年7月7日)带来
bigint支持stat输出。这在某些情况下是向后不兼容的。小心些而已。如果使用不当,就会看到“TypeError:不能混合使用BigInt和其他类型,请使用显式转换”。 - 3.0带来了巨大的性能改进和流反压支持。
- 升级2。X到3.x:
- 签名更改为
readdirp(options)来readdirp(root, options) - 用承诺API替换回调API。
- 重命名
entryType选项type - 重命名
entryType: 'both'来'files_directories' EntryInfo- 重命名
stat来stats- 仅当
alwaysStat: true dirent发出,而不是stats默认为alwaysStat: false
- 仅当
- 重命名
name来basename - 删除
parentDir和fullParentDir属性
- 重命名
- 签名更改为
- 支持的node.js版本:
- 4.X:节点14+
- 3.X:节点8+
- 2.X:节点0.6+
许可证
版权所有:托斯滕·洛伦兹,保罗·米勒https://paulmillr.com)
MIT许可证,见 许可证 文件。