之前做的 NPM 都是命令工具类的,从没发过组件类的。最近正好用到之前写过的某个功能,于是把几年前写的一个库翻新了下,做成 NPM 包分享。
组件很简单,就是从一个字节流( stream )中读取固定格式的数据,如 uint32 、uint16 、text 等等。网上有不少这种库。不过之前想到一个巧妙的方案,性能可以大幅高,于是自己写了一个。由于懒得写文档,一直没发布。最近重构了遍,准备分享下。
库名原本叫 FastReader ,测试和演示中都用了这名字,而且包名至今都未注册。没想到发布时才发现这个名字不能用,原来已经有个 fast-reader 的包(看起来早已不维护)。NPM 现在为了安全性,连相似的名字都不让用了。。。提示可以用 @username/package 的格式,但觉得太长不美观。打算改成 QuickReader ,但索性用更短的名字算了,SReader ( Stream Reader )。
之前想到的巧妙的方案,是这个项目的亮点,就是用一种特殊的语法减少 await 的调用量 —— 不涉及 I/O 时纯同步执行,只有必须时才执行 await ,从而提高性能。类似这样:
const result = reader.bytes(10) ?? await A
因为当时原生支持 await 没多久,出于兼容性很多时候是用翻译后的语法糖实现 await 的,因此开销较大。当然现在的性能已大幅提高了。不过比同步逻辑还是慢百倍左右( Chrome 开着控制台会慢几千倍,可能和调试器有关),测试细节可参考 github 。
组件原本同时支持 ESM 和 CJS ,但考虑 ESM 已是主流,而且很多开源库现在只支持 ESM ,于是把 CJS 兼容部分去了。不知就目前是否合理。
另外写 jest 测试时也踩了不少坑。jest 目前对 esm 的支持还是实验性的,甚至还需加 node 启动参数。加上测试本身用 ts 编写,还需配置 ts-jest 参数,折腾很久(主要卡在 node-fetch 组件,定义总是报错)。最后虽然可以,但 ci 测试时较低版本的 node 仍报语法错误。于是测试案例最终仍未用 esm 。
当然最头疼的就是写文档,由于平时几乎不写英语文档,快退化到初中水平了,干脆用谷歌翻译。感觉难以短时间恢复了。。。
希望有更好的建议!
1
v23x 2022-06-19 16:15:20 +08:00
我也发了几个 然后扔那里没管了 也没人用 吃灰了哈哈
|
2
learningman 2022-06-19 16:19:12 +08:00
我不能理解你把 test 用的.bin 打到 npm 包里是要干啥。。。
|
3
iqoo OP @learningman 有个在线 demo 通过 unpkg.com 加载演示文件
|
4
learningman 2022-06-19 16:42:22 +08:00
@iqoo 那也应该是从 raw.githubusercontent.com 加载,不应该把无用的文件打到 npm 包里
|
5
autoxbc 2022-06-19 17:32:50 +08:00
想法是好的,不过 await 的开销还是太小了。一千片羽毛放在一起也有重量,不值得为羽毛做点什么
|
6
rekulas 2022-06-19 17:39:59 +08:00
我对开源作者的唯一期待:不删库即可 🤣
|
7
iqoo OP @learningman 我也想过,放包里有点别扭。主要是 rawgit 被墙了,jsd 目前也不稳定,现在就 unpkg 比较稳定。下个版本打算放自己的空间里。
|
8
iqoo OP @autoxbc 发布晚了。之前 await 语法糖的开销还是比较大的。现在也就读几百万行的文件可以快一两秒,但相比总时间也忽略了。。。
|
9
muzuiget 2022-06-19 18:03:52 +08:00
这种功能,JavaScript 原生有 DataView 。
|
10
iqoo OP @muzuiget DataView 和 Reader 是两回事。DataView 用来读指定 buffer 某个位置的数据,Reader 用来读 stream 的读取,边下载边消费。
|
11
des 2022-06-19 18:25:19 +08:00 via iPhone
你要找的是不是这个?
https://www.npmjs.com/package/it-reader |
12
Pastsong 2022-06-19 19:39:32 +08:00
把 test 从 npm 包里排除掉不影响你 readme 里放 demo
|
15
hamsterbase 2022-06-19 23:16:24 +08:00 via iPhone 1
推荐用 vitest 测试
对 esm 更友好 速度快很多 API 和 jest 一样 |