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

在Svelte/Rollup项目中导入CommonJS库报require未定义如何解决?

问题原因
  • 你当前用的Rollup配置是纯Web端的Svelte模板默认配置,完全没有适配Electron渲染进程使用Node.js原生模块的需求
  • Rollup输出格式设为了iife,这种立即执行函数格式仅适配纯浏览器环境,不会处理Node.js的require语法
  • @rollup/plugin-node-resolve配置了browser: true,会强制所有依赖包加载浏览器适配版本,屏蔽Node.js内置模块和原生Node包的加载逻辑
  • 最新版Electron默认关闭渲染进程的Node.js调用能力、开启上下文隔离,此时渲染进程本身就无法访问require方法,你大概率没有修改这部分默认配置
  • 你之前用的React/Vue的Electron脚手架默认已经做了打包适配和Electron权限配置,所以不会出现该问题
解决步骤

1. 修改Rollup配置

修改rollup.config.js的对应字段:

export default {
    input: 'src/main.ts',
    output: {
        sourcemap: true,
        // 把iife改成cjs,适配Electron渲染进程的CommonJS模块规范
        format: 'cjs',
        name: 'app',
        file: 'public/build/bundle.js'
    },
    plugins: [
        // 其他插件保持不变
        resolve({
            // 把browser: true删掉或者改成false
            browser: false,
            // 新增优先使用Node内置模块配置
            preferBuiltins: true,
            dedupe: ['svelte']
        }),
        // 其他插件保持不变
    ]
}

2. 配置Electron窗口权限

在你创建Electron BrowserWindow的代码中,修改webPreferences配置(学习阶段可以用这个配置,生产环境建议用预加载脚本暴露API,不要直接开启Node集成):

const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
        // 开启渲染进程Node.js调用权限
        nodeIntegration: true,
        // 关闭上下文隔离
        contextIsolation: false
    }
})

3. 导入依赖

直接用ES模块导入语法即可,无需使用require:

import ModbusRTU from "modbus-serial"

可选:重编译原生依赖

如果后续出现模块版本不匹配的报错,执行以下命令重编译原生依赖适配Electron版本即可:

npx electron-rebuild

内容的提问来源于stack exchange,提问作者Topo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:36:01