天天看點

Electron踩坑筆記——require is not defined

作者:mulianju

Electron作為一個跨平台的前端架構,已經聞名好多年了,現在開始學習可能顯得有點晚,不過遲到總比沒有強,從現在開始一步一步的學吧。

遇到問題

剛剛開始開發第一個demo,是參考的網上找的教程。

可能是這個教程出的還比較早,在跟随教程步驟開發時,Electron視窗雖然打開了,但裡面一直沒有内容。

後來通過調試工具發現報了一個require is not a function錯誤。

Electron踩坑筆記——require is not defined

問題原因

由于require可以直接請求運作客戶機上的檔案,容易引起安全問題,而在Electron 12以後的版本中被禁止。Electron官方文檔原文如下:

上下文隔離功能将確定您的 預加載腳本 和Electron的内部邏輯 運作在所加載的webcontent網頁 之外的另一個獨立的上下文環境裡。 這對安全性很重要,因為它有助于阻止網站通路Electron的内部元件 和 您的預加載腳本可通路的高等級權限的API 。

這意味着,實際上,您的預加載腳本通路的window對象并不是網站所能通路的對象。例如,如果您在預加載腳本中設定window.hello = 'wave'并且啟用了上下文隔離,當網站嘗試通路window.hello對象時将傳回undefined。

自Electron 12以來,預設情況下已啟用上下文隔離,并且它是 所有應用程式推薦的安全設定。

解決方案

如果需要直接飲用客戶機上的檔案,則需要設定web上下文contextIsolation選項為false。

Electron踩坑筆記——require is not defined

修改後,本地使用require時,程式就正常跑起來了。

Electron踩坑筆記——require is not defined

影響

不過,看官方文檔描述,并沒有提到require的問題,由此不難分析出,這麼設定并不是針對解決這個問題的,而是解決上下文隔離的問題,那這樣的話,修改了contextIsolation的值,必然會影響到上下文隔離相關的API。具體來說,就是contextBridge API将不能使用。

Electron踩坑筆記——require is not defined

本文永久連結: https://www.mulianju.com/electron-note__require/

繼續閱讀