node@10.17.0 不建议使用最新版本(https://nodejs.org/download/release/v10.17.0/)
Python 版本windows-build-tools会自动安装
Visual Studio 版本windows-build-tools会自动安装
win10系统
前言
electron以nodejs作为底层运行环境,所以自然而然就想到了他能否调用C++编写的动态库,恰好我最近在做一个关于使用electron调用dll的项目,也就花了一点时间去了解和实践,这期间走了不少弯路,这里分享出来,希望能帮助到有遇到相关问题的小伙伴
很多刚入门不久的小伙伴第一个问题可能就是electron能不能调用DLL动态库?这里给一个明确的答复是可以的。为什么?因为electron本身就集成了nodejs运行环境,而nodejs又是用C++实现的,相当于C++是他的原配。
既然能调用,那么第二个问题来了,怎么调用?nodejs在官网也给出了方案addon有兴趣的可以看看,但是对于我们前端来说这个方案太过于复杂了,学习成本太高,如果没有c++开发背景还是另辟蹊径吧,electron是可以做到和C++混合开发的,如果团队中有C++的开发人员也可以尝试,结合C++本身的优势,开发出来的产品效果可能会更好,我们常用的IDE工具VSCode其实有部分功能也是使用C++来时实现的,这其中规避了一些electron的缺点。
使用node-ffi(官方)
另一种调用DLL动态库的方案就是这里要重点介绍的模块node-ffi。
node-ffi是一个用于使用纯JavaScript加载和调用动态库的Node.js插件。它可以用来在不编写任何C ++代码的情况下创建与本地DLL库的绑定。同时它负责处理跨JavaScript和C的类型转换。
其实这个模块时用起来非常的简单,先贴一段官方使用案例,简单加了几句注释:
var ffi = require('ffi');//引入ffi模块
/*
*使用ffi模块将dll和js打通,可以把它看做是RPC(远程调用协议)
*@libm 动态库的绝对地址例如"C://plugin/test.dll"
*@ceil 动态库中方法的名称 double返回值的数据类型 ['double'] 这是函数输入参数的数据类型
*这里提一下,应为C++是是属于强类型语言这个js不同,所以这里一定要指定返回参数和输入参数的类型
*/
var libm = ffi.Library('libm', {
'ceil': [ 'double', [ 'double' ] ]
});
//通过上面的注册的libm对象来调用dll中的ceil方法
libm.ceil(1.5); // 2
这一切看起来就是这么简单,但是在这几句简单的代码后面,会让刚入门的小伙伴非常的蛋疼,因为在使用的过程中你会遇到各种问题,而且这些问题会让你对本身的目的产生动摇,目前公开的环境能够支持nodejs调用的dll的npm包好像就只有ffi,而在使用中出现的问题,貌似你尝试了所有解决问题的方案,最终还是解决不了。我自己在搞这个的时候也弄了大概一周时间,各种环境捣腾,各种测试。最后弄出来了,这里总结一下这个过程中遇见的问题,打开分为这么3点:
- 安装依赖时报错
- 安装成功但是在运行electron时调用ffi时报错
- 打包electron时报错
修改nvm镜像地址
这里默认是指向淘宝地址https://npm.taobao.org/mirrors/node nvm install 4
,修改成官方地址https://nodejs.org/dist
比较好,windows系统在环境变量里面涉及即可
To use a mirror of the node binaries, set $NVM_NODEJS_ORG_MIRROR:
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
nvm install node
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist nvm install 4.2
To use a mirror of the io.js binaries, set $NVM_IOJS_ORG_MIRROR:
export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
nvm install iojs-v1.0.3
NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3
安装依赖
如果已经安装了node-gyp,则需要先删除C:\Users\Administrator.node-gyp 目录,再卸载npm uninstall node-gyp
//全局安装原生模块编译模块,编译ffi模块时需要用到的,这里一定要安装*
npm install node-gyp -g
//安装ffi模块
npm install ffi --save
当我们安装[node-gyp](https://github.com/nodejs/node-gyp)
的时候还可以,但是安装[ffi](https://github.com/node-ffi/node-ffi)
的时候提示我们需要安装Python
和Visual Studio
去编译C++
- 安装
windows-build-tools
npm install --global --production windows-build-tools
这一步挺慢的,会自动下载安装Python
和Visual Studio
需要的插件,而且最好是使用管理员权限打开的控制台。
会分两步下载,文件下载并安装到 C:\Users\Administrator.windows-build-tools





-
Python
和Visual Studio
安装好以后去安装ffi
安装前需要手动向系统环境变量Path加入python的安装路径 C:\Users\Administrator.windows-build-tools\python27
//安装ffi模块
npm install ffi --save

安装成功
其他安装方式
https://www.npmjs.com/package/@mapbox/node-pre-gyp
https://www.cnblogs.com/w4ngzhen/p/14086497.html
在node中运行
基于FFI模块CAPI与JavaScript的各种类型匹配总结
在electron中运行
打包
参考
https://nodejs.org/download/release/v10.17.0/
https://github.com/nodejs/node-gyp
https://github.com/node-ffi/node-ffi
https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial
https://github.com/torycl/node-ffi
https://www.npmjs.com/package/electron-node-ffi
https://www.cnblogs.com/lonny/p/NVM_NODEJS_ORG_MIRROR.html
https://blog.csdn.net/wang839305939/article/details/83780789
https://juejin.cn/post/6844903645905977357
网友评论