安装
sudo npm install -g protobufjs@6.8.8
pbjs -v
(不行的话:npm install semver@5.5.0再试一试)
输出版本信息 protobuf.js v6.7.0 CLI for JavaScript和相关命令
pbts -v
定位到.proto文件目录
单个.proto文件转js
pbjs -t static-module -w commonjs -o ChatMsg.js ChatMsg.proto
多个.proto文件转js
pbjs -t static-module -w commonjs -o CMsg_pb.js *.proto
将转的js转ts(js文件超大,ts却很小)
pbts -o CMsg_pb.d.ts CMsg_pb.js
导出的js文件超大,可以考虑去掉不用的函数。后面加入命令 --no-convert或者 --no-delimited
pbjs -t static-module -w commonjs -o ChatMsg.js ChatMsg.proto --no-convert
少了部分函数,文件会小很多,当然要确定不需要这些函数。
将导出的js和ts文件放到工程脚本文件夹下;
同时将/usr/local/lib/node_modules/protobufjs/dist/protobuf.js文件放到creator脚本文件下,导入为插件,
因为插件模式导入,可以直接使用,所以讲导出的js文件开头修改:
将文件开头
var $protobuf = require("protobufjs/minimal");
改为
var $protobuf = protobuf;
在使用的脚本文件中引用(ts工程),路径根据实际情况去设置
import { grace } from "./ChatMsg";
let tChatMsg: grace.proto.msg.ChatMsg = new grace.proto.msg.ChatMsg();
let tPlayer: grace.proto.msg.Player = new grace.proto.msg.Player();
console.log(tChatMsg);
console.log(tPlayer);
tPlayer.id = 123;
tPlayer.name = 'lisi';
tPlayer.enterTime = 12345;
console.log(tPlayer);
let tPlayerData = PbUtil.Encode('msg','Player', tPlayer);
console.log("---Player---");
console.log(tPlayerData);
PbUtil文件
import { grace } from "./ChatMsg";
export default class PbUtil {
//packageName: package名
//msgTypeName: 消息类型名
static Encode(packageName, msgTypeName, data): any {
let PackageMgr = grace.proto;
var msgType = PackageMgr[packageName][msgTypeName];
var msg = msgType.create(data);
var bytes = msgType.encode(msg).finish();
return bytes;
}
static Decode(packageName, msgTypeName, bytes): any {
let PackageMgr = grace.proto;
var msgType = PackageMgr[packageName][msgTypeName];
var msg = msgType.decode(bytes);
var data = msgType.toObject(msg, {
longs: Number, //long默认转换为Number类型
enums: String,
bytes: String,
// see ConversionOptions
});
return data;
}
}
来源:https://blog.csdn.net/w775198287/article/details/102775952