You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块,需两步配置:

  1. 在项目根目录的package.json中添加:
{
  "type": "module"
}
  1. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:53:24