creator中使用protobufjs

倾然丶 夕夏残阳落幕 提交于 2019-12-02 14:45:40

安装

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;
	}
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!