第一次 NPM 造轮子,看看有什么注意点

2022-06-19 14:45:50 +08:00
 iqoo

之前做的 NPM 都是命令工具类的,从没发过组件类的。最近正好用到之前写过的某个功能,于是把几年前写的一个库翻新了下,做成 NPM 包分享。

组件很简单,就是从一个字节流( stream )中读取固定格式的数据,如 uint32 、uint16 、text 等等。网上有不少这种库。不过之前想到一个巧妙的方案,性能可以大幅高,于是自己写了一个。由于懒得写文档,一直没发布。最近重构了遍,准备分享下。

库名原本叫 FastReader ,测试和演示中都用了这名字,而且包名至今都未注册。没想到发布时才发现这个名字不能用,原来已经有个 fast-reader 的包(看起来早已不维护)。NPM 现在为了安全性,连相似的名字都不让用了。。。提示可以用 @username/package 的格式,但觉得太长不美观。打算改成 QuickReader ,但索性用更短的名字算了,SReader ( Stream Reader )。

github.com/EtherDream/sreader

之前想到的巧妙的方案,是这个项目的亮点,就是用一种特殊的语法减少 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 。

当然最头疼的就是写文档,由于平时几乎不写英语文档,快退化到初中水平了,干脆用谷歌翻译。感觉难以短时间恢复了。。。

希望有更好的建议!

2629 次点击
所在节点    程序员
15 条回复
v23x
2022-06-19 16:15:20 +08:00
我也发了几个 然后扔那里没管了 也没人用 吃灰了哈哈
learningman
2022-06-19 16:19:12 +08:00
我不能理解你把 test 用的.bin 打到 npm 包里是要干啥。。。
iqoo
2022-06-19 16:25:09 +08:00
@learningman 有个在线 demo 通过 unpkg.com 加载演示文件
learningman
2022-06-19 16:42:22 +08:00
@iqoo 那也应该是从 raw.githubusercontent.com 加载,不应该把无用的文件打到 npm 包里
autoxbc
2022-06-19 17:32:50 +08:00
想法是好的,不过 await 的开销还是太小了。一千片羽毛放在一起也有重量,不值得为羽毛做点什么
rekulas
2022-06-19 17:39:59 +08:00
我对开源作者的唯一期待:不删库即可 🤣
iqoo
2022-06-19 17:43:09 +08:00
@learningman 我也想过,放包里有点别扭。主要是 rawgit 被墙了,jsd 目前也不稳定,现在就 unpkg 比较稳定。下个版本打算放自己的空间里。
iqoo
2022-06-19 17:46:16 +08:00
@autoxbc 发布晚了。之前 await 语法糖的开销还是比较大的。现在也就读几百万行的文件可以快一两秒,但相比总时间也忽略了。。。
muzuiget
2022-06-19 18:03:52 +08:00
这种功能,JavaScript 原生有 DataView 。
iqoo
2022-06-19 18:10:59 +08:00
@muzuiget DataView 和 Reader 是两回事。DataView 用来读指定 buffer 某个位置的数据,Reader 用来读 stream 的读取,边下载边消费。
des
2022-06-19 18:25:19 +08:00
你要找的是不是这个?
https://www.npmjs.com/package/it-reader
Pastsong
2022-06-19 19:39:32 +08:00
把 test 从 npm 包里排除掉不影响你 readme 里放 demo
iqoo
2022-06-19 20:55:09 +08:00
@Pastsong 排除掉了 unpkg cdn 就访问不到了。不过下个版本就可以去掉, 文件用之前的版本。
iqoo
2022-06-19 20:56:33 +08:00
@des 不完全一样。看了下他这个貌似只能读固定长度的数据,没有 u32 、u16 等数字格式。
hamsterbase
2022-06-19 23:16:24 +08:00
推荐用 vitest 测试

对 esm 更友好
速度快很多
API 和 jest 一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860654

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX