protobuf 微信小程序_如何在前端中使用protobuf(vue篇)

本文介绍了如何在Vue项目中使用protobuf,通过protobuf.js库解析proto文件,实现前后端数据交互。文章详细讲解了protobuf的优势,使用protobuf简化前后端沟通,以及在Vue项目中的具体实施步骤,包括proto文件的处理、封装request.js模块和实际调用接口。最后,作者提出在Node环境中可以动态解析proto,为后续内容埋下伏笔。
摘要由CSDN通过智能技术生成

前言

由于目前公司采用了ProtoBuf做前后端数据交互,进公司以来一直用的是公司大神写好的基础库,完全不了解底层是如何解析的,一旦报错只能求人,作为一只还算有钻研精神的猿,应该去了解一下底层的实现,在这里记录一下学习过程。

Protobuf简单介绍

Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。

有几个优点:

1.平台无关,语言无关,可扩展;

2.提供了友好的动态库,使用简单;

3.解析速度快,比对应的XML快约20-100倍;

4.序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

个人感受: 前后端数据传输用json还是protobuf其实对开发来说没啥区别,protobuf最后还是要解析成json才能用。个人觉得比较好的几点是:

1.前后端都可以直接在项目中使用protobuf,不用再额外去定义model;

2.protobuf可以直接作为前后端数据和接口的文档,大大减少了沟通成本;

没有使用protobuf之前,后端语言定义的接口和字段,前端是不能直接使用的,前后端沟通往往需要维护一份接口文档,如果后端字段有改动,需要去修改文档并通知前端,有时候文档更新不及时或容易遗漏,沟通成本比较大。

使用protobuf后,protobuf文件由后端统一定义,protobuf直接可以作为文档,前端只需将protobuf文件拷贝进前端项目即可。如果后端字段有改动,只需通知前端更新protobuf文件即可,因为后端是直接使用了protobuf文件,因此protobuf文件一般是不会出现遗漏或错误的。长此以往,团队合作效率提升是明显的。

废话了一大堆,下面进入正题。 我这里讲的主要是在vue中的使用,是目前本人所在的公司项目实践,大家可以当做参考。

思路

前端中需要使用 protobuf.js 这个库来处理proto文件。

protobuf.js 提供了几种方式来处理proto。

直接解析,如protobuf.load("awesome.proto", function(err, root) {...})

转化为JSON或js后使用,如protobuf.load("awesome.json", function(err, root) {...})

其他

众所周知,vue项目build后生成的dist目录中只有html,css,js,images等资源,并不会有.proto文件的存在,因此需要用protobuf.js这个库将*.proto处理成*.js或*.json,然后再利用库提供的方法来解析数据,最后得到数据对象。

PS: 实践发现,转化为js文件会更好用一些,转化后的js文件直接在原型链上定义了一些方法,非常方便。因此后面将会是使用这种方法来解析proto。

预期目标

在项目中封装一个request.js模块,希望能像下面这样使用,调用api时只需指定请求和响应的model,然后传递请求参数,不需关心底层是如何解析proto的,api返回一个Promise对象:

// /api/student.js 定义接口的文件

import request from '@/lib/request'

// params是object类型的请求参数

// school.PBStudentListReq 是定义好的请求体model

// school.PBStudentListRsp 是定义好的响应model

// getStudentList 是接口名称

export function getStudentList (params) {

const req = request.create('school.PBStudentListReq', params)

return request('getStudentList', req, 'school.PBStudentListRsp')

}

// 在HelloWorld.vue中使用

import { getStudentList } from '@/api/student'

export default {

name: 'HelloWorld',

created () {

},

methods: {

_getStudentList () {

const req = {

limit &

前端使用 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、付费专栏及课程。

余额充值