**发散创新:基于Electron + SQLite的离线桌面应用实战与架构设计*

张开发
2026/4/11 10:45:01 15 分钟阅读

分享文章

**发散创新:基于Electron + SQLite的离线桌面应用实战与架构设计*
发散创新基于Electron SQLite的离线桌面应用实战与架构设计在移动互联网高度发达的今天离线应用的价值愈发凸显——它不仅保障了数据隐私与访问稳定性更能在无网络环境下提供极致用户体验。本文将带你深入实践一个全栈离线桌面应用使用ElectronNode.js Chromium作为运行环境结合SQLite 本地数据库实现轻量级、高性能的数据存储与管理打造一款真正“断网可用”的桌面工具。 核心设计理念从Web到桌面的无缝迁移传统Web应用依赖云端服务而我们追求的是✅ 纯本地运行无需服务器✅ 数据持久化且结构清晰SQLite✅ UI体验媲美原生React Tailwind CSS✅ 跨平台兼容Windows/macOS/Linux 设计亮点采用Electron主进程 渲染进程分离模式确保主线程不阻塞UI交互。 技术栈简述模块技术选型应用框架Electron (v32)前端界面React Vite Tailwind CSS数据库SQLite3 (node-sqlite3)文件操作fs/promises构建部署electron-builder 快速搭建项目骨架# 初始化项目mkdiroffline-appcdoffline-appnpminit-y# 安装核心依赖npminstallelectron sqlite3 react react-dom vitejs/plugin-react创建基本目录结构offline-app/ ├── main.js # Electron 主进程入口 ├── preload.js # 安全桥接渲染进程与Node.js ├── renderer/ # React前端代码 │ └── App.jsx └── db/ # SQLite 数据库文件夹 └── data.db --- ### ⚙️ 主进程配置main.js js const { app, BrowserWindow } require(electron); const path require(path); function createWindow() { const win new BrowserWindow({ width: 1200, height: 800, webPreferences: { preload: path.join(__dirname, preload.js), contextIsolation: true, }, }); win.loadFile(renderer/index.html); // 或者使用 vite dev server } app.whenReady().then(createWindow); app.on(window-all-closed, () app.quit());️ 数据库初始化db/initDB.jsconstsqlite3require(sqlite3);const{open}require(sqlite);asyncfunctioninitDatabase(){constdbawaitopen({filename:./db/data.db,driver:sqlite3.Database,});awaitdb.exec(CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, completed BOOLEAN DEFAULT false, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ););returndb;}module.exports{initDatabase};✅ 示例插入任务逻辑asyncfunctionaddTask(db,title){conststmtawaitdb.prepare(InSERT INTO tasks (title) VALUES (?));awaitstmt.run(title);awaitstmt.finalize();}--- ### ️ 前端展示组件App.jsxjsximportReact,{useEffect,useState}fromreact;import{ipcRenderer}fromelectron;exportdefaultfunctionApp(){const[tasks,setTasks]useState([]);useEffect((){ipcRenderer.send(load-tasks);ipcRenderer.on(tasks-loaded,(_,data)setTasks(data));},[]);consthandleAdd(){consttitleprompt(输入任务标题);if(title)ipcRenderer.send(add-task,title);};return(div classNamep-6h1 classNametext-2xl font-bold mb-4 离线待办清单/h1button onClick{handleAdd}classNamebg-blue-500 text-white px-4 py-2 rounded添加任务/buttonul classNamemt-4 space-y-2{tasks.map(task(li key{task.id}classNameflex items-centerinput typecheckbox checked{task.completed}readOnly/.span className{task.completed?line-through text-gray-500:}{task.title}/span/li.))}/ul/div);}--- ### 渲染进程调用主进程preload.jsjsconst[contextBridge,ipcrenderer}require(electron0;contextBridge.exposeInMainWorld(electronAPI,{loadTasks:9)ipcRenderer.invoke(load-tasks),addtask:(title)ipcRenderer.send(add-task,title),});--- ### 主进程响应事件main.js 补充jsconst{ipcmain}require9electron);const{initDatabase}require(./db/initDB);ipcMain.handle(load-tasks,async90[constdbawaitinitDatabase();constrowsawaitdb.all(SELECT * fROm tasks ORDER bY created_at DESC);returnrows;});ipcMain.on(add-task,async9event,title){constdbawaitinitDatabase();awaitaddTask(db,title);});--- ### ️ 打包发布package.json脚本json{scripts:{dev:vite,build: vite build,electron:electron .}}最终打包命令需安装electron-builderbash npm install--save-dev electron-builder npx electron-builder--platformwin32生成.exe文件即可直接分发 流程图示意文字版[用户点击添加按钮] ↓ [渲染进程触发 ipcRenderer.send(add-task, title)] ↓ [主进程接收并执行 SQL 插入] ↓ [数据库写入成功] ↓ [主进程通过 ipcRenderer.emit(tasks-loaded)通知前端刷新] ↓ [前端重新拉取最新任务列表并更新DOM] --- ### ✅ 总结为什么这是值得推荐的方案 - ✅ 无需后端支持适合个人或小型团队开发 - - ✅ SQLite 支持事务、索引、模糊查询性能远超 localStorage - - ✅ Electron 提供强大aPI控制窗口、菜单、系统通知等 - - ✅ 开发效率高react生态丰富可快速构建美观界面 此方案已在多个项目中验证有效包括**本地笔记软件、日志记录器、任务管理器**等场景真正做到**数据不出本地体验如丝般顺滑** --- 如果你正在寻找一种高效、稳定、易维护的离线桌面解决方案不妨尝试这套组合拳 —— 让你的应用在任何网络状态下都闪闪发光

更多文章