protobuf 前端怎么使用

为什么要学protobuf  

  1、体体小 是json的1/8

  2、编码解码速度快

  3、"跨语言":我们只需要写一份xxx.proto,即可以用工具生成java、python、c++等语言对应的代码


 首先我们定义一份huibao.proto文件


 

syntax = "proto3";
option java_package = "com.bubukj.proto";  //设置java对应的package
option java_multiple_files = true;                           //建议设置为true,这样会每个对象放在一个文件中,否则所有对象都在一个java文件中

message huibaoData  {

     message userData {
	      int64 id = 1;
		 string userName = 2;
		 string userAge = 3;
	 }
	 
	 message indexData {
	      int64 id = 1;
		 string sj = 2;
	     repeated dbUtil db = 3;
	 }
	 
	 message dbUtil {
	   int64 id = 1;
	   string haha = 2;
	 }

}

用工具把proto源文件变成我们需要的代码

  1. 下载并安装工具

    谷歌提供的工具protoc.exe,可以把proto源文件生成java、c++、python等语言所对应的代码,这个工具在https://github.com/google/protobufo中可以找到,我也分享到百度云了protoc.exe
  2. 执行命令生成代码 
               这里有我用到的一个脚本文件分享给大家 脚本文件
rd .\src\ /s/q

md .\src\c
md .\src\java
md .\src\python
md .\src\js
md .\src\commonjs

protoc.exe --cpp_out=.\src\c huibao.proto

protoc.exe --java_out=.\src\java huibao.proto

protoc.exe --python_out=.\src\python huibao.proto

rem protoc.exe --js_out=.\src\js huibao.proto

protoc.exe --js_out=library=huibao_proto,binary:.\src\js huibao.proto

protoc.exe --js_out=import_style=commonjs,binary:.\src\commonjs huibao.proto

pause

运行这个脚本文件就可以生成huibao_proto.js

接下来该怎么用这个Js 只需要引入google的js库就可以直接用了  

例子如下:
 以npm 讲解  :

       安装好npm以后,安装需要的库:(假设已安装好npm)

  执行如下命令:
  npm install -g require(对库文件的引用库)
  npm install -g browserify(这个是用来打包成前端使用的js文件)
  最后我们执行   (执行这句命令的时候必须在browserify目录下 不然会报找不到package.json文件 )
   npm install google-protobuf 会在当前目录下生成一个文件夹,里面装的就是protobuf的库文件。

   
       
都装还以后,只需要再写一个导出文件用browserify执行打包即可
var myProto = require('./huibao_proto');  
  
    module.exports = {  
        DataProto: myProto  
    }  
保存为exports.js。

对文件进行编译打包
执行命令 
browserify exports.js > huibao.js
然后会生成一个huibao.js文件。
这时候就可以使用huibao.js了 



新建一个项目:


html 代码如下:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		
		<script type="text/javascript" src="google-protobuf/google-protobuf.js"></script>
		<script type="text/javascript" src="huibao.js"></script>
		
		<script type="text/javascript">
			var huibao = new proto.huibaoData();
			var user = new proto.huibaoData.userData();
			console.log(user);
			user.setId(2);
			console.log(user.getId());
			
		
			
			
		</script>
		
		
	</head>
	<body>
	</body>
</html>

打开html  报如下错误:

在google-protobuf.js 中找到exports

exports.Map=jspb.Map;exports.Message=jspb.Message;exports.BinaryReader=jspb.BinaryReader;exports.BinaryWriter=jspb.BinaryWriter;exports.ExtensionFieldInfo=jspb.ExtensionFieldInfo;exports.ExtensionFieldBinaryInfo=jspb.ExtensionFieldBinaryInfo;exports.exportSymbol=goog.exportSymbol;exports.inherits=goog.inherits;exports.object={extend:goog.object.extend};exports.typeOf=goog.typeOf;

看得出这句代码 其实就是就是google-protobuf.js想对外提供的个变量 只不过没有定义  好办 直接 在前面加一个var exports = {}; 

然后再刷新html


至此 我们可以再好好去研究研究 怎么玩protobuf 

重构我们的前端代码 做到真正的数据分离 以数据驱动页面

前端使用 ProtobufProtocol Buffers)可以通过以下步骤: 1. 安装依赖:首先,你需要在 Vue 项目中安装 protobuf.js 库。可以使用 npm 或者 yarn 进行安装: ```bash npm install protobufjs ``` 2. 定义你的 Protobuf 消息:在 Vue 项目中,你可以创建一个 `.proto` 文件来定义你的消息结构。例如,创建一个名为 `message.proto` 的文件,并在其中定义你的消息类型。 ```protobuf syntax = "proto3"; message MyMessage { string name = 1; int32 age = 2; } ``` 3. 编译 Protobuf 文件使用 protobuf.js 的命令行工具 `pbjs` 来编译你的 `.proto` 文件。在项目的根目录下运行以下命令: ```bash npx pbjs -t static -w es6 -o src/protobufBundle.js path/to/message.proto ``` 这将生成一个名为 `protobufBundle.js` 的文件,其中包含了编译后的 Protobuf 消息定义。 4. 引入 protobuf.js 和生成的 bundle 文件:在 Vue 组件中引入 protobuf.js 和生成的 bundle 文件。 ```javascript import protobuf from 'protobufjs'; import protobufBundle from './protobufBundle'; // 加载编译后的 Protobuf 消息定义 const root = protobuf.parse(protobufBundle).root; const MyMessage = root.lookupType('MyMessage'); ``` 5. 使用 Protobuf 消息:现在你可以在 Vue 组件中使用 Protobuf 消息了。例如,你可以创建一个表单,将用户输入的值存储到 Protobuf 消息中,并进行序列化和发送。 ```javascript export default { data() { return { name: '', age: 0, serializedMessage: '', }; }, methods: { sendMessage() { // 创建一个新的消息对象 const message = MyMessage.create({ name: this.name, age: this.age, }); // 序列化消息对象 const buffer = MyMessage.encode(message).finish(); // 将序列化后的消息发送到服务器等等 // ... // 将序列化后的消息保存到组件的数据中,以备显示或其他用途 this.serializedMessage = buffer; }, }, }; ``` 这样,你就可以在 Vue 组件中使用 Protobuf 消息了。记得根据你的实际需求来修改和扩展上述代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值