Vite+Electron+React项目集成sqlite3启动报错:无法动态require
解决Vite+Electron集成sqlite3+Sequelize的动态require错误
问题分析
报错核心是Rollup无法处理sqlite3的动态require调用——sqlite3属于原生Node.js模块,Vite默认打包规则对这类模块支持有限,且你之前的@rollup/plugin-commonjs配置未作用到Electron主进程的独立打包流程中。
解决步骤
1. 调整Vite配置,针对Electron主进程配置CommonJS
将@rollup/plugin-commonjs的配置移至Electron主进程的build.rollupOptions内,确保配置只作用于主进程打包:
import { defineConfig } from "vite"; import path from "node:path"; import electron from "vite-plugin-electron/simple"; import react from "@vitejs/plugin-react"; import commonjs from "@rollup/plugin-commonjs"; export default defineConfig({ plugins: [ react(), electron({ main: { entry: "electron/main.ts", build: { rollupOptions: { plugins: [ commonjs({ dynamicRequireTargets: [ "node_modules/sqlite3/**/*", "node_modules/sequelize/**/*" // 同步处理Sequelize的动态依赖 ], }), ], }, }, }, preload: { input: path.join(__dirname, "electron/preload.ts"), }, renderer: process.env.NODE_ENV === "test" ? undefined : {}, }), ], });
2. 重新安装并重建sqlite3原生模块
先卸载现有依赖,再重新安装并针对当前Electron版本重建:
npm uninstall sqlite3 npm install sqlite3 --save-dev npx electron-rebuild -f -w sqlite3
若你的Electron版本非最新,需指定版本号确保重建匹配:
npx electron-rebuild -f -w sqlite3 --version=你的Electron版本号
3. 规范模块使用范围
原生模块不可直接在React渲染进程中引入,需按Electron架构拆分:
- 在主进程(
main.ts)中初始化Sequelize与sqlite3连接 - 预加载脚本(
preload.ts)通过contextBridge暴露IPC调用方法 - 渲染进程通过
window.electronAPI间接调用主进程的数据库逻辑
4. 补充Vite依赖优化配置
若问题仍存在,添加optimizeDeps.exclude让Vite跳过对sqlite3和Sequelize的预打包:
export default defineConfig({ optimizeDeps: { exclude: ["sqlite3", "sequelize"], }, // ...其他配置 });
内容的提问来源于stack exchange,提问作者Joel Sanchez
相关产品推荐
相关产品推荐

