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

如何让Svelte-Kit、Electron与MongoDB在生产模式下正常运行?

核心问题根源

你之前的方案矛盾点在于:SvelteKit的服务端端点依赖Node.js服务运行,静态适配器构建会直接丢弃所有服务端逻辑,而Node适配器构建的产物需要启动独立HTTP服务才能运行,和Electron直接加载静态文件的模式不匹配。正确的解法是把所有服务端逻辑转移到Electron主进程实现,通过IPC和渲染进程(也就是SvelteKit构建的前端页面)通信。

第一步:调整SvelteKit配置

  • 保留adapter-static即可,关闭SSR全部走客户端渲染,适配Electron静态加载场景,参考svelte.config.js配置:
import adapter from '@sveltejs/adapter-static';

export default {
  kit: {
    adapter: adapter({
      pages: 'build',
      assets: 'build',
      fallback: 'index.html'
    }),
    ssr: false
  }
};
  • 移除所有原有+server.js/ts服务端端点,数据库相关逻辑全部迁移到Electron主进程实现。

第二步:Electron主进程配置

依赖安装

将MongoDB Node驱动安装为生产依赖,确保打包时被包含:

npm install mongodb --save

主进程核心逻辑

主进程负责MongoDB连接管理、IPC接口注册、静态页面加载:

// main.js 主进程入口文件
const { app, BrowserWindow, ipcMain } = require('electron');
const { MongoClient } = require('mongodb');
const path = require('path');

// 本地MongoDB连接配置
const MONGO_URI = 'mongodb://localhost:27017';
const DB_NAME = '你的业务数据库名';
let dbInstance;

// 初始化MongoDB连接
async function initMongoConnect() {
  const client = await MongoClient.connect(MONGO_URI);
  dbInstance = client.db(DB_NAME);
}

// 注册数据库操作IPC接口
ipcMain.handle('db:find', async (_, collectionName, query) => {
  const collection = dbInstance.collection(collectionName);
  return await collection.find(query).toArray();
});

ipcMain.handle('db:insert', async (_, collectionName, data) => {
  const collection = dbInstance.collection(collectionName);
  return await collection.insertOne(data);
});

// 按需补充更新、删除等其他数据库操作的IPC接口

// 创建窗口加载静态资源
function createWindow() {
  const win = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      contextIsolation: true,
      nodeIntegration: false,
      preload: path.join(__dirname, 'preload.js')
    }
  });

  if (app.isPackaged) {
    // 生产环境加载SvelteKit构建的静态页面
    win.loadFile(path.join(__dirname, '../build/index.html'));
  } else {
    // 开发环境加载SvelteKit dev服务地址
    win.loadURL('http://localhost:5173');
  }
}

app.whenReady().then(async () => {
  await initMongoConnect();
  createWindow();
});

Preload脚本配置

通过preload脚本安全暴露IPC接口给渲染进程,避免开启node集成的安全风险:

// preload.js
const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  dbFind: (collection, query) => ipcRenderer.invoke('db:find', collection, query),
  dbInsert: (collection, data) => ipcRenderer.invoke('db:insert', collection, data)
  // 补充其他暴露给前端的接口
});

第三步:SvelteKit前端逻辑调整

原有调用服务端端点的逻辑全部替换为调用暴露的IPC接口:

<script>
async function getUserList() {
  // 原有写法:const res = await fetch('/api/user/list');
  // 新写法
  const userList = await window.electronAPI.dbFind('users', { status: 1 });
  console.log(userList);
}
</script>

第四步:electron-builder打包配置

调整package.json中的build配置,确保所有必要文件被打包:

{
  "build": {
    "appId": "com.your.app.id",
    "files": [
      "main.js",
      "preload.js",
      "build/**/*"
    ],
    "win": {
      "target": "nsis"
    },
    "mac": {
      "target": "dmg"
    }
  }
}

可选优化

如果后续希望免去用户手动安装MongoDB的步骤,可以替换为嵌入式轻量数据库如better-sqlite3、leveldb,无需额外运行服务,完全嵌入Electron包内,更适合离线桌面场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:36:03