Electron项目迁移JS函数至外部文件时模块导入报错求助
问题排查与解决方法
一、模块系统报错("Cannot use import statement outside a module")
Electron主进程默认采用CommonJS模块规范,直接用ES模块的import会触发报错,以下是两种解决路径:
方案1:改用CommonJS规范(适配Electron默认环境)
修改main.js的导入逻辑:
// 替换main.js顶部的import语句 const logout = require('./auth.js');
同步修改auth.js的导出方式:
// 替换auth.js末尾的export语句 module.exports = logout;
调用时调整为直接使用导出的函数:
// 原auth.logout改为直接调用logout const logoutStatus = await logout(cookies['B1SESSION'], cookies['ROUTEID'], serviceLayer);
方案2:配置项目启用ES模块
如果坚持使用ES模块,需两步配置:
- 在项目根目录的
package.json中添加:
{ "type": "module" }
- 确保Electron启动方式兼容,直接用
electron .启动时,Node.js会识别package.json的type字段,若使用打包工具(如electron-forge),需确认打包配置未禁用ES模块支持。
二、auth.js变量未定义问题
即使模块问题解决,auth.js仍会报错——它引用了main.js中定义的serviceLayer和data变量,但自身未定义这些内容,且Logout接口通常不需要请求体,修改如下:
// auth.js const logout = async (session, node, serviceLayer) => { try { const url = serviceLayer + 'Logout' const customHeaders = { 'Content-Type': "application/json", 'Cookie': `B1SESSION=${session};ROUTEID=${node}` } // Logout接口一般无需请求体,移除body字段(若接口明确要求,需将data作为参数传入) const response = await fetch(url, { method: 'POST', headers: customHeaders }) return response.status } catch (error) { console.log(error); } } // CommonJS导出:module.exports = logout; // ES模块导出:export default logout;
调用时传入serviceLayer参数:
const logoutStatus = await logout(cookies['B1SESSION'], cookies['ROUTEID'], serviceLayer);
三、额外注意事项
- 若配置
package.json的type: module,项目中所有文件需统一使用ES模块规范,禁止混用require和import - Electron 18及以上版本默认支持
fetch,低版本需引入polyfill或配置相关参数 - 测试时可单独验证
logout函数的参数传递逻辑,确保变量正确传入
内容的提问来源于stack exchange,提问作者Joe F
相关产品推荐
相关产品推荐

