Web前端开发网

fly63.com

首页 资源 工具 文章 教程 栏目
  • 在线搜索
  • 文章标签
  • 广告合作
  • 赞助一下
  • 关于我们
资源推荐
阿里云优惠券
卓越的云计算技术和服务提供商
腾讯云优惠券
云服务器,云数据库,CDN,域名注册等多种云计算服务
扣子Coze
职场AI,就用扣子
豆包AI
字节跳动旗下 AI 智能助手
即梦AI
一站式智能创作平台,即刻造梦
AiPPT
全智能AI一键生成 PPT
堆友AI
零门槛,多风格AI绘画免费生成,电商海报设计神器
蜂小推
不扣量的项目推广平台
SpeedAI
一键去重、降AIGC率、数据可视化、论文写作

资源分类

AI智能 酷站推荐 招聘/兼职 框架/库 模块/管理 移动端UI框架 Web-UI框架 Js插件 Jquery插件 CSS相关 IDE环境 在线工具 图形动效 游戏框架 node相关 调试/测试 在线学习 社区/论坛 博客/团队 前端素材 图标/图库 建站资源 设计/灵感 IT资讯
网站收录 / 问题反馈

protobuf.js

分享
复制链接
新浪微博
QQ 好友

扫一扫分享

GitHub:https://github.com/protobufjs/protobuf.js
网站描述:纯 JavaScript 实现构建在 ByteBuffer.js 之上的 .proto 文件解析库
GitHub

protobuf.js是一个纯JavaScript实现,支持Node.js和浏览器的TypeScript,它容易使用速度快速,可以直接反射.proto文件,不需要生成任何文件。 

Google Protocol Buffers 传输的数据是二进制格式,JavaScript 天生不具备处理二进制数据的能力,所以要依赖 ByteBuffer.js ,ByteBuffer 和 ProtoBuf 都是由同一个团队 dcode.io 出品,ByteBuffer 可以单独使用,兼容 IE8+。

protobuf.js是基于ByteBuffer.js的Protocol Buffers纯JavaScript实现,主要功能是解析.proto文件,构建Message类,编码解码。

全局安装protobufjs,使用pbjs直接生成proto文件对应的js protobuf描述文件,这样就可以在普通页面中直接使用了。

安装

npm install protobufjs [--save --save-prefix=~]

使用

// const protobufjs = require('protobufjs')
import protobufjs from 'protobufjs'


// 要用到load模块
const { load } = protobufjs

实例

export default class protobuf {
static exportBuffer(parsedJsonList, molecule, proto , taskitem){
return new Promise((resolve, reject) => {
load(proto, (err, root) => {
if (err) {
console.log(err)
return reject(new Error('proto文件加载出错!'));
}
let prototxts = []
parsedJsonList.forEach(parsedJson => {
let parsedMessage = root.lookupType('TIV.' + parsedJson.header.type + 'Def')
const single = parsedMessage.create(parsedJson)
const singleBuffer = parsedMessage.encode(single).finish() // 这个singleBuffer发给后台就好
prototxts.push({
msgId: parsedJson.id,
msgType: parsedJson.header.type,
msgContent: singleBuffer,
taskType: parsedJson.taskType,
isEntry: isEntry(parsedJson.header.type, parsedJson.id, molecule)
})
})

let prototxtsMessage = root.lookupType('TIV.AllOperatorPb')
const all = prototxtsMessage.create({
allOperatorPb: prototxts,
taskFlow: taskitem ? taskitem : ''
})
const allBuffer = prototxtsMessage.encode(all).finish() // 这个buffer发给后台就好
const b64 = btoa(String.fromCharCode.apply(null, allBuffer))
// this.analysisBuffer(b64, proto)
resolve(b64);
})
})
}
static analysisBuffer(b64, proto) {
let allBuffer = atob(b64).split('').map(function (c) { return c.charCodeAt(0) })
return new Promise((resolve, reject) => {
load(proto, (err, root) => {
if (err) {
reject(err)
return console.log('proto文件加载出错');
}
let prototxtsMessage = root.lookupType('TIV.AllOperatorPb')
const alldata = prototxtsMessage.decode(allBuffer)
alldata.allOperatorPb.map(item => {
let parsMessage = root.lookupType('TIV.' + item.msgType + 'Def')
const fields = [];
if (Object.keys(parsMessage.Parameter.fields).length > 0) {
Object.keys(parsMessage.Parameter.fields).forEach(ikey => {
let value = 0;
if (parsMessage.Parameter.fields[ikey].type === "bool") {
value = false;
}
fields.push({
title: ikey,
value: parsMessage.Parameter.fields[ikey].typeDefault || value
})
})
}
const prototxt = parsMessage.decode(item.msgContent)
fields.forEach(field => {
if(prototxt['param']){
prototxt['param'][field.title] = prototxt['param'][field.title] ? prototxt['param'][field.title] : field.value;
}
})
prototxt.header.type = prototxt.header.type.split('Operator')[0]
item.msgContent = formatInit(prototxt)
})
if(process.env.NODE_ENV === 'development'){
console.log('解析后json数据:',alldata.allOperatorPb)
}
resolve(alldata.allOperatorPb);
})
})
}
}

protobufjs使用,数据的转换依赖 proto配置文件,protobufjs默认支持本地同源文件请求,如果proto文件是固定的不需要更改的,配置在前端静态文件就好了;如何会动态变更的话,需要用到绝对路径,需要解决跨域问题;

修改protobufjs对象原型默认的load请求文件方式:

protobufjs.util.fetch.xhr = function fetch_xhr(filename, options, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange /* works everywhere */ = function fetchOnReadyStateChange() {

if (xhr.readyState !== 4)
return undefined;

// local cors security errors return status 0 / empty string, too. afaik this cannot be
// reliably distinguished from an actually empty file for security reasons. feel free
// to send a pull request if you are aware of a solution.
if (xhr.status !== 0 && xhr.status !== 200)
return callback(Error("status " + xhr.status));

// if binary data is expected, make sure that some sort of array is returned, even if
// ArrayBuffers are not supported. the binary string fallback, however, is unsafe.
if (options.binary) {
var buffer = xhr.response;
if (!buffer) {
buffer = [];
for (var i = 0; i < xhr.responseText.length; ++i)
buffer.push(xhr.responseText.charCodeAt(i) & 255);
}
return callback(null, typeof Uint8Array !== "undefined" ? new Uint8Array(buffer) : buffer);
}
return callback(null, xhr.responseText);
};

if (options.binary) {
// ref: https://developer.mozilla.org/en-US/docs/Web/api/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers
if ("overrideMimeType" in xhr)
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.responseType = "arraybuffer";
}

xhr.open("GET", filename);
let headers = options.headers || {};

if (process.env.NODE_ENV !== 'development') {
headers['X-TC-Action'] = 'WorkbenchPb'
headers['X-TC-Region'] = 'ap-guangzhou'
headers['X-TC-Timestamp'] = Math.round(new Date().getTime()/1000).toString()
headers['X-TC-Service'] = 'AMTPGate'
headers['X-TC-Version'] = '2020-05-14'
}

for (let item in headers) {
if (headers.hasOwnProperty(item) && headers[item] !== null) {
xhr.setRequestHeader(item, headers[item]);
}
}
xhr.send();
};

Buffer数据流,传输速度非常快,数据保密性更强,前后端数据传输跟健壮。

文中的示例,最终使用的是base64,这样对ajax请求无影响,直接使用post请求,即可。如果直接用buffer,需要自己封装ajax;
大概设置:

xhr.responseType = 'blob'


仅供个人学习参考/导航指引使用,具体请以第三方网站说明为准,本站不提供任何专业建议。如果地址失效或描述有误,请联系站长反馈~感谢您的理解与支持!

链接: https://fly63.com/nav/3927

更多»
热门资源
swiper
目前应用较广泛的移动端网页触摸内容滑动js插件
官网
GitHub
layer
layer是一款口碑极佳的web弹层组件
点击进入
GitHub
iScroll.js
IScroll是移动页面上被使用的一款仿系统滚动插件。
官网
GitHub
wangEditor
基于javascript和css开发的 Web富文本编辑器
官网
GitHub
ueditor
由百度web前端研发部开发所见即所得富文本web编辑器
官网
GitHub
highlight
Highlight.js 是一个用 JavaScript 写的代码高亮插件,在客户端和服务端都能工作。
官网
GitHub
UglifyJS
一个js 解释器、最小化器、压缩器、美化器工具集
官网
GitHub
lozad.js
高性能,轻量级,可配置的懒加载图片工具
官网
GitHub
Sortable.js
简单灵活的 JavaScript 拖放排序插件
官网
GitHub
validate.js
表单提供了强大的验证功能,让客户端表单验证变得更简单
官网
GitHub
Draggin.js
一款兼容移动手机的js拖拽插件
官网
GitHub
lazysizes.js
响应式图像延迟加载JS插件【懒加载】
官网
GitHub
类似于protobuf.js的资源
pieces.js
一款效果非常炫酷的js碎片化图片轮播切换特效插件
官网
GitHub
bootstrap-wysiwyg
微型、开源的Bootstrap所见即所得富文本编辑器
官网
GitHub
lightgallery.js
纯js轻量级响应式lightbox插件
官网
GitHub
cartodb
用于在Web上存储和可视化地理空间数据
官网
GitHub
vue-uploader
由simple-uploader.js提供支持的Vue.js上传组件
点击进入
GitHub
LABjs
一个动态脚本加载器,异步加载组件
官网
GitHub
smoothscroll.js
一款纯js页面平滑滚动插件
官网
GitHub
store.js
一个简单的接口来实现跨浏览器的本地存储
点击进入
GitHub
目录

手机扫一扫预览

》
分享组件加载中...
首页 技术导航 在线工具 技术文章 教程资源 前端标签 AI工具集 前端库/框架 实用工具箱 广告合作 关于我们

Copyright © 2018 Web前端开发网提供免费在线工具、编程学习资源(教程/框架/库),内容以学习参考为主,助您解决各类实际问题,快速提升专业能力。