Replies: 27 comments 57 replies
-
|
话说桌面端能带来什么独占功能/优势吗 |
Beta Was this translation helpful? Give feedback.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
-
研发问题 & 关键思路记录1. service 层复用 server.ts 还是新建 electron.ts由于 nextjs 的 standalone 模式会完整输出可以直接运行的 next 应用,next-electron-rsc 模块会直接通过 next的入口文件启动 next 实例,因此在启动 electron 的时候等于同时启动了一个 nextjs 的进程。 这里的问题就是当前端将请求发到 service 层时,应该走独立的 electron main端执行,还是走 nextjs 的服务端调用。 和 Claude 聊完以后,感觉比较理想的方式应该是这样: 这样一来大部分 service 和 router 层的东西都可以复用,只需要替换 db 即可。 2. 如何开启 AsarAsar 和 pnpm 的软链模式有冲突,替换成 |
Beta Was this translation helpful? Give feedback.
-
|
打算什么时候发布桌面版? |
Beta Was this translation helpful? Give feedback.
-
|
在问题 1 的基础上衍生下来的几个问题,和 claude 聊出了一个更加完善的架构设计方案 Electron + Next.js 完整应用架构设计综合架构图以下是一个完整的 Electron + Next.js 应用架构图,包含所有关键组件及其交互关系: 详细组件关系图下面是更详细的组件关系和交互流程图: 组件功能详解1. Electron 主进程组件1.1 应用入口点 (main.ts)
1.2 窗口管理 (BrowserWindow)
1.3 IPC 服务器 (ipc-server.ts)
1.4 协议处理器 (next-electron-rsc)
2. Next.js 服务端组件2.1 IPC 客户端 (electron-ipc-client.ts)
2.2 Next.js 服务器 (next-server)
2.3 数据库初始化 (db-factory.ts)
2.4 React 服务端组件 (RSC)
3. Electron 渲染进程组件3.1 预加载脚本 (preload.ts)
3.2 WebView (BrowserView)
3.3 Next.js 客户端 (React DOM)
3.4 tRPC 客户端
通信流程详解1. 启动流程2. 数据库初始化流程3. 页面渲染流程4. API 调用流程技术选型和集成点1. next-electron-rsc 集成
2. IPC 通信层
3. 数据库层
4. WebView 渲染
核心实现挑战和解决方案1. 避免构建引用问题挑战:Next.js 构建时可能会尝试包含 Electron 依赖,导致构建错误。 解决方案:
2. 进程通信可靠性挑战:确保 Next.js 服务端和 Electron 主进程之间的通信可靠。 解决方案:
3. 数据库初始化顺序挑战:确保数据库在 Next.js 服务端启动后正确初始化。 解决方案:
总结这个完整的 Electron + Next.js 架构设计提供了:
通过这种架构,你可以充分利用 Next.js 的先进特性和 Electron 的桌面能力,构建功能强大且用户体验一流的桌面应用。 |
Beta Was this translation helpful? Give feedback.
This comment has been hidden.
This comment has been hidden.
-
|
桌面版本希望可以支持类似快捷键打开快捷助手以及划词快捷小窗口功能。类似豆包的那种。 |
Beta Was this translation helpful? Give feedback.
-
IPC 进程间通信electron-client-ipc (Render 进程与 Main 进程通信)设计一个框架来实现轻巧的 Render 端与 main 端通信
export interface DevtoolsDispatchEvents {
/**
* open the LobeHub Devtools
*/
openDevtools: () => void;
}
import { dispatch } from '@/utils/electron/dispatch';
class DevtoolsService {
async openDevtools(): Promise<void> {
return dispatch('openDevtools');
}
}
export const electronDevtoolsService = new DevtoolsService();
// src/utils/electron/dispatch.ts
import { DispatchInvoke } from '@lobechat/electron-client-ipc';
/**
* client 端请求 sketch 端 event 数据的方法
*/
export const dispatch: DispatchInvoke = async (event, ...data) => {
if (!window.electronAPI) throw new Error('electronAPI not found');
return window.electronAPI?.invoke(event, ...data);
};这样应用层使用就可以当成是一个普通的 Service 来使用: onClick={async () => {
if (isDesktop) {
const { electronDevtoolsService } = await import('@/services/electron/devtools');
await electronDevtoolsService.openDevtools();
return;
} |
Beta Was this translation helpful? Give feedback.
-
Main 端配置存储机制概述大部分用户侧的业务数据将通过 pglite 存储,因此在 main 端使用基于 electron-store 的,轻量化实现一些设置数据的持久化,用于管理应用配置。本文档描述了当前的实现和方法。 存储管理类
|
| 方法 | 说明 | 参数 | 返回值 |
|---|---|---|---|
get |
获取配置项 | key: 配置键defaultValue?: 默认值 |
配置值 |
set |
设置配置项 | key: 配置键value: 配置值 |
无 |
delete |
删除配置项 | key: 配置键 |
无 |
clear |
清空所有配置 | 无 | 无 |
has |
检查配置项是否存在 | key: 配置键 |
boolean |
openInEditor |
在编辑器中打开配置文件 | 无 | Promise<void> |
使用示例
// 初始化
const store = new StoreManager(app);
// 获取配置
const value = store.get('someKey');
// 设置配置
store.set('someKey', newValue);
// 检查配置是否存在
if (store.has('optionalFeature')) {
// 执行相关操作
}
// 删除配置
store.delete('temporaryConfig');
// 在开发环境中直接编辑配置文件
await store.openInEditor();Beta Was this translation helpful? Give feedback.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
This comment has been hidden.
-
|
Beta Was this translation helpful? Give feedback.
This comment has been hidden.
This comment has been hidden.
-
Beta Was this translation helpful? Give feedback.
This comment has been hidden.
This comment has been hidden.
-
|
怎么把Vercel部署的服务端连到Mac桌面端上啊,没看到设置里有相关的入口 |
Beta Was this translation helpful? Give feedback.
This comment has been hidden.
This comment has been hidden.
-
|
mac中占用了全局的cmd+e? 没有快捷键设置的地方。 cmd+e快捷推出dmg挂载 |
Beta Was this translation helpful? Give feedback.
-
|
@arvinxx |
Beta Was this translation helpful? Give feedback.



Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
桌面端是我们必须要做的东西,无论是从产品体验,还是说能力边界,桌面端都是能够给我们带来很多拓展能力边界的形态。
设计思路
首先桌面端选型上是 Electron 这个无可争议,我之前还做过一个带有自动化 ci workflow 的 electron 脚手架模板,基本上是轻车熟路了。
不过在具体评估可行方案时,我们需要考虑现有 Nextjs 项目的复用问题,因此调研到了几种可能的潜在可选项。
基座调研
ToDesktop
ToDesktop 是一款专业的 Web 应用转桌面应用工具,允许开发者快速将现有 Web 应用转换为跨平台(Windows、Mac 和 Linux)的原生桌面应用。无需编写额外代码即可实现基础功能,同时提供丰富的原生 API 扩展能力。
ToDesktop 的核心优势包括:自动更新系统、原生通知、离线支持、全局热键、系统托盘、深度链接、启动项设置等原生功能。它提供了直观的拖放式构建器,使开发者能够轻松定制应用外观和行为。
对于企业用户,ToDesktop 还提供代码签名、下载分析、品牌化下载链接等高级功能。其定价从个人免费使用到企业级解决方案不等,适合从个人开发者到大型企业的各类需求。
这个方案的优点是省心,可以一键将在线网页转为 desktop 套壳应用。但缺点有几个:
因此这个方案被抛弃了。
next-electron-rsc
这个方案来源于 https://medium.com/@kirill.konshin/the-ultimate-electron-app-with-next-js-and-react-server-components-a5c0cabda72b 这篇文章,通过一天的尝试发现可以很完美地跑起来。因此整个实现的基座就会基于这个包来搞。
独立 repo VS 主仓库子目录
本来一开始想的是独立 repo,但是评估下来发现维护整个成本会有点高,因为我们现在的 cloud 是在 开源版 lobe-chat 基础上的一个私有仓库,如果开源版桌面端是一个独立 repo,就意味着 cloud 的仓库也需要对应变成独立 repo,一次性维护4个仓库显然成本有点过高了。
进展
Beta Was this translation helpful? Give feedback.
All reactions