让JS自动匹配出proto Js的方法

这次给大家带来让JS自动匹配出proto Js的方法,JS自动匹配出proto Js的方法的注意事项有哪些,下面就是实战案例,一起来看一下。

在与后端的WebSocket通信时,前端要带一个proto文件是一个累赘的事情。首先是明显的曝光了协议实体对象,再一个浏览器客户端很容易会缓存该文件,新的协议更新可能导致客户端不能使用,另外在cdn服务器上还需要配置.proto类型客户端才能下载过去。真是遗毒不浅,自己使用的时候会注意这些,但给别人使用的时候就很不乐观了,所以这次全部将proto文件转成JavaScript对象,省去协议文件和加载的步骤。

先看代码:

  args = [].slice.call(arguments, 1 obj =  ( i = 0; i < args.length; i++ p = key = i + 1 protobuf.Field(p[0], key, p[1] || "string" obj =  ( i = 0; i < list.length; i++ ( protobuf == "undefined") ;=  protobuf.Root().define("IMEntity""Token", ["UserID"], ["Token"], ["Device"], ["Version", "int32"], ["Appkey""Feedback", ["ResultCode", "int32"], ["ResultData"], ["Seq", "int32"], ["MsgID""ReceiptType", ["Receive", "Read"    };

登录后复制

proto 主要有两种类型,Type和Enum。Type对应协议中的message,相当于是类。Enum就是枚举类型

var Root  = protobuf.Root,    Type  = protobuf.Type,    Field = protobuf.Field;var AwesomeMessage = new Type("AwesomeMessage").add(new Field("awesomeField", 1, "string"));var root = new Root().define("awesomepackage").add(AwesomeMessage);

登录后复制

枚举的创建不要需要Field。只需要add 字段名即可。那么接下来的问题是,手写root.add 也很烦,因为要一个一个对照属性,不断的复制粘贴,很容易出错。所以又做了个自动生成代码的页面:

     

function start() { $("#result").html(""); $("#result").append('root = new protobuf.Root().define("IMProtoEntity")
'); var reg = /("([^\"]*(\.)?)*")|('([^\']*(\.)?)*')|(/{2,}.*?(|))|(/*(|.)*?*/)/g,// 过滤注释 str = $('#content').val(); // 欲处理的文本 // console.log(str.match(reg));// 打印出:匹配子串 var news = str.replace(reg, ""); // console.log(news); // 打印出:原文本 var reg1 = /[message|enum].*?{/mg; var regobj = /{[^}{]*?}/g;//新地址 var names = news.match(reg1); var protos = news.match(regobj); // console.log(names, protos); var root = {}; for (var i = 0; i < names.length; i++) { var rawname = names[i]; var rawObj = protos[i]; //if (~rawname.indexOf("message")) if (!rawObj) continue; var name = rawname.replace("{", '').replace("message ", '').replace("enum ", ''); var obj = { name: name }; if (~rawname.indexOf("enum")) { obj["type"] = "enum"; } rawObj = rawObj.replace("{", '').replace("}", ''); var protolist = rawObj.split(';'); // console.log("protolist", protolist); var plist = []; for (var j = 0; j < protolist.length; j++) { var p = $.trim(protolist[j]); if (p) { var args = []; var list = p.split(' '); // console.log("list", list); list.forEach(function (n) { n && args.push(n); }), // console.log("args", args); plist.push(args); } } obj.list = plist; console.log(obj); toProto(obj); } } start(); function toProto(obj) { var root = "root"; var fun = "createProto"; var enumfun = "createEnum"; var str = root + '.add('; var args; if (!obj.type) {//message args = ''; for (var i = 0; i < obj.list.length; i++) { var item = obj.list[i]; //老协议2.0 if (item[0] == "required" || item[0] == "optional") { item.shift(); } //新协议3.0 if (item[0] != "string") { args += '["' + item[1] + '","' + item[0] + '"]'; } else { args += '["' + item[1] + '"]'; } if (i < obj.list.length - 1) args += ","; } } else {//enum args = '['; for (var i = 0; i < obj.list.length; i++) { var item = obj.list[i]; args += '"' + item[0] + '"'; if (i < obj.list.length - 1) args += ","; } args += ']'; } var all = str + (obj.type ? enumfun : fun) + '("' + obj.name + '",' + args + '));'; // console.log(all); $("#result").append(all + "
"); }

登录后复制

然后页面上会得到:

让JS自动匹配出proto Js的方法

红色部分复制到工程里面就可以用了。当然要带上createProto和createEnum两个方法。proto的格式要规范,毕竟start里面是以空格split的。相对于protobuf.load(“xx.proto”,callback)的方式要好很多。load对位置要求比较死板,一定要在根目录。而且有类型不存在就会报错,终止程序。add方法不存在找不到类型的错误。另外速度也快了很多。 

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

怎样让js暂停执行

jquery做出评分系统

以上就是让JS自动匹配出proto Js的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2782140.html

(0)
上一篇 2025年3月8日 16:26:46
下一篇 2025年2月25日 12:09:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 有趣的UglifyJS

    这次给大家带来有趣的uglifyjs,使用uglifyjs的注意事项有哪些,下面就是实战案例,一起来看一下。 也不是闲着没事去看压缩代码,但今天调试自己代码的时候发现有点意思。因为是自己写的,虽然压缩了,格式化之后还是很好辨认。当然作为mi…

    2025年3月8日
    200
  • protobuf.js 与 Long.js的使用详解

    这次给大家带来protobuf.js 与 long.js的使用详解,是急用protobuf.js 与 long.js的注意事项有哪些,下面就是实战案例,一起来看一下。 protobuf.js的结构和webpack的加载之后的结构很相似。这样…

    2025年3月8日
    200
  • JS事件先发布后订阅的方法

    这次给大家带来js事件先发布后订阅的方法,实现js事件先发布后订阅的注意事项有哪些,下面就是实战案例,一起来看一下。 之前写过一个的事件管理器,就是普通的先订阅后发布模式。但实际场景中我们需要做到后订阅的也能收到发布的消息。比如我们关注微信…

    2025年3月8日
    200
  • JavaScript关于IE8兼容问题的处理

    这次给大家带来JavaScript关于IE8兼容问题的处理,JavaScript关于IE8兼容问题处理的注意事项有哪些,下面就是实战案例,一起来看一下。 最初对做兼容性的认知只停留在UI层面,但其实UI层面都还好,因为毕竟你可以直接看得见现…

    2025年3月8日 编程技术
    200
  • JS里特别好用的轻量级日期插件

    这次给大家带来JS里特别好用的轻量级日期插件,使用JS里特别好用轻量级日期插件的注意事项有哪些,下面就是实战案例,一起来看一下。 jquery的日期插件有好几款,H5中的input也可以自带日期选择。但为什么要再写一个,有两个理由,一个是引…

    2025年3月8日
    200
  • JavaScript的事件管理

    这次给大家带来javascript的事件管理,使用javascript的事件管理的注意事项有哪些,下面就是实战案例,一起来看一下。 在设计JavaScript xxsdk的时候考虑到能让调用者参与到工作流程中来,开始用了回调函数。如下: t…

    2025年3月8日
    200
  • Nodejs的form验证及图片上传

    这次给大家带来Nodejs的form验证及图片上传 ,使用Nodejs的form验证及图片上传注意事项有哪些,下面就是实战案例,一起来看一下。 一、form验证  MVC的form验证有三个地方可以做,第一道关就是前端提交之前,第二道关就是…

    2025年3月8日 编程技术
    200
  • 怎样将Node.JS部署到Heroku

    这次给大家带来怎样将Node.JS部署到Heroku,将Node.JS部署到Heroku的注意事项有哪些,下面就是实战案例,一起来看一下。 Heroku是一个提供快速部署服务的云平台。支持Node,Ruby,Java,PHP,Python,…

    2025年3月8日 编程技术
    200
  • JavaScript的var与this,{}与function

    这次给大家带来javascript的var与this,{}与function,使用javascript的var与this,{}与function的注意事项有哪些,下面就是实战案例,一起来看一下。 JavaScript var是用来定义一个变…

    2025年3月8日 编程技术
    200
  • 怎样用nodejs搭建服务器

    这次给大家带来怎样用nodejs搭建服务器,用nodejs搭建服务器的注意事项有哪些,下面就是实战案例,一起来看一下。 【创想鸟】相关教程推荐:Node.js视频教程 简单开始 1.安装node。https://nodejs.org/en/…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论