Node.js 大家是用什么方式链接 C++代码的

2019-05-28 14:45:20 +08:00
 ldm0

最近大作业要用到 electron。打算用 electron 做 UI,CPP 做内核。但是在选择使用什么方式在 C++和 electron 之间搭桥的时候遇到了困难。

目前看到的只有两个选择,一个是 node-ffi 直接链接 C++编译的 dll,另一个是使用 node-addon 的方法,用 node-gyp 编译 C++然后再链接。 第一个选择 node-ffi 看上去不错但是一方面调用的时候开销大,另一方面似乎不太稳定而且缺乏维护(在 Github 上面最近一次 commit 还是在 1 月份) 第二个选择用 node-gyp 编译 C++似乎是个官方方案,但是运行例子 node-gyp 一直报错,看了 issue list 才知道问题已经存在很久没人修了,继续深入还得花一点时间。

所以超想知道大佬们是使用什么方案在 Nodejs 里面使用 C++的,坑实在太多了(已经花费一晚上来踩坑)。

3350 次点击
所在节点    程序员
20 条回复
Cbdy
2019-05-28 15:38:01 +08:00
inoridream
2019-05-28 15:40:37 +08:00
按照你这个说法,你应该是会 C++。那么为啥不保持一致性,觉得 C++写客户端麻烦的话,可以使用 QT,那样不存在这样的问题。electron 并不是个明智的选择,那东西更像一个封装了页面的本地浏览器。
ETiV
2019-05-28 15:40:59 +08:00
cpp 直接编成可执行文件
nodejs child process.spawn 它?
xiadong1994
2019-05-28 15:43:07 +08:00
C++单独一个进程,然后 IPC
jimliang
2019-05-28 15:49:31 +08:00
wasm,跨平台和性能之间的平衡。具体可以参考一下 [xray]( https://github.com/atom/xray/)
VDimos
2019-05-28 15:49:35 +08:00
1.C++起个服务器,nodejs 与服务器交互。
2.c++编译成 web asm,nodejs 直接调用
3.FFI(这个坑目测更多,没具体研究过)
4.类似于 1,socket

首推 web asm,稳,快,简单,更新快,和 js 天然
Chenamy2017
2019-05-28 16:42:07 +08:00
我目前做的方案是
Electron 做界面显示,C++做服务,使用 socket ( TCP )通信。
Yapie
2019-05-28 16:53:32 +08:00
之前研究过一个大项目,它用的是 emscripten. https://segmentfault.com/a/1190000011228760
Yapie
2019-05-28 16:54:16 +08:00
以太坊的 js 编译器大幅应用这东西
ldm0
2019-05-28 18:32:23 +08:00
感谢大家的热心回复!
@Cbdy 对的,我说的 node-gyp 编译就是这个,坑贼多。Github 上面的官方 example 的第一个就报错了。
@inoridream 没错 QT 确实是很好的选择,我们组其他人在用 QT,我是做 Plan B 的,所以激进一点使用 electron。
@ETiV 很 COOL !之前还没听说过,mark 一下等会去看,感谢分享。
@xiadong1994 嗯嗯是个好主意,没想到 Windows 也有 Pipe !
ldm0
2019-05-28 18:38:52 +08:00
@VDimos @Yapie @jimliang WASM 确实是好东西,可惜我的 C++部分涉及到了标准库之外的东西,port 到 wasm 上面还是有点麻烦。
@Chenamy2017 确实,看来用 socket 做 Electron 和 C++程序之间的 ipc 可能是最方便的方案。
happinessnch
2019-05-28 18:57:59 +08:00
目前,V8 和命名管道都有用,V8 比 ffi 稳定多了。
lizhuoli
2019-05-28 19:30:34 +08:00
@Yapie 这个其实是为了 Web 的,需要用类似 ArrayBuffer 实现 malloc,用 ServerWorker 实现进程,localStorage 实现 File API,性能是一个问题

你们再看一下,现在楼主想用一个 Electron,即压根不考虑运行在浏览器,而是运行到桌面客户端上,因此没必要搞这一层,用 N-API 是最好的选择,用 IPC 只限于传输的数据比较有限,或者输入参数固定的场景

如果对于需要传递 C 结构体指针,频繁互相调用,N-API 能直接对应到 JS object 对象,调用起来是最原生的
b00tyhunt3r
2019-05-29 01:15:32 +08:00
楼主你好,对你的大作业蛮有兴趣~手上的活有点类似。
可以简单描述下你的大作业吗?是想实现一个什么功能?通过制作一个完整的软件来实现吗? pc 平台吗?谢谢回复!
ldm0
2019-05-29 01:28:57 +08:00
@happinessnch 最终还是用了 node-gyp 编译 v8 代码的方案(真香
ldm0
2019-05-29 01:43:53 +08:00
@b00tyhunt3r 是一个旅行路线规划,大概的功能和手机地图上面的输入目的地然后自动找出最合适的到达路径类似。是做一个 client 和一个 server。

( PS:大二蒟蒻,出于礼貌回复,本身不敢接活,逃
zwh2698
2019-05-29 09:17:32 +08:00
MFC 或者 wpf 没有其他
happinessnch
2019-05-29 09:44:16 +08:00
@ldm0
如果产品规模较大的话, 最好还是 Native 框架+cef 来做,
系统 API 和库的使用就会方便的多,Node 对 Native 的支持很有限,
功能实现会有限制,比如窗口控制、并行下载等。
ldm0
2019-05-29 18:34:47 +08:00
@happinessnch 涨知识了,感谢前辈指路(抱拳
TownTown
2021-08-25 10:46:25 +08:00
用 electron 没毛病, 很多大厂都在用, 可以聚焦于 CPP 层内核, 无须为界面烦恼. 因为原生写界面调试太慢了.... 我们目前也是用的 electron 开发, 使用的是 addon(IPC), 有些坑吧, 总体来说还好.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568399

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX