最近接到PC桌面端视频开发的任务,之前一直使用C++外加angularJS的模式开发,
个人感觉架构略显笨重,尤其是在修改C++时,可是相当的繁琐,成本太高,客户受不了了,
最近发现了一个新玩意Electron即可以集成最近火热的Vue,又可以以插件的方式追加C++插件,
可以使业务功能极大的解耦。
网上关于Electron基本入门的文档比较多,一搜一大片,自己慢慢搞定好了,本文主要记录
在追加C++插件过程中遇到的大坑,供入门者参考。
{
"name": "dongjin",
"version": "1.0.0",
"description": "Electron的C++插件",
"main": "main.js",
"dependencies": {
"electron": "^3.0.8"
},
"devDependencies": {
"electron-packager": "^12.2.0"
},
"scripts": {
"test": "npm test",
"start": "electron ."
},
"author": "yaohj",
"license": "ISC"
}
main.js
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
const path = require('path')
const url = require('url')
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({width: 800, height: 600})
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}))
mainWindow.webContents.openDevTools()
mainWindow.on('closed', function () {
mainWindow = null
})
}
app.on('ready', createWindow)
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})
index.html
在文件夹的根目录执行下面的命令
electron .
或者
npm start
基本的Electron程序跑起来了~~
demo.cc(偷个懒,这里引用了网络上一段代码)
#include
void Add(const Nan::FunctionCallbackInfo& info) {
if (info.Length() < 2) {
Nan::ThrowTypeError("Wrong number of arguments");
return;
}
if (!info[0]->IsNumber() || !info[1]->IsNumber()) {
Nan::ThrowTypeError("Wrong arguments");
return;
}
double arg0 = info[0]->NumberValue();
double arg1 = info[1]->NumberValue();
v8::Local num = Nan::New(arg0 + arg1);
info.GetReturnValue().Set(num);
}
void Init(v8::Local exports) {
exports->Set(Nan::New("add").ToLocalChecked(),
Nan::New(Add)->GetFunction());
}
NODE_MODULE(demo, Init)
修改一下dongjin/index.html
在dongjin目录下追加binding.gyp
{
"targets": [
{
"target_name": "demo",
"sources": [ "native/demo.cc" ],
"include_dirs": [
"
npm install -g node-gyp
npm install -g non
node-gyp configure
node-gyp build(网上很多资料这个地方没有写明白,这种编译出来的demo.node不能在electron中运行,在nodeJS中调用可以)
node-gyp build --target=3.0.8 --arch=x64 --dist-url=https://atom.io/download/electron(用这个编译后的demo.node可以再electron中运行)
或者
node-gyp rebuild --target=3.0.8 --arch=x64 --dist-url=https://atom.io/download/electron(有时候build不好用,用rebuild就可以了,目前还没搞明白为什么,请求高手指点)
运行
electron .(大功告成,已经能够通过JS调用C++代码了)
另外,生成的build目录中有个文件binding.sln,直接用Visual Studio打开写C++代码就可以了。
总结:
过程中坑太多了,上面是经过几百次试验后,得到的最简洁的步骤