protobuf数据裁剪与轻量化

接上文: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 中的 int32int64uint32uint64sint32sint64fixed32fixed64sfixed32 和 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数据时只能通过对象字面量的方法进行创建。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值