接上文:protobufjs使用教程,支持proto文件打包成typescript或javascript脚本
随着项目扩大,protobufjs导出的pb数据越来越大,我们如何对其进行一个自定义的导出,减少生成不必要的代码,将我们的pb数据轻量化?
查询pbjs文档后,发现有多个参数可以在进行pbjs导出时进行pb裁剪:
--force-number: 强制将字段类型转换为数字类型,即使原始数据类型不是数字。
--no-create: 不生成创建消息的代码。
--no-verify: 不生成验证消息的代码。
--no-convert: 不生成将消息转换为其他格式(如 JSON)的代码。
--no-delimited: 不生成处理分隔符分隔的消息的代码。
--no-beautify: 不对生成的代码进行美化(格式化)。
同时使用以上参数会大幅度裁减pb数据大小,亲测项目proto.js数据从9M裁剪到3M。其中--no-create、--no-verify、--no-convert对pb裁剪的作用较大。
如何使用?
修改package.json:
"scripts": {
"build-proto:pbjs": "pbjs --dependency protobufjs/minimal.js --target static-module --wrap commonjs --force-number --no-create --no-verify --no-convert --no-delimited --no-beautify --out ./Protojs/proto.js ./Proto/*.proto",
"build-proto:pbts": "pbts --main --out ./Protojs/proto.d.ts ./Protojs/*.js && node ./Tools/wrap-pbts-result.js"
}
需要注意什么?
--force-number:
默认情况下,protobuf 中的 int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32 和 sfixed64 类型在 JavaScript 代码中被表示为字符串。这是因为 JavaScript 中的数字类型无法表示 protobuf 中的所有整数范围。
当使用 --force-number 选项时,生成的 JavaScript 代码中的这些整数类型将被表示为 JavaScript 中的数字类型。这意味着,如果某个字段的值在 JavaScript 中可以表示为数字类型,那么它将被表示为数字,而不是字符串。
使用 --force-number 选项的后果是,生成的代码在处理整数类型时可能会更高效,因为不需要进行字符串和数字之间的转换。但同时,如果某个字段的值超出了 JavaScript 数字类型的表示范围,那么可能会导致精度丢失或溢出的问题。
因此,在使用 --force-number 选项时,你需要确保生成的代码中的整数类型的值不会超出 JavaScript 数字类型的表示范围(-2的53次方到2的53次方),以避免潜在的问题。
--no-delimited:
默认情况下,pbjs 会将消息类型编码为长度前缀分隔的二进制格式(Delimited format)。这种格式在传输和存储时非常常见。如果使用 --no-delimited 选项,生成的代码将不会使用长度前缀分隔的格式,而是使用紧凑的二进制格式。这意味着消息之间不会有分隔符,而是紧密排列在一起。
禁用分隔符编码可以减小文件大小,但会影响消息的解析速度。
--no-beautify:
默认情况下,pbjs 生成的 JavaScript 代码会进行格式化和缩进,以提高可读性。如果使用 --no-beautify 选项,生成的代码将不会进行格式化和缩进,而是以紧凑的形式输出。
这两个选项的主要影响是生成的 JavaScript 代码的可读性和大小。如果你选择使用 --no-delimited 和 --no-beautify,生成的代码可能会更小,但也会更难以阅读和调试。
--no-verify:
禁用验证。默认情况下,编译器会验证输入的协议定义文件的有效性。禁用验证可以减小文件大小,但也会带来一定的风险。
--no-create:
--no-create会裁剪pb的create代码,需要创建pb数据时只能通过对象字面量的方法进行创建。
3万+

被折叠的 条评论
为什么被折叠?



