humanfs,人性化的文件目录操作库

大家好,我是农村程序员,独立开发者,前端之虎陈随易。

这是我的个人网站:chensuiyi.me

我的所以文章都可以在我的个人网站找到,欢迎访问,也欢迎与我交朋友。


本文分享一个 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年没发版了。

发布提交

名称 humanfs fs-extra
发布时间 2023年12月13日(1年) 2011年11月17日(13年)
提交次数 185次 1115次
发版数量 17 96
贡献者数量 8 92

由于发布时间问题,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 又何妨。

笔者呢,是 激进派

番外

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

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

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

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

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

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

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

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

相关推荐
千码君201625 分钟前
Go语言:解决 “package xxx is not in std”的思路
开发语言·后端·golang
rexling135 分钟前
【Spring Boot】Spring Boot解决循环依赖
java·前端·spring boot
我有一棵树36 分钟前
Vue 项目中全局样式的正确写法:不要把字体和主题写在 #app 上
前端·javascript·vue.js
咖啡教室1 小时前
每日一个计算机小知识:DHCP
后端·网络协议
Luna-player1 小时前
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本,解决方法
前端·npm·node.js
悢七1 小时前
windows npm打包无问题,但linux npm打包后部分样式缺失
linux·前端·npm
咖啡教室2 小时前
每日一个计算机小知识:ARP协议
后端·网络协议
Felicity_Gao2 小时前
uni-app App升级功能实现
前端·学习·uni-app
CS Beginner2 小时前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
JavaTree20172 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·后端