Silence & Solitude makes...

Pu's mind space

Tricks--Protocol Buffer for Node.js的一个坑

Google Protocol Buffer协议凭借其突出的性能,目前用的越来越多,概念介绍这里就不展开了,直接主题。话说官方支持的实现语言有三个:C++,Java,Python。Node.js开发想用的话似乎用得比较多的是这个库:ProtoBuf.js,我们的坑就从这里开始。

具体代码就不贴了,之前一直正常,后来某一天我重新npm install之后,返回的数据就不能用PB解析了。我追着代码走,发现了ProtoBuf.js有一个依赖项:ByteBuffer.js。ProtoBuf在使用ByteBuffer时有段内省的代码instanceOf来判断是否是ByteBuffer的实例。问题在这个上面,联想到我是重新npm install之后出的问题,我想到自己的外部项目也依赖了ByteBuffer,于是检查外部的package.json发现对其依赖写的是:"bytebuffer":"latest",而ProtoBuf内部的package.json对其依赖写的是"butebuffer":"2.3.1",我于是立刻去github上查看,果然ByteBuffer刚刚升级到3.0.0版本。也就是说两边的ByteBuffer不是同一个版本,导致了instanceof自省失败。遂把项目对bytebuffer的依赖固定到2.3.1版本,问题解决。

教训:
Node.js的依赖库不要用latest,谁让它这么火呢,三天两头就有各种新的变化。

想法:
Node.js的库依赖能否最小化,即npm install时候能否加入这样一种优化机制,对于共同依赖的库根依赖能覆盖叶依赖?

PS:
这个BUG是个老梗了,我几个月前记录现在才整理的。应该不会重现了,目前(2014-10-30)protobufjs稳定在3.0.0,而bytebuffer的版本是3.
1.0,没有兼容问题。但是教训仍有意义,故此记下。