在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
相关产品推荐
相关产品推荐

