Electron自定义模块引入报错:Cannot find module './my-module-two'
解决Electron中require本地模块报错的问题
看起来你遇到的核心问题是渲染进程的执行环境和Node.js模块系统不兼容导致的。当你用普通<script>标签直接引入my-module-one.js时,这段代码运行在浏览器全局上下文,而非Node.js的模块环境,所以require无法按照预期找到你的本地模块。下面给你几个可行的解决方案:
方案一:改用ES模块(推荐,符合现代前端规范)
这种方式不需要依赖Node集成,更适配浏览器的模块加载逻辑:
- 修改
my-module-two.js为ES导出格式:
export class MyModuleTwo { // 可在此添加类的方法或属性 }
- 修改
my-module-one.js使用ES导入:
import { MyModuleTwo } from './my-module-two.js'; class MyModuleOne { constructor() { this.myModuleTwoInstance = new MyModuleTwo(); } }
- 更新
index.html中的script标签,添加type="module"属性:
<script type="module" src="js/my-module/my-module-one.js"></script>
这样浏览器会按照ES模块规则解析文件,相对路径的导入就能正常工作了。
方案二:启用Electron渲染进程的Node集成(适合坚持用CommonJS的场景)
如果你想继续使用CommonJS的require,需要确保渲染进程能访问Node.js的API:
- 打开主进程文件
main.js,修改BrowserWindow的webPreferences配置:
const { BrowserWindow } = require('electron'); const mainWindow = new BrowserWindow({ // 其他窗口配置项 webPreferences: { nodeIntegration: true, // 启用Node API访问权限 contextIsolation: false, // Electron 12+版本必须设置此项,否则无法直接在渲染进程使用Node API // 注意:生产环境关闭contextIsolation存在安全风险,后续建议改用预加载脚本方案 } });
- 调整
my-module-one.js的require位置(可选,但更稳妥):
// 直接在文件顶部执行require,而非构造函数内部 const { MyModuleTwo } = require('./my-module-two.js'); class MyModuleOne { constructor() { this.myModuleTwoInstance = new MyModuleTwo(); } }
- 额外排查:确保文件名拼写完全一致(尤其是大小写,macOS/Linux系统对文件名大小写敏感),或者尝试在require时明确加上
.js扩展名。
辅助排查小技巧
如果你不确定当前路径是否正确,可以在my-module-one.js里打印__dirname(启用Node集成后可用),查看当前文件的绝对目录,再确认相对路径是否正确:
console.log(__dirname); // 输出当前js文件所在的绝对路径
内容的提问来源于stack exchange,提问作者Kévin Bibollet
相关产品推荐
相关产品推荐

