中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue中怎么使用protobuf

發布時間:2021-05-08 15:28:55 來源:億速云 閱讀:450 作者:小新 欄目:web開發

這篇文章主要介紹了vue中怎么使用protobuf,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

為什么要使用Vue

Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創建可維護性和可測試性更強的代碼庫,Vue允許可以將一個網頁分割成可復用的組件,每個組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網頁中相應的地方,所以越來越多的前端開發者使用vue。

官方解釋為:

Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the "old" format.

翻譯是(機翻---我英語不好)

協議緩沖區是用于序列化結構化數據的靈活,高效的自動化機制 - 思考XML,但更小,更快,更簡單。您可以定義一次數據的結構,然后您可以使用特殊的源代碼輕松地將結構化數據寫入各種數據流并使用各種語言讀取和讀取數據。您甚至可以更新您的數據結構,而不會中斷根據“舊”格式編譯的已部署程序。

特點:

  • 更簡單

  • 是3到10倍小

  • 速度要快20到100倍

  • 不太模糊

  • 生成更易于以編程方式使用的數據訪問類

代碼

在github上寫了個demo demo地址 有需要的可以下載下來跑一下就理解了。PS:如果覺得有用 請給我個小星星 (筆芯~)

使用

其實最開始我嘗試使用一個第三方JSprotobuf.js protobuf.load 的時候瀏覽器報了個錯illegal token '<' (/demo.proto, line 1) 查找了下官網issue,大意應該是proto文件多了個字符,但是我查看過proto文件并沒有發現有多的'<',怎么辦呢,最后放棄使用第三方。用官方提供的方法。

下載protobuf編譯器

下載地址 (我下載的是3.40版) github也提供了zip包,可自行下載 (目前最新版本是v3.6.0) 用來編譯proto為JS文件方便調用

配置環境變量

由于公司用的是win10 只需要將下載的文件地址添加到path即可 Mac與window命令唯一的區別就是需要將protoc改成protoc.exe 前提是需要添加環境變量

編寫proto文件

為了確保前后一致,下面是后臺寫給我的一個測試proto,我司后臺是java

syntax = "proto2";//protobuf版本
option java_package = "com.test.protobuf";
option java_outer_classname = "PersonMessage";
message Person {
 required int32 id = 1;
 optional string name = 2;
 optional string email = 3;
 repeated string list = 4;
 extensions 100 to 1000;//允許擴展的ID
}

message PersonTree {
 optional string id = 1;
 optional string title = 2;
 repeated PersonTree childs = 3;
}

extend Person {
 optional int32 count = 101;
 optional int32 likes_cnt= 102;
}

message PersonEx {
 optional int32 id = 1;
 extend Person {
  optional int32 px = 103;
  optional int32 py= 104;
 }
 optional Person p = 2;
}

使用vue-cli構建一個工程目錄

npm install -g vue-cli
vue init webpack my-project
cd my-project
npm install
npm run dev

安裝插件: npm install axios element-ui google-protobuf --save

編譯proto為JS

進入 awesome.proto 的存放路徑 使用如下命令 protoc.exe --js_out=import_style=commonjs,binary:. awesome.proto

  • 會生成一個awesome_pb.js文件

  • 點擊查看awesome_pb.js其實可以看到里面是生成好的方法。只需要在頁面中引入JS調用即可

之后我們將這個文件引入頁面,當然你也可以考慮全局引用

測試

本地測試

編寫一個測試頁面,創建一個測試按鈕 我是在測試頁面 import messages from './awesome_pb.js' 方法為:

methods: {
  protobufferTest () {
   var message = new messages.Person() // 調用Person對象 實例化
   // 賦值
   message.setId(23)
   message.setName('asd')
   // 序列化
   var bytes = message.serializeBinary()

   console.log(bytes) // Uint8Array(7) [8, 23, 18, 3, 97, 115, 100]

   // 反序列化
   var message2 = messages.Person.deserializeBinary(bytes)

   console.log(message2) // proto.PersonTree {wrappers_: null, messageId_: undefined, arrayIndexOffset_: -1, array: Array(3), pivot_: 1.7976931348623157e+308, …}

  }
 }

到此,本地測試完成,沒什么毛病了。

前后端聯調測試

前方有坑

前后傳輸是使用的FormData,然后悲劇的事情來了。后臺解析不了。查看了下數據 [8, 23, 18, 3, 97, 115, 100] 確實是傳過去了。

后來排查出原因是應該是解析成了字符串,然后數值變了。所以解析不出來。 后來使用fromCharCode()方法編輯成字符串形式傳輸給后臺。在使用charCodeAt()取值。

此方法已棄用
protobufferTest () {
   var message = new messages.Person() // 調用Person對象 實例化
   // 賦值
   message.setId(23)
   message.setName('asd')
   // 序列化
   var bytes = message.serializeBinary()

   console.log(bytes) // Uint8Array(7) [8, 23, 18, 3, 97, 115, 100]

   var tests = ''
   for (let index = 0; index < bytes.length; index++) {
    tests += String.fromCharCode(bytes[index])
   }
   console.log(tests) // asd

   // 存入FormData
   let uploadDatas = new FormData()
   uploadDatas.append('protobuf', tests)

   // 使用axios傳輸給后臺
   this.axios.post('/test', uploadDatas)
    .then(function (response) {
     // 將傳回的字符串轉為數組
     console.log(response.data.split('')) // ["?", "", "3", "2", "", "", "a", "s", "d", "f"]
     let str = response.data.split('')
     let toChar = []
     for (let index = 0; index < str.length; index++) {
      toChar.push(str[index].charCodeAt())
     }
     console.log(toChar) // [10, 2, 51, 50, 18, 4, 97, 115, 100, 102]

     // 后臺傳回來的是PersonTree里面的值所以調用PersonTree來反序列化
     var message2 = messages.PersonTree.deserializeBinary(toChar)

     console.log(message2) // proto.PersonTree {wrappers_: null, messageId_: undefined, arrayIndexOffset_: -1, array: Array(3), pivot_: 1.7976931348623157e+308, …}

     // 獲取PersonTree的id值
     console.log(message2.getId()) // 32
    })
    .catch(function (error) {
     console.log(error)
    })

  }

以上方法可能存在安全隱患。 向后端傳值 因為FormData支持兩種方式傳輸string和blob所以將bytes存入blob中 前端獲取數據 對axios的默認傳輸方式做個更改 axios.defaults.responseType = 'arraybuffer' 將以上的JS代碼更改為以下內容

protobufferTest () {
   var message = new messages.Person()
   message.setId(23)
   message.setName('asd')
   var bytes = message.serializeBinary()
   
   console.log(bytes)
   let uploadDatas = new FormData()
   var blob = new Blob([bytes], {type: 'application/octet-stream'})

   uploadDatas.append('protobuf', blob)
   
   this.axios.post('/test', uploadDatas)
    .then(function (response) {
     console.log(response)

     var message2 = messages.PersonTree.deserializeBinary(response.data)
     console.log(message2.getId())
    })
    .catch(function (error) {
     console.log(error)
    })
   // console.log(bytes)
  }

至此前后聯調完成

感謝你能夠認真閱讀完這篇文章,希望小編分享的“vue中怎么使用protobuf”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

津南区| 福州市| 会理县| 平果县| 清水河县| 昌平区| 乐都县| 勃利县| 塔河县| 英吉沙县| 大悟县| 高尔夫| 张家港市| 色达县| 沙湾县| 田阳县| 织金县| 扎赉特旗| 德阳市| 佛坪县| 博野县| 嘉定区| 栖霞市| 金乡县| 屯昌县| 佛学| 定日县| 蒲城县| 浦县| 华安县| 浮梁县| 九台市| 哈巴河县| 绥江县| 青川县| 含山县| 普兰县| 衢州市| 内江市| 介休市| 修水县|