Electron Node 原生模塊

2023-02-16 17:16 更新

原生Node.js模塊由Electron支持,但由于Electron具有與給定Node.js不同的 應用二進制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差異),您使用的原生 模塊需要為Electron重新編譯。 否則,當您嘗試運行您的應用程序時, 將會遇到以下的錯誤:

Error: The module '/path/to/native/module.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION $XYZ. This version of Node.js requires
NODE_MODULE_VERSION $ABC. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

如何安裝原生模塊?

有多種不同的方法來安裝原生模塊:

為 Electron 安裝并重新編譯模塊

您可以像其他 Node 項目一樣安裝模塊,然后用 electron-rebuild 包重建這些模塊以適配 Electron 。 這個包可以自動識別當前 Electron 版本,為你的應用自動完成下載 headers、重新編譯原生模塊等步驟。 如果您正在使用 Electron Forge,這個工具將在開發(fā)模式和發(fā)布時自動使用。

例如,你可以通過下面的命令來安裝獨立的 electron-rebuild 工具并重新編譯模塊:

npm install --save-dev electron-rebuild

# Every time you run "npm install", run this:
./node_modules/.bin/electron-rebuild

# If you have trouble on Windows, try:
.\node_modules\.bin\electron-rebuild.cmd

有關使用和與其他工具(如 Electron Packager)集成的更多信息,請參閱項目的自述文件。

通過 npm 安裝?

只要設置一些系統(tǒng)環(huán)境變量,你就可以通過 ?npm? 直接安裝原生模塊。

例如,要安裝所有Electron的依賴:

# Electron 的版本。
export npm_config_target=1.2.3
# Electron的目標架構, 可用的架構列表請參見
# https://electronjs.org/docs/tutorial/support#supported-platforms
export npm_config_arch=x64
export npm_config_target_arch=x64
# 下載 Electron 的 headers。
export npm_config_disturl=https://electronjs.org/headers
# 告訴 node-pre-gyp 我們是在為 Electron 生成模塊。
export npm_config_runtime=electron
# 告訴 node-pre-gyp 從源代碼構建模塊。
export npm_config_build_from_source=true
# 安裝所有依賴,并緩存到 ~/.electron-gyp。
HOME=~/.electron-gyp npm install

為 Electron 手動編譯?

如果你是一個原生模塊的開發(fā)人員,想在 Electron 中進行測試, 你可能要手動編譯 Electron 模塊。 你可以 使用 ?node-gyp? 直接編譯:

cd /path-to-module/
HOME=~/.electron-gyp node-gyp rebuild --target=1.2.3 --arch=x64 --dist-url=https://electronjs.org/headers
  • HOME=~/.electron-gyp 設置去哪找頭文件
  • --target=1.2.3 設置了 Electron 的版本。
  • --dist-url=...設置了 Electron 的 headers 的下載地址。
  • --arch=x64 設置了該模塊為適配64位操作系統(tǒng)而編譯。

為Electron的自定義編譯手動編譯

如果是為一個與公共發(fā)行版不匹配的Electron自定義版本編譯原生Node模塊,需要讓npm使用你的Electron自定義版本所對應的Node版本。

npm rebuild --nodedir=/path/to/src/out/Default/gen/node_headers

故障排查?

如果您安裝了本機模塊并發(fā)現(xiàn)它無法正常工作,則需要檢查以下內容:

  • 當有疑問時,請先執(zhí)行 electron-rebuild。
  • 確保原生模塊與Electron應用程序的目標平臺和體系結構兼容。
  • 確保在該模塊的binding.gypwin_delay_load_hook沒有被設置為false。
  • 如果升級了 Electron,你通常需要重新編譯這些模塊。

關于win_delay_load_hook的說明

在Windows上,默認情況下,node-gyp將原生模塊與node.dll鏈接。 然而,在Electron 4.x和更高的版本中,原生模塊需要的symbols由electron.exe導出,并且沒有node.dll。為了在 Windows 上加載本機模塊,node-gyp 安裝了一個延遲加載掛鉤,它在加載本機模塊時觸發(fā),并重定向 node.dll 引用以使用加載可執(zhí)行文件,而不是在庫搜索中查找 node.dll路徑(什么也沒有)。因此,在 Electron 4.x 及更高版本上,?'win_delay_load_hook': 'true'? 是加載本機模塊所必需的。

如果您收到類似 Module did not self-register 或 The specified procedure could not be found 之類的錯誤,則可能意味著您嘗試使用的模塊未正確包含延遲加載掛鉤。如果模塊是使用 node-gyp 構建的,請確保 binding.gyp 文件中的 ?win_delay_load_hook? 變量設置為 true,并且不會在任何地方被覆蓋。如果該模塊是使用另一個系統(tǒng)構建的,則需要確保使用安裝在主 .node 文件中的延遲加載掛鉤進行構建。您的 link.exe 調用應如下所示:

 link.exe /OUT:"foo.node" "...\node.lib" delayimp.lib /DELAYLOAD:node.exe /DLL
     "my_addon.obj" "win_delay_load_hook.obj"

特別重要的是:

  • 您從 Electron 而不是 Node 鏈接到 node.lib。如果你鏈接到錯誤的 node.lib,當你在 Electron 中需要模塊時,你會得到加載時間錯誤。

  • 您包括標志 /DELAYLOAD:node.exe。如果 node.exe 鏈接沒有延遲,則延遲加載掛鉤將沒有機會觸發(fā),節(jié)點符號也不會被正確解析。

  • win_delay_load_hook.obj 直接鏈接到最終的 DLL 中。如果掛鉤設置在依賴的 DLL 中,它不會在正確的時間觸發(fā)。

如果您要實現(xiàn)自己的延遲加載掛鉤示例,請參閱 node-gyp。

依賴于 prebuild 的模塊

prebuild 提供了一種方法來為多個版本的 Node 和 Electron 發(fā)布帶有預構建二進制文件的原生 Node 模塊。

如果預構建模塊提供二進制文件供 Electron 使用,請確保省略 --build-from-source 和 npm_config_build_from_source 環(huán)境變量,以充分利用預構建的二進制文件。

依賴于 node-pre-gyp 的模塊

node-pre-gyp 工具 提供一種部署原生 Node 預編譯二進制模塊的方法, 許多流行的模塊都是使用它。

有時這些模塊在 Electron 下運行良好,但是當沒有可用的 Electron 特定二進制文件時,您將需要從源代碼構建。因此,建議對這些模塊使用 electron-rebuild。

如果您按照 npm 方式安裝模塊,則需要將 --build-from-source 傳遞給 npm,或設置 npm_config_build_from_source 環(huán)境變量。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號