protobufjs使用教程,支持proto文件打包成typescript或javascript脚本

官方链接:https://docs.cocos.com/creator/manual/zh/scripting/modules/example.html

第一步,安装nodejs。(自行安装)

安装教程可参考 https://www.runoob.com/nodejs/nodejs-install-setup.html

第二步,创建cocos新项目,在新项目根目录(assets同级目录)下打开命令行。

通过 npm 安装 protobufjs 并将它写入项目目录下的 package.json 的依赖项。

在项目目录命令行中执行以下命令:

npm install --save protobufjs

通过 npm 安装 protobufjs--cli 并将它写入项目目录下的 package.json 的依赖项。

npm install --save protobufjs-cli

第三步,在项目目录下新建 Proto 目录,并定义三个 proto 文件。

pkg1.proto

// pkg1.proto

package pkg1;
syntax = "proto3";
message Bar {
    required int32 bar = 1;
}

pkg2.proto 

// pkg2.proto

package pkg2;
syntax = "proto3";
message Baz {
    required int32 baz = 1;
}

unpkg.proto 

// unpkg.proto 不属于任何的包

syntax = "proto3";
message Foo {
    required int32 foo = 1;
}

第四步,增加默认导出。

在项目目录下创建一个 Tools/wrap-pbts-result.js 文件,脚本代码如下:

const fs = require('fs');
  const ps = require('path');
  const file = ps.join(__dirname, '..', 'Protojs', 'proto.d.ts');
  const original = fs.readFileSync(file, { encoding: 'utf8' });
  fs.writeFileSync(file, `
  namespace proto {
      ${original}
  }
  export default proto;
  `);

        这一步的作用是将导出的proto.d.ts文件中的代码置于namespace proto内部,并且导出namespace proto,这样方便在项目中导入proto并调用。        

第五步,在 package.json 中定义。

"scripts": {
    "build-proto:pbjs": "pbjs --dependency protobufjs/minimal.js --target static-module --wrap commonjs --out ./Protojs/proto.js ./Proto/*.proto",
    "build-proto:pbts": "pbts --main --out ./Protojs/proto.d.ts ./Protojs/*.js && node ./Tools/wrap-pbts-result.js"
  }

第六步,在项目目录打开命令行,安装pbjs和pbts。

npm install -g pbjs
npm install -g pbts

第七步,运行package.json中的两个脚本。

"build-proto:pbjs": "pbjs --dependency protobufjs/minimal.js --target static-module --wrap commonjs --out ./Protojs/proto.js ./Proto/*.proto"
"build-proto:pbts": "pbts --main --out ./Protojs/proto.d.ts ./Protojs/*.js && node ./Tools/wrap-pbts-result.js"

即可在Protojs文件夹中生成需要的文件。

将文件导入工程中,即可在工程中引用。

第八步,如何调用和创建pb数据?

 不论是对于unpkg.proto中的message Foo,还是pkg1.proto中的message,都可以直接利用对象字面量的方式创建:

        .d.ts:

        

          创建:

let foo:proto.IFoo = {
    foo: 1
}

        需要注意的是,.proto中定义了属于某个包的message(比如以上pkg1.proto中的Bar),在pb导出时会拥有自己的namespace pkg1,同时接口IBar为非显式public接口。我们知道,如果没有显式声明为public的话,namespace中的类和接口的访问权限是默认的,即 模块私有 :在命名空间内部可见,但在命名空间外部不可见。所以 通常情况下 在这里无法通过proto.pkg1.IBar拿到接口IBar。

        但是,.d.ts文件是一个例外。在.d.ts中,即使是namespace中的非public接口,也可以在外部直接访问

下文:protobuf数据裁剪与轻量化

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值