因爲老大的要求,須要把前端項目打包成客戶端而且可以調用dll文件就要求我去作一下調研,我花了三天時間各類找資料各類翻github終於踩完了這些坑!tm差點都快抑鬱了!這裏來總結並給出一些個人解決方案吧,新鮮的 要趁熱哦 -o -....html
在nodejs裏有兩種方式去調用dll文件:前端
第一種:若是有c++的開發經驗就能夠直接看 Electron使用NodeJS擴展模塊調用DLL貌似也是官方推薦的方法,nodejs官網也提供了相關文檔 文檔連接node
第二種:經過node-ffi模塊,如下內容都是講經過這個模塊去調用的,比較適合只作前端開發的同窗python
1.切換成淘寶源,安裝相關的環境依賴python(v2.7 ,3.x不支持);c++
visual C++ Build Tools,或者 (vs2015以上(包含15))git
.net framework 4.5.1 或者執行 (推薦)github
npm install --global --production windows-build-tools
(大家看哪一個方便,我是選了這個,會自動把python和c++開發工具包都集成進去)shell
2.安裝node-gyp npm install -g node-gyp
接着安裝 npm install ffi --save
「好戲」開始了:npm
node-gyp的其它使用者提出一種解決方案: node 版本 10.15以上結合着這個模塊會有路徑問題,解決方法須要回退node版本至8,或者對變量設置路徑json
Windows: >set npm_config_node_gyp=C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js//我這裏不能在powershell使用,命令不生效,cmd能夠,這裏設置你的實際路徑)
TLS驗證錯誤
github.com/nodejs/node… (解決方案,取消TLS證書驗證)set NODE_TLS_REJECT_UNAUTHORIZED=0
依舊是個set 命令
error:MSB4019:未找到導入的項目...(嗯,貌似又是路徑的問題)
到這裏我就放棄執行 npm install ffi --save
這個命令了,我直接從git倉庫裏面去拉這個模塊。(要是沒有該問題的話能夠跳過此步驟)
git clone git://github.com/node-ffi/node-ffi.git
cd node-ffi
node-gyp rebuild //若是是在electron裏面使用的話還須要加上參數
複製代碼
終於生成代碼了,我這裏沒有報錯只是給了些警告,我這裏能夠無論它,直接把該文件夾copy到nodemodules中。 接着嘗試一下nodejs裏能不能調用到dll文件裏的方法。
在當前目錄裏新建一個app.js文件,代碼以下:
const ffi = require("node-ffi");
const User32 = ffi.Library('user32', {
'GetWindowLongPtrW': ['int', ['int', 'int']],
'SetWindowLongPtrW': ['int', ['int', 'int', 'long']],
'GetSystemMenu': ['int', ['int', 'bool']],
'DestroyWindow': ['bool', ['int']]
})
console.log(User32.DestroyWindow(1000));//返回false
複製代碼
執行node app.js
應該能在控制檯裏看到返回值哦 PS :若是還不行多是缺乏ref ref-struct 還有bingdings模塊。按照提示下載便可,ref同ffi都須要在當前目錄執行 node-gyp rebuild 而後再copy文件夾到nodemodules目錄裏。
若是直接在electron裏面使用app.js的代碼會報以下的錯:
經過rebuild編譯出來的包node版本和electron裏的Node版本不一致,在編譯這些包時應該指定electron版本。 執行node-gyp rebuild -target=4.2.3 -arch=x64 --dist-url=https://atom.io/download/electron
後再把對應的包放到nodemoudles裏面去就行了。可是大家在指定electron的版本時不要直接看package.json裏的,我這裏顯示的是^4.0.1,下載的模塊版本時>=4.0.1的因此不是實際的版本號。 在package.json裏補充好以前經過rebuild後的依賴包信息,不然會報錯,據其餘網友說是打包的時候會從新下載這些依賴