npm 使用 pbjs 模块

不需要引入protobufjs文件,可直接使用
教程链接如下
npm 使用 pbjs 模块

npm 直接使用 protobufjs

1.选对版本号

如果版本号不对, 甚至找不到bin文件夹, 命令行根本不可执行.
不同版本的protobufjs使用教程不一样, 需要收发两端使用同一版本protobufjs才有意义.

protobufjs 哪个版本最好用 : V6.7.0 github : protobufjs 传送门

2.使用6.8.6也行

教程链接如下
Cocos Creator ts版本使用protobuf 不需要尿编辑器console界面报错, 能跑就行.

protobuf_686 解读

(1)protobuf_686 是指6.8.6版本的protobuf.js文件
(2)把代码折叠, 查看其结构. 最外层是一个传递global参数的方法.
(2.1)function(global,undefined)... 这个方法就起到一个传递global到方法中的作用, [window|self|this]
(2.2)第二层执行了function prelude(modules, cache, entries)方法. 进行模块的初始化.
因为entries的参数是[19], 我们可知这个方法就初始化了modules里面"19"项即protobuf.full这个版本的protobuf,并导出了.
因为里面定义了global.protobuf=protobuf,所以是可以直接使用全局变量protobuf的.
(2.2.1)定义了function $require(name)方法, 作用就是对module里面的模块进行初始化并返回导出.
(2.2.2)阅读proto.js方法, 发现其启动时初始化把proto相关的数据都挂在了protobuf.roots["default"]下面.
(2.2.3)通过浏览器F12开发者模式进行查看protobuf的结构, 发现proto.js里面定义的协议数据及方法都在 protobuf.roots.default 变量之下.
(2.3)module参数[方法, 入参]结构, 里面定义了非常多内容,不知道是否有用不着的东西. 但是看着里面的实现,也require一堆其他的模块, 想必里面模块直接也有相互依赖的关系.
(2.4)module里面还包含了其他的protobuf实现, 搜索关键字 /protobuf = / 能找到 "17" protobuf.build = "light"; "18" protobuf.build = "minimal"; "19" protobuf.build = "full"; 三个protobuf版本实现.

proto.js 解读

  1. 阅读proto.js发现, 其中只用到了protobuf.js里面的Reader "27", Writer "42", util "39"三个方法类
  2. proto文件单个message 如 LobbyLogin 对应 protobuf.roots["default"].LobbyLogin
    (1) 包含 LobbyLogin 各个字段
    (2) create 方法 内容: new LobbyLogin(properties);
    (3) encode 方法 内容: encode, 由 "42" Writer操作 并返回一个 通过"39"创建的 Uint8Array.
    (4) decode 方法 内容: 输入Uint8Array 数组. decode 由"27"Reader操作读取数据后返回一个 new root.LobbyLogin()
    (5) Writer.prototype.finish : returns Uint8Array
    使用示例:

3.protobufjs 5.0.1 使用

(1)npm下载5.0.1版本
(2)pbjs 生成 proto 对应的 .js 文件. (命令参考pbjs命令行帮助和6.8.6教程文档)
(3)代码内使用: 需要阅读 proto.js代码, 猜测其最终的数据结构. 经阅读和浏览器开发者模式查看其结果结构可知ProtoBuf.newBuilder(...).build()返回的结果中我们关心的部分有序列化方法类MessagePrototype
(4)使用的话就 test1Proto.LobbyLogin.encode(req); test1Proto.LobbyLogin.decode(t1); 就行了