protobuf是很常用的二进制数据交换格式,那么在JavaScript项目中又该怎样去使用呢。
要使用protobuf进行数据交换,必须经过编码和解码两个过程。编码过程在服务器端进行,而客户端接受到数据之后进行解码。
因此,服务端和客户端将会共享protobuf的数据结构定义文件.proto。如何在两边的代码仓库同步这一定义文件,相信大家都有自己的方法。
光有.proto文件,还没法在JavaScript中直接使用。protobuf.js提供了pbjs和pbts两个命令行工具可以将.proto文件转译为JavaScript模块。
将所有定义文件放在同一文件夹,那么如果在JavaScript中使用,使用以下命令转译
pbjs -t json-module -w commonjs ./proto/*.proto > ./proto/index.js
该命令直接生成CommonJS格式的模块,可以直接使用NodeJS引入。
如果是在TypeScript中使用,则可以用下面的命令
pbjs -t json-module -w es6 ./src/proto/*.proto > ./src/proto/index.js && pbjs -t static-module ./src/proto/*.proto | pbts -o ./src/proto/index.d.ts –
该命令先使用pbjs转译出JavaScript模块(ES Module格式,可以直接导入或使用Webpack),再使用pbts从static-module输出中提取类型。
在项目中直接引入转译结果就可以进行编解码了。
题外话
如果要使用浮点数类型的数据,推荐使用double而不是float类型,否则,在编解码过程中可能由于精度不足导致数据产生偏差。
下一步就是拿JavaScript去做gRPC了