TypeError: fs.existsSync is not a function

前言

項(xiàng)目中采用create-react-app及electron進(jìn)行框架搭建時(shí),在沒(méi)有使用electron時(shí),一切都可以正常啟動(dòng)。
但是,當(dāng)需要在頁(yè)面中添加 import { dialog,ipcRenderer } from 'electron';時(shí),開(kāi)始報(bào)錯(cuò)。

錯(cuò)誤內(nèi)容
TypeError: fs.existsSync is not a function

image.png

錯(cuò)誤原因
有種解釋是,create-react-app使用的webpack會(huì)干擾標(biāo)準(zhǔn)模塊的加載,導(dǎo)致了無(wú)法正常使用Node.js的模塊。
但個(gè)人覺(jué)得更為合理的解釋是,electron本身就是node服務(wù)端內(nèi)容,而import默認(rèn)是由webpack來(lái)處理,相當(dāng)于是瀏覽器進(jìn)程來(lái)嘗試加載。瀏覽器進(jìn)程不能調(diào)用服務(wù)進(jìn)程的一些接口,如fs模塊只能在服務(wù)端加載,這時(shí)候在瀏覽器進(jìn)程加載electron就會(huì)報(bào)錯(cuò)。

解決方案

因?yàn)闉g覽器端無(wú)法加載electron,那么,我們可以使用preload預(yù)加載將需要的接口暴露出來(lái)。

  1. 創(chuàng)建一個(gè)preload.js文件,放在入口文件main.js的同級(jí)目錄下。
global.electron = require('electron');
window.ipcRenderer = require('electron').ipcRenderer;
window.remote = require('electron').remote;
  1. 修改main.js文件
    在入口文件中添加preload配置項(xiàng),將preload.js作為預(yù)加載文件。預(yù)加載的時(shí)候還是可以使用nodejs里的api
  mainWindow = new BrowserWindow({
    width: 800, 
    height: 600,
    webPreferences: {
      nodeIntegration: false,
      preload: __dirname + '/preload.js'
    }
  });
  1. 在組件中如下使用即可。
const electron = window.electron;
const remote = window.remote;
console.log(electron)
console.log(remote.dialog)

const {dialog} = window.remote;
dialog.showErrorBox('title', 'content');

參考文檔:

https://github.com/electron/electron/issues/9920

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容