Electron+Sequelize+SQLite3主进程模块加载失败的解决方法
解决Electron+Vite环境下主进程无法加载Sequelize模型文件的问题
问题根源
报错Cannot find module './database/models/index.js'的核心原因有两个:
- 路径解析偏差:Vite构建主进程后,输出文件位于
.vite/build目录,此时代码中的相对路径./database指向的是构建后的目录,而非源码中的src/database。 - 资源未被复制:Vite默认不会将非入口依赖的目录(如
database)复制到构建输出目录,导致构建后目标文件不存在。
具体解决方案
1. 改用绝对路径定位模型文件
利用path.resolve结合__dirname构建绝对路径,确保无论构建前后都能正确找到文件:
"use strict"; const { app, BrowserWindow } = require("electron"); const path = require("node:path"); if (require("electron-squirrel-startup")) { app.quit(); } // 替换原相对路径为绝对路径,根据你的实际文件结构调整层级 const db = require(path.resolve(__dirname, "../src/database/models/index.js")); console.log(db); // 剩余主进程代码不变 const createWindow = () => { const mainWindow = new BrowserWindow({ width: 1500, height: 800, icon: path.resolve(__dirname, "../src/assets/images/logo.svg"), // 图标路径也建议改用绝对路径 webPreferences: { preload: path.join(__dirname, "preload.js"), nodeIntegration: true } }); mainWindow.loadURL("http://localhost:5173"); mainWindow.webContents.openDevTools(); };
2. 配置Vite复制database目录到构建输出
通过Vite插件将源码中的database目录复制到构建后的.vite/build目录,确保构建后文件存在:
方法一:使用vite-plugin-copy插件
- 安装插件:
npm install vite-plugin-copy --save-dev
- 在
vite.config.js中添加配置:
import { defineConfig } from 'vite'; import electron from 'vite-plugin-electron'; import copy from 'vite-plugin-copy'; export default defineConfig({ plugins: [ electron({ main: { entry: 'src/main.js', }, }), copy({ targets: [ { src: 'src/database/**/*', dest: '.vite/build/database' }, ], hook: 'writeBundle' // 确保在构建完成后执行复制 }), ], });
方法二:手动添加复制逻辑(无需额外插件)
在vite.config.js的主进程构建配置中添加自定义复制逻辑:
import { defineConfig } from 'vite'; import electron from 'vite-plugin-electron'; import fs from 'fs-extra'; export default defineConfig({ plugins: [ electron({ main: { entry: 'src/main.js', vite: { build: { plugins: [ { name: 'copy-database', writeBundle() { // 复制src/database到构建目录 fs.copySync('src/database', '.vite/build/database', { overwrite: true }); }, }, ], }, }, }, }), ], });
3. 修正Sequelize数据库文件路径
确保Sequelize配置文件中的SQLite存储路径为绝对路径,避免数据库文件找不到:
// src/database/config/config.js const path = require('node:path'); module.exports = { development: { dialect: 'sqlite', storage: path.resolve(__dirname, '../../database.sqlite'), // 用绝对路径定位数据库文件 logging: false }, };
内容的提问来源于stack exchange,提问作者Adrian Caragea
相关产品推荐
相关产品推荐

