Skip to content

本文分享一个 JavaScript 的现代文件系统操作库 humanfs

在一定程度上,可以作为流行的文件、目录操作库 fx-extra 的替代。。

总体目标是创建一个令人愉快、灵活、可观察的文件系统操作库,该库更符合现代 API 设计而非 Linux 实用程序设计。

介绍

humanfs 提供了 4 种不同环境下的包:

  • @humanfs/node,在 Node.js fs/promises 模块上运行的 humanfs 实现。
  • @humanfs/deno,在 Deno 全局运行的 humanfs 实现。
  • @humanfs/web,humanfs 实现在浏览器中的 Origin 私有文件系统上运行。
  • @humanfs/memory,humanfs 实现在内存中运行,适用于任何 JavaScript 运行时。

接下来以 node 环境为例,演示一下它的用法。

导入

js
import { hfs } from '@humanfs/node';

示例

js
// 1. 文件操作

// 读取普通文件
const text = await hfs.text('file.txt');

// 读取 json 文件
const json = await hfs.json('file.json');

// 从文本文件读取原始字节
const arrayBuffer = await hfs.arrayBuffer('file.txt');

// 将文本写入文件
await hfs.write('file.txt', 'Hello world!');

// 将字节写入文件
await hfs.write('file.txt', new TextEncoder().encode('Hello world!'));

// 将文本追加到文件
await hfs.append('file.txt', 'Hello world!');

// 将字节追加到文件
await hfs.append('file.txt', new TextEncoder().encode('Hello world!'));

// 判断文件是否存在
const found = await hfs.isFile('file.txt');

// 查询文件大小
const size = await hfs.size('file.txt');

// 查询文件修改时间
const mtime = await hfs.lastModified('file.txt');

// 复制文件
await hfs.copy('file.txt', 'file-copy.txt');

// 移动文件
await hfs.move('file.txt', 'renamed.txt');

// 删除文件
await hfs.delete('file.txt');

// 2. 目录操作

// 创建一个目录
await hfs.createDirectory('dir');

// 递归创建目录
await hfs.createDirectory('dir/subdir');

// 判断目录是否存在
const dirFound = await hfs.isDirectory('dir');

// 复制整个目录
hfs.copyAll('from-dir', 'to-dir');

// 移动整个目录
hfs.moveAll('from-dir', 'to-dir');

// 删除目录
await hfs.delete('dir');

// 删除非空目录
await hfs.deleteAll('dir');

使用 if 判断文件:

js
const text = await hfs.text('/path/to/file.txt');

if (!text) {
    // 在这里写文件不存在时的逻辑
}

使用 ?? 空值合并运算符赋初始值:

js
// 读取普通文件
const text = (await hfs.text('/path/to/file.txt')) ?? 'default value';

// 读取JSON
const json = (await hfs.json('/path/to/file.json')) ?? {};

// 读取字节
const bytes = (await hfs.bytes('/path/to/file.png')) ?? new Uint8Array();

可以看到,操作非常地简单方便,不过呢,也有个问题,humanfs 能做的,fs-extra 都能做。

对比

那么我们来对比一下两者的优势和劣势:

发版时间

humanfs (2024年10月28日),fs-extra (2023年11月28日)。

humanfs 正在积极更新,fs-extra 已经1年没发版了。

发布提交

名称humanfsfs-extra
发布时间2023年12月13日(1年)2011年11月17日(13年)
提交次数185次1115次
发版数量1796
贡献者数量892

由于发布时间问题,humanfs 此类数据均低于 fs-extra。

开源协议

humanfs (Apache-2.0),fs-extra (MIT)。

fs-extra 的开源协议更为宽松,不过 Apache-2.0 也是直接可以商用的。

项目体积

humanfs (44.1kB),fs-extra (54.9kB)。

这里用的是 humanfs 的 node 包,两者体积相差无几。

周下载量

humanfs (3,000,000+),fs-extra (90,000,000)。

fs-extra 的周下载量是 humanfs 的 3 倍,毕竟是比较早期的库,fs-extra 已被无数的项目所依赖和使用。

结论

那么综上通过上面的数据,可以看到,稳定派 更适合 fs-extra激进派 试试 humanfs 又何妨。

笔者呢,是 激进派

番外

接下来,是我们有趣的番外时间~。

Nicholas C. Zakas

这是作者的主页,可以看到是一个小绿点超多的大佬。

更为震惊的是,鼎鼎大名的 ESlint 居然也是他的作品。

同时呢,他也是独立软件开发人员、顾问、教练和作家,曾在雅虎和 Box 等公司担任软件架构师,目前生活在加利福尼亚州山景城。

出版过的书籍

Nicholas C. Zakas 2005年出版了第一本书,从此一发不可收拾,又出版了多本 JavaScript 相关的书籍。

电子书

同时也创作了 3 本电子书,妥妥的编程大佬。

不过大佬的身体状况有些问题,曾经患有莱姆病,有 5 年时间没出过门。

身体是革命的本钱,希望各位读者朋友们,也要多多关注身体健康,不要一直超出自身负荷做事情,有些东西,也要适当放弃。

何以解忧,唯有代码。不忘初心,方得始终。