本文介绍了一个功能丰富的桌面小说写作软件的技术架构设计,该项目采用 Electron + Vue 3 技术栈,集成了富文本编辑、地图设计、关系图谱等核心功能模块。
51mazi 是一个专为小说创作者设计的桌面写作软件,提供了从大纲规划到内容创作的全流程支持。项目采用现代化的技术栈,实现了跨平台、高性能、用户友好的写作体验。
技术 | 版本 | 用途 |
---|---|---|
Electron | 35.0.3 | 跨平台桌面应用框架 |
Vue | 3.5.13 | 渐进式 JavaScript 框架 |
Vite | 6.2.3 | 现代化构建工具 |
Element Plus | 2.10.1 | 企业级 UI 组件库 |
库名 | 版本 | 功能 |
---|---|---|
TipTap | 2.12.0 | 基于 ProseMirror 的富文本编辑器 |
ECharts | 5.6.0 | 数据可视化图表库 |
relation-graph-vue3 | 2.2.11 | 关系图谱可视化组件 |
Pinia | 3.0.1 | Vue 3 官方推荐的状态管理库 |
51mazi/
├── src/
│ ├── main/ # Electron 主进程
│ ├── preload/ # 预加载脚本
│ └── renderer/ # 渲染进程 (Vue 应用)
│ ├── src/
│ │ ├── components/ # 组件库
│ │ │ ├── EditorPanel.vue # 编辑器面板
│ │ │ ├── MapDesign.vue # 地图设计
│ │ │ ├── RelationshipDesign.vue # 关系图谱
│ │ │ └── ...
│ │ ├── views/ # 页面视图
│ │ ├── stores/ # 状态管理
│ │ ├── router/ # 路由配置
│ │ └── utils/ # 工具函数
│ └── assets/ # 静态资源
├── package.json
└── electron.vite.config.mjs
基于 TipTap 富文本编辑器,提供专业的写作体验:
// src/renderer/src/components/EditorPanel.vue
import { Editor, EditorContent } from '@tiptap/vue-3'
import StarterKit from '@tiptap/starter-kit'
import Bold from '@tiptap/extension-bold'
import Italic from '@tiptap/extension-italic'
import TextAlign from '@tiptap/extension-text-align'
const editor = new Editor({
extensions: [
StarterKit,
Bold,
Italic,
TextAlign.configure({ types: ['heading', 'paragraph'] }),
TabInsert, // 自定义 Tab 键扩展
Collapsible // 自定义折叠扩展
],
content: editorStore.content,
onUpdate: ({ editor }) => {
const content = editor.getText()
editorStore.setContent(content)
// 防抖自动保存
if (saveTimer) clearTimeout(saveTimer)
saveTimer = setTimeout(() => {
autoSaveContent()
}, 1000)
}
})
使用 Pinia 进行全局状态管理,实现响应式数据流:
// src/renderer/src/stores/editor.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export const useEditorStore = defineStore('editor', () => {
const content = ref('')
const file = ref(null)
const chapterTitle = ref('')
// 码字统计相关
const typingStartTime = ref(null)
const typingSpeed = ref({
perMinute: 0,
perHour: 0
})
// 计算当前字数
const chapterWords = computed(() => {
return content.value.length
})
// 更新码字速度
function updateTypingSpeed() {
if (!typingStartTime.value) return
const now = Date.now()
const timeElapsed = (now - typingStartTime.value) / 1000
const wordsTyped = chapterWords.value - initialWordCount.value
if (timeElapsed > 0) {
typingSpeed.value = {
perMinute: Math.round((wordsTyped / timeElapsed) * 60),
perHour: Math.round((wordsTyped / timeElapsed) * 3600)
}
}
}
return {
content,
file,
chapterTitle,
chapterWords,
typingSpeed,
setContent,
setFile,
setChapterTitle,
resetTypingTimer
}
})
采用 Hash 模式适配 Electron 环境:
// src/renderer/src/router/index.js
import { createRouter, createWebHashHistory } from 'vue-router'
const routes = [
{
path: '/',
name: 'Home',
component: () => import('@renderer/views/Home.vue')
},
{
path: '/editor',
name: 'Editor',
component: () => import('@renderer/views/Editor.vue')
},
{
path: '/map-design',
name: 'MapDesign',
component: () => import('@renderer/views/MapDesign.vue')
},
{
path: '/relationship-design',
name: 'RelationshipDesign',
component: () => import('@renderer/views/RelationshipDesign.vue')
}
]
const router = createRouter({
history: createWebHashHistory(), // Electron 环境使用 Hash 模式
routes
})
npm install
npm run dev
# Windows
npm run build:win
# macOS
npm run build:mac
# Linux
npm run build:linux
该项目展示了如何利用现代化的前端技术栈构建功能丰富的桌面应用。通过合理的架构设计、模块化开发、状态管理优化等技术手段,实现了一个功能完整、用户体验优秀的小说写作软件。
项目的成功实践为类似的应用开发提供了很好的参考,特别是在富文本编辑、Canvas 绘图、数据可视化等复杂功能的集成方面,具有很高的技术价值和参考意义。
#Electron
#Vue3
#桌面应用
#富文本编辑
#Canvas绘图
#关系图谱
#小说写作
#前端开发
如果这篇文章对你有帮助,请给个 ⭐️ 支持一下!