Electron项目导入使用fs模块的依赖包时触发报错该如何解决?
问题根因
你遇到的报错本质是React默认构建工具(通常为create-react-app自带的react-scripts)在打包渲染进程代码时,默认将Node.js原生核心模块(包括fs、path等)替换为空的mock对象,哪怕你已经开启了Electron的nodeIntegration权限,构建阶段就已经被替换的模块也无法在运行时调用真实的Node能力,所以会提示方法不存在。
可行解决方案
这里优先推荐无需修改B、C、D等下层依赖包代码的方案:
方案1:通过react-app-rewired修改webpack配置(无需eject CRA配置)
适合使用create-react-app创建、未eject配置的项目:
- 安装依赖
npm install react-app-rewired customize-cra --save-dev
- 在项目根目录新建
config-overrides.js文件,添加如下配置,告诉webpack不要打包Node原生模块,运行时直接从Electron环境加载:
const { override, addWebpackExternals } = require('customize-cra'); module.exports = override( addWebpackExternals({ fs: 'commonjs fs', path: 'commonjs path', // 其他依赖中用到的Node原生模块都可以按这个格式添加 electron: 'commonjs electron' }) );
- 修改
package.json中的启动/构建脚本,把react-scripts替换为react-app-rewired:
{ "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject" } }
修改完成后重新启动项目,下层依赖包中的fs引入就可以正常工作。
方案2:已eject CRA配置的项目
直接修改项目下的config/webpack.config.js,找到externals配置项,添加如下内容即可:
externals: { fs: 'commonjs fs', path: 'commonjs path', electron: 'commonjs electron' }
额外注意事项
你当前开启的nodeIntegration: true和contextIsolation: false存在安全风险,如果后续项目需要对外发布,建议将所有fs相关操作迁移到Electron主进程实现,渲染进程通过IPC调用主进程能力,关闭nodeIntegration并开启contextIsolation提升安全性。
内容的提问来源于stack exchange,提问作者Nuubles
相关产品推荐
相关产品推荐

