日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

electron 打包把node代理服务打包进去_专题:让C++给node做技术加持(三)编译electron本地模块踩坑记

發(fā)布時間:2024/9/27 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 electron 打包把node代理服务打包进去_专题:让C++给node做技术加持(三)编译electron本地模块踩坑记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歡迎來到我的專題文章:《讓C++給node做技術(shù)加持》系列。更多內(nèi)容,持續(xù)更新中,歡迎關(guān)注。

往期目錄:

專題:讓C++給node做技術(shù)加持(一)環(huán)境搭建,項目運行

專題:讓C++給node做技術(shù)加持(二)-NodeJs調(diào)用C++方法

上一章節(jié),我介紹了NodeJs如何與C++進(jìn)行交互的環(huán)境搭建,C++為nodejs提供API,成功實現(xiàn)了雙方 的交互。具體細(xì)節(jié)可移步到第二章節(jié)。

NodeJs應(yīng)用場景

在前端領(lǐng)域,nodejs被應(yīng)用最廣泛的,無非是網(wǎng)站后臺。這個時候我們把打包好的.node二進(jìn)制文件部署到服務(wù)器即可。

然后隨著nodejs不斷發(fā)展,桌面端開發(fā)也是異常火熱。前端圈中以electron為首的桌面應(yīng)用框架也是琳瑯滿目。

既然是桌面開發(fā),那肯定有調(diào)用操作系統(tǒng)底層的API能力,比如操作數(shù)據(jù)庫,文件讀寫等,肯定也少了不nodejs支持。

好,前面我們既然能將C++編譯好的.node文件給nodejs調(diào)用,那是否可以無縫移植到electron項目中來呢?

恩。動手試試就知道了。

首先我們來創(chuàng)建一個electron快速啟動的項目,這里就不做演示了,我自己已經(jīng)創(chuàng)建好了

創(chuàng)建了一個800*600的空窗口,這不是重點

接下來我們在項目根目錄下引入我們通過node-gyp rebuild打包好的.node二進(jìn)制文件

接下來我們來啟動下electron,看效果

哦豁,好像啟動失敗了

//看下面的錯誤信息,說的好像是版本沒匹配對。NODE_MODULE_VERSION 64. This version of Node.js requiresNODE_MODULE_VERSION 76. Please try re-compiling or re-installing

的確是這樣的哈,我們的electron中的nodejs使用的v8和普通的nodejs的v8還不太一樣,導(dǎo)致正常編譯下的.node文件不能被electron使用。

解決問題

接著我們肯定要開始著手解決這個問題了,通過查閱資料,發(fā)現(xiàn)在我們在編譯C++時針對electron有自己獨立的參數(shù)。

好了,直接上編譯參數(shù)了。

node-gyp rebuild --target=8.2.2 --dist-url=https://atom.io/download/electron

--target表示我當(dāng)前electron的版本為8.2.2 --dist-url表示我們要這個地址下載對應(yīng)的頭文件,這個過程一般很難執(zhí)行下來。我也是嘗試了很多次才搞好的。 我們接下來看下編譯過程。

呀!好像翻車了。。

別著急,遇到問題,我們先來看下錯誤提示。

'MaybeLocal<:string>' to 'v8::Local<:string> &&' for 1st argument

意思就是我們不能像之前這樣

Local val = String::NewFromUtf8(isolate,str.c_str()); args.GetReturnValue().Set(val);

直接通過Local去接收返回值了,得替換成MaybeLocal<:string>這種數(shù)據(jù)類型。

好吧,按照提示來唄。

但是我發(fā)現(xiàn),MaybeLocal這種類型是不能直接返回到NodeJs那邊去的。Nodejs那邊能接受的類型都是通過Local來定義的。

那怎么樣?沒辦法,只有硬著頭皮翻下v8的文檔了。我找啊找,找啊找,終于,我找到了這個文檔,

好像看到了希望啊。MabelLocal有一個方法ToLocalChecked();可以一試了。

好了,我的編譯終于成功了。我們copy下.node文件到electron項目中,接著啟動下項目

終于成功調(diào)用啦。。。

到這,坑算是填好了。

總結(jié)

  • 在做項目,或者為項目做技術(shù)調(diào)研的時候,難免會入坑,查閱資料去把坑填好,也是我們在技術(shù)成長中非常重要的一環(huán)。
  • 這種開發(fā)C++本地模塊的方式已經(jīng)不被Nodejs官網(wǎng)推薦了,因為它過度依賴于nodejs版本和electron版本,無法做到一次編寫,一次編譯。無論是electron還是普通的Nodejs都可以無縫調(diào)用。
  • 為了解決這些痛點,nodejs已經(jīng)給了開發(fā)者新的開發(fā)模塊,那就是N-API,它就比較靈活了,后面我們接著說它。
  • 下期,柳暗花明,以N-AP模式基于C++開發(fā)nodejs模塊的春天要來了。

    這里是 暢哥聊技術(shù) 《讓C++給node做技術(shù)加持》專題系列文章,更多內(nèi)容,持續(xù)更新中,歡迎關(guān)注。

    全文完。

    總結(jié)

    以上是生活随笔為你收集整理的electron 打包把node代理服务打包进去_专题:让C++给node做技术加持(三)编译electron本地模块踩坑记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。