幾年前我有一個 Electron 應用程式,我正在嘗試更新以使用最新版本的 Node、Electron 和我使用過的所有外部模塊。這是一次非常令人沮喪的經歷,因為所有范式都發生了變化,尤其是在安全方面,但我希望盡可能讓我的應用程式使用安全設定。
根據我的理解,Electron 的相關默認設定(我使用的是 16.0.5 版)是
nodeIntegration: false
contextIsolation: true
sandbox: true
這是我在 createWindow 塊中的內容:
const createWindow = () => {
// Create the browser window.
const win = new BrowserWindow({
width: 1280,
height: 720,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
}
});
// and load the index.html of the app.
win.loadFile('index.html');
// Open the DevTools.
win.webContents.openDevTools();
}
如您所見,我根本沒有更改默認值。這是需要的,遵循Electron 網站的安全說明。
但是,由于這個原因,我完全無法恢復我的應用程式以前的功能。我遇到的最大問題是我根本無法找到require任何外部依賴項的方法。據我了解,預加載檔案只能需要特定的 Electron 模塊,而普通的渲染器 JavaScript 檔案根本不需要任何東西(你會得到一個require() is not defined錯誤)。根據我從檔案中了解到的資訊,該main.js檔案具有正常require訪問權限,并且您打算用于ipc在它們之間進行通信main.js,preload.js因此只有您的主行程才能完全訪問遠程模塊。
這是罰款和花花公子,但我甚至不能require在任何main.js離開我非常困惑:
// in main.js
const google = require('googleapis');
App threw an error during load Error: Cannot find module 'googleapis'
我已經確定我已經yarn install正確編輯了,嘗試了不同的模塊,更改了順序等。我也無法在網上找到一個使用新默認安全設定但用于外部模塊的人的示例require。它們中的每一個都require用于內置內容和preload.js檔案示例,無論是來自 Google 還是官方檔案,都只是展示了如何公開基本的內置內容,例如window和document呼叫 using preload.js,這實際上并不是那么有用。
所以這是不可能的嗎?我不得不想知道一個不能使用任何公共 Node 模塊的 Node/Electron 應用程式到底有什么意義,所以如果默認的安全設定阻止你擁有一個提供任何有用功能的應用程式,我不不知道為什么它們是默認值。我錯過了什么?我怎樣才能重新使用外部模塊,例如googleapis和ffmpeg不禁用這些明顯關鍵的安全功能?
uj5u.com熱心網友回復:
事實證明,我遇到“無法找到模塊”錯誤的原因是因為我將 Yarn 與pnp. Electron 不支持不在node_modules檔案夾中的包,參見Yarn GitHub 上的討論和Electron GitHub 上的半確認問??題
切換到nodelinker: node-modules或nodelinker: pnpm以.yarnrc.yml到位的nodelinker: pnp解決它。
這仍然只是部分幫助我,因為我必須弄清楚如何允許沙盒渲染器和預加載訪問外部模塊方法,但它是一個起點,解決了我最初的“等待——你不能需要任何外部東西?”的挫敗感。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388408.html
