最近项目增加node的bff(Backends For Frontends)层,后端用了golang&gRPC。node端使用了nestjs框架,为了ts能够识别proto定义的接口,希望通过proto生成gRPC接口文件,期间绕了不少弯路,简单分享下。
首先组内同学找到这个库
https://github.com/agreatfool/grpc_tools_node_protoc_ts
按照示例,命令如下,发现不好用
npm install grpc_tools_node_protoc_ts --save-dev # generate js codes via grpc-tools grpc_tools_node_protoc \ --js_out=import_style=commonjs,binary:./your_dest_dir \ --grpc_out=./your_dest_dir \ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \ -I ./proto \ ./your_proto_dir/*.proto # generate d.ts codes protoc \ --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ --ts_out=./your_dest_dir \ -I ./proto \ ./your_proto_dir/*.proto
遂改造如下
grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./src/types \ --grpc_out=./src/types \ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \ -I ./proto proto/*.proto grpc_tools_node_protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ --ts_out=./src/types \ -I ./proto ./proto/*.proto
结果发现还是不好用,最后仔细看了
https://github.com/grpc/grpc-node
又阅读了部分nestjs源码,发现是我们理解错了,项目上用的是nestjs封装的gRPC,而其采用的并不是预生成代码的形式,运行时需要加载proto源码动态解析
于是找到了nestjs所封装的形式对应所需的client interface生成工具
https://github.com/kondi/rxjs-grpc
总结:第二种方案虽然轻量,但性能肯定不如第一种,但nestjs默认实例化方式选择了这种,为了沿用其rxjs返回形式,暂时直接采用了官方方案,其实也可以通过对客户端进行二次封装达到rxjs的效果(第一种方案生成的客户端是回调函数形式,没有进行封装)
简单记录下,方便有此需求的同学填坑
上一篇: seajs amd 改造 下一篇: 让input maxlength区分中英文