前段时间刚刚研究过 creator里使用 pbjs的方案 ,老哥感觉你这个贴子 上下两种例子是一个啊。。没有区分好 ,js方式和ts方式,同时也没有指出来 动态加载proto的方式和静态加载js(bundle方式)的差别
-
前面步骤基本和你一样按照github上面的pbjs的官方操作执行就好 下载安装配置全局环境 仓库链接
-
纯js的列子改成 纯js使用即可
`protobuf.load(“awesome.proto”, function(err, root) {
if (err)
throw err;// Obtain a message type
var AwesomeMessage = root.lookupType(“awesomepackage.AwesomeMessage”);// Exemplary payload
var payload = { awesomeField: “AwesomeString” };// Verify the payload if necessary (i.e. when possibly incomplete or invalid)
var errMsg = AwesomeMessage.verify(payload);
if (errMsg)
throw Error(errMsg);// Create a new message
var message = AwesomeMessage.create(payload); // or use .fromObject if conversion is necessary// Encode a message to an Uint8Array (browser) or Buffer (node)
var buffer = AwesomeMessage.encode(message).finish();
// … do something with buffer// Decode an Uint8Array (browser) or Buffer (node) to a message
var message = AwesomeMessage.decode(buffer);
// … do something with message// If the application uses length-delimited buffers, there is also encodeDelimited and decodeDelimited.
// Maybe convert the message back to a plain object
var object = AwesomeMessage.toObject(message, {
longs: String,
enums: String,
bytes: String,
// see ConversionOptions
});
});` -
ts的例子api基本同js的方式
`import { load } from “protobufjs”; // respectively “./node_modules/protobufjs”
load(“awesome.proto”, function(err, root) {
if (err)
throw err;
// example code
const AwesomeMessage = root.lookupType(“awesomepackage.AwesomeMessage”);
let message = AwesomeMessage.create({ awesomeField: “hello” });
console.log(message = ${JSON.stringify(message)}
);
let buffer = AwesomeMessage.encode(message).finish();
console.log(buffer = ${Array.prototype.toString.call(buffer)}
);
let decoded = AwesomeMessage.decode(buffer);
console.log(decoded = ${JSON.stringify(decoded)}
);
});4. 还有直接动态加载.proto的方式 ex:protobuf.load() 但是这种方式涉及跨域 可以参考creator商店pbkiller的方式,或者测试的时候自己搭建服务器存放proto,另外小游戏环境下 pbjs6.x的库直接是用有问题(这里单纯指.proto动态加载方式)可以使用静态.js 把所有的proto打成一个bundle.js的方式当做脚本插入 5. 上面说的打成bundle.js的方式参考官方命令
> pbjs -t static-module -w commonjs -o compiled.js file1.proto file2.proto
> pbts -o compiled.d.ts compiled.js如果在使用的时候出现问题(这里的使用是指使用静态js的方式)可能需要修改生成的bundle.j's和bundle.d.ts如下 bundle.js 在文件最上增加这几行
var $protobuf = window.protobuf;$protobuf.roots.default=window;// Common aliases
var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;
;bundle.d.ts 在文件最上增加
type Long = protobuf.Long;`