V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

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

  •  
  •   iqoo · 2022-06-19 14:45:50 +08:00 · 2621 次点击
    这是一个创建于 870 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前做的 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 。

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

    希望有更好的建议!

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

    对 esm 更友好
    速度快很多
    API 和 jest 一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2627 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:36 · PVG 23:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.