【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)

server/2025/3/17 0:31:49/

源代码仓库:
Github仓库【electron_git

Commit :
bb40040

Github Desktop 页面分析

本节目标:
1、实现类似Github Desktop的「空仓库」提示页
2、添加本地仓库逻辑编写

在这里插入图片描述

从 Github Desktop 我们看到 他的 主要页面分为三个区域

  • Head头部区域 (操作分支)
  • Side侧边栏区域 (查看更新的文件)
  • Main主区域 (查看 文件 Diff内容)

在这里插入图片描述

Tip:其实初始化的时候只有一个类似main的界面,这里因为我已经添加过store了,所以有head和side部分。

一、目录搭建及依赖安装

  • Ant Design 官网
  • Redux 官网
  • react-router 官网
  • localforage官网
# 安装依赖
pnpm install antd --save
pnpm install @reduxjs/toolkit react-redux
pnpm add -D sass-embedded
pnpm install react-router-dom# 简化持久化存储 根据 IndexedDB 和 WebSQL 支持进行降级策略
pnpm install localforage

主要文件

在这里插入图片描述

二、IPC 通信模块设计与实现

渲染进程 预处理脚本 主进程 操作系统 调用 window.api.chooseFolder() ipcRenderer.invoke('chooseFolder') 显示文件选择对话框 返回选择的路径 返回路径结果 返回 Promise 结果 更新 Redux 状态 渲染进程 预处理脚本 主进程 操作系统

核心实现流程

1. IPC 模块注册机制

javascript">// ipc/index.js
import setupGitIPC from './git'
import setupChooseFileIPC from './operateTheFile'/*** 聚合所有 IPC 通信模块* 新增 IPC 模块需在此处引入并调用*/
export async function setupIPC() {setupGitIPC()setupChooseFileIPC()
}
// main/index.js
import { setupIPC } from '../ipc'app.whenReady().then(() => {setupIPC() // 注册所有 IPC 通信createWindow()// ...其他初始化逻辑
})

2. 文件选择器实现

// operateTheFile/index.js/*** 系统级文件夹选择对话框* @returns {Promise<string|null>} 选择的文件夹路径*/
const chooseFolder = async () => {const result = await dialog.showOpenDialog(mainWindow, {properties: ['openDirectory']})if (result.filePaths.length > 0) {return result.filePaths[0]}
}
const setupChooseFileIPC = () => {ipcMain.handle('chooseFolder', () => {return chooseFolder()})
}
3.预处理层暴露 API
import { contextBridge, ipcRenderer } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'// Custom APIs for renderer
const api = {/*** 打开文件夹选择对话框* @returns {Promise<string|null>}*/chooseFolder: () => {return ipcRenderer.invoke('chooseFolder')}
}

4. 渲染进程调用示例

app.jsx中我们点击button按钮时会调用window.api.chooseFolder唤起原生文件选择器操作文件

function App() {const gitStroe = useSelector((state) => state.gitStore)const dispatch = useDispatch()const outlet = useRoutes(router)// 定义一个异步函数 setRepoPath,用于选择文件夹并设置仓库路径const setRepoPath = async () => {// 调用 window.api.chooseFolder() 弹出文件夹选择对话框,并等待用户选择文件夹const repoPath = await window.api.chooseFolder()// 检查 gitStroe.repoPaths 中是否已经包含选择的文件夹路径if (!gitStroe.repoPaths.some((item) => item.path === repoPath)) {// 如果不包含,则将选择的文件夹路径添加到 gitStroe.repoPaths 中,并更新仓库名称dispatch(setRepoPaths([...gitStroe.repoPaths, { path: repoPath, name: repoPath.split('/').pop() }]))// 设置当前仓库为选择的文件夹名称dispatch(setCurrentRepo(repoPath.split('/').pop()))}}return (<div className="app-container">......// 点击按钮触发 setRepoPath 函数<Buttonicon={<DatabaseOutlined />}size="large"style={{ marginLeft: 20 }}onClick={setRepoPath}>Add Local Repository</Button></div></div>)}</div>)
}export default App

http://www.ppmy.cn/server/175563.html

相关文章

Android的第一次面试(Java篇)

在 Android 开发中&#xff0c;View 是用户界面的基础组件&#xff0c;理解 View 的绘制原理以及如何自定义 View 是实现独特界面效果的关键。本文将深入探讨 Android View 的绘制流程、自定义 View 的工作原理&#xff0c;并通过具体的代码示例来展示如何实现自定义 View。 A…

Matlab 灰度质心+抛物线拟合提取条纹中心

文章目录 一、简介二、实现代码三、实现效果一、简介 这里的思路也是很简单,主要分为三个步骤: 1. 使用灰度质心法提取初始的条纹中心。但是这种方法有它的缺点,他是沿着水平方向进行灰度加权来计算得到的,这其实并不是很合理,因此就有第二个过程。 2. 计算初始条纹中心点…

Java 8新特性:Lambda表达式与Stream API实战

一、Lambda表达式革命性变革 1. 从匿名类到Lambda的演进 // Java 7 匿名内部类 Runnable oldRunnable new Runnable() { Override public void run() { System.out.println("Old way"); } }; // Java 8 Lambda表达式 Runnable newRunnable () -> S…

【yolo标签格式(txt)转coco格式(json)】

1.YOLO格式文件组织 这是要转化的YOLO格式文件组织&#xff0c;分别有images和labels文件&#xff0c;里面划分了train和val。 2.代码实现 将其转化为coco格式。 import os import cv2 import json import argparse from tqdm import tqdmCOCO_DICT [images, annotations…

总结 HTTPS 的加密流程

目录 1 HTTPS是什么 2 "加密"是什么 3 HTTPS的⼯作过程 3.1 引⼊对称加密 3.2 引⼊⾮对称加密 3.3 中间⼈攻击 3.4 引⼊证书 1 HTTPS是什么 HTTPS也是⼀个应⽤层协议.是在HTTP协议的基础上引⼊了⼀个加密层. HTTP协议内容都是按照⽂本的⽅式明⽂传输的.这就…

【ElasticSearch】学习笔记

一、lucene的组成 segment是一个具备完整搜索功能的最小单元。 多个segment组成了一个单机文本检索库lucene。 inverted index:倒排索引&#xff0c;用于快速根据关键词找到对应的文章term index: 构建出关键词的目录树&#xff0c;解决了term dictionary数据量过大&#xff…

如何绕过 reCAPTCHA V2/V3:Python、Selenium 与其他工具的实战指南

前言 验证码&#xff08;CAPTCHA&#xff09;技术已经存在多年&#xff0c;尽管它的有效性一直备受争议&#xff0c;但许多网站仍然依赖它来保护资源。特别是 Google 推出的 reCAPTCHA 系列&#xff0c;一直是验证码领域的领跑者。本文将探讨如何绕过 reCAPTCHA V2 和 V3&…

【C】嵌入式的中断,理解

&#x1f680; 嵌入式中断&#xff08;Interrupt&#xff09;概念解析 在嵌入式系统中&#xff0c;中断&#xff08;Interrupt&#xff09;是一种硬件或软件事件&#xff0c;它可以打断 CPU 的正常运行流程&#xff0c;立即执行特定的中断服务程序&#xff08;ISR&#xff0c;…