V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ldm0
V2EX  ›  程序员

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

  •  
  •   ldm0 ·
    ldm0 · 2019-05-28 14:45:20 +08:00 · 3349 次点击
    这是一个创建于 2040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近大作业要用到 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++的,坑实在太多了(已经花费一晚上来踩坑)。

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

    首推 web asm,稳,快,简单,更新快,和 js 天然
    Chenamy2017
        7
    Chenamy2017  
       2019-05-28 16:42:07 +08:00   ❤️ 1
    我目前做的方案是
    Electron 做界面显示,C++做服务,使用 socket ( TCP )通信。
    Yapie
        8
    Yapie  
       2019-05-28 16:53:32 +08:00 via Android   ❤️ 1
    之前研究过一个大项目,它用的是 emscripten. https://segmentfault.com/a/1190000011228760
    Yapie
        9
    Yapie  
       2019-05-28 16:54:16 +08:00 via Android
    以太坊的 js 编译器大幅应用这东西
    ldm0
        10
    ldm0  
    OP
       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
        11
    ldm0  
    OP
       2019-05-28 18:38:52 +08:00
    @VDimos @Yapie @jimliang WASM 确实是好东西,可惜我的 C++部分涉及到了标准库之外的东西,port 到 wasm 上面还是有点麻烦。
    @Chenamy2017 确实,看来用 socket 做 Electron 和 C++程序之间的 ipc 可能是最方便的方案。
    happinessnch
        12
    happinessnch  
       2019-05-28 18:57:59 +08:00   ❤️ 1
    目前,V8 和命名管道都有用,V8 比 ffi 稳定多了。
    lizhuoli
        13
    lizhuoli  
       2019-05-28 19:30:34 +08:00 via iPhone   ❤️ 1
    @Yapie 这个其实是为了 Web 的,需要用类似 ArrayBuffer 实现 malloc,用 ServerWorker 实现进程,localStorage 实现 File API,性能是一个问题

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

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

    ( PS:大二蒟蒻,出于礼貌回复,本身不敢接活,逃
    zwh2698
        17
    zwh2698  
       2019-05-29 09:17:32 +08:00 via Android
    MFC 或者 wpf 没有其他
    happinessnch
        18
    happinessnch  
       2019-05-29 09:44:16 +08:00   ❤️ 1
    @ldm0
    如果产品规模较大的话, 最好还是 Native 框架+cef 来做,
    系统 API 和库的使用就会方便的多,Node 对 Native 的支持很有限,
    功能实现会有限制,比如窗口控制、并行下载等。
    ldm0
        19
    ldm0  
    OP
       2019-05-29 18:34:47 +08:00
    @happinessnch 涨知识了,感谢前辈指路(抱拳
    TownTown
        20
    TownTown  
       2021-08-25 10:46:25 +08:00
    用 electron 没毛病, 很多大厂都在用, 可以聚焦于 CPP 层内核, 无须为界面烦恼. 因为原生写界面调试太慢了.... 我们目前也是用的 electron 开发, 使用的是 addon(IPC), 有些坑吧, 总体来说还好.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 02:17 · PVG 10:17 · LAX 18:17 · JFK 21:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.