Skip to content

[Draft]feat: dual-backend support (Go + OpenListNext TS) via runtime backend… - #660

Draft
PIKACHUIM wants to merge 2 commits into
mainfrom
feat/ts-backend-compat
Draft

[Draft]feat: dual-backend support (Go + OpenListNext TS) via runtime backend…#660
PIKACHUIM wants to merge 2 commits into
mainfrom
feat/ts-backend-compat

Conversation

@PIKACHUIM

Copy link
Copy Markdown
Member

Frontend Unification: GO / TS Dual-Backend Compatibility

目标:以本仓库(官方前端 OpenList-Frontend)为唯一前端,通过"后端模式"机制同时兼容
Go 版 OpenList 后端OpenListNext (TSWorker / Cloudflare Workers) 后端
避免两套前端各自漂移。TS 后端不再维护内嵌前端,直接使用本仓库的构建产物。


1. 背景

历史上存在两份前端:

前端 仓库 对接后端
官方前端 OpenList-Frontend(本仓库) Go 版 OpenList
TS 内嵌前端 OpenList-TSWorker/src(前端部分) Hono (Workers) 后端

两者已双向分叉:官方新增 S3 设置、任务管理、multipart 分片上传;TS 新增插件系统、会话分片上传、中文翻译、Face404。

决定:以官方前端为唯一前端,把 TS 独有能力反向合并进本仓库,通过运行时"模式探测"让同一份构建产物在两种后端下正确显示/屏蔽功能。


2. 模式机制

2.1 探测来源

后端 /api/public/settings 返回里新增 backend 字段(零额外请求):

  • TS 后端:backend: "ts-worker"(见 OpenList-TSWorker/src/backend/server/public.ts
  • Go 后端:不返回该字段(缺省视为 "go"

2.2 API(src/utils/backend.ts

import { isTsWorker, isGo, getBackendKind } from "~/utils/backend"

setSettings() 在拉取 /public/settings 后自动调用 setBackendKind() 写入探测结果。


3. 功能对照与屏蔽策略

功能 GO 模式 TS 模式 处理
插件系统(plugins) 隐藏 显示 TS 独有,合并进本仓库,GO 模式屏蔽
会话分片上传(ChunkedUpload) 隐藏 显示 TS 后端专用(Workers 请求体限制),GO 用 Multipart
Multipart 分片上传 显示 隐藏 GO 后端专用
S3 设置 显示 隐藏 GO 独有,TS 模式屏蔽
任务管理(tasks) 显示 隐藏 GO 独有(后台任务),TS 后端无此能力
Face404 隐藏 显示 TS 独有视觉组件(分享过期/取消错误页)
中文翻译 官方 crowdin 自动翻译 同左 移除本地手写 zh-CN,统一走官方 crowdin 流程

3.1 屏蔽实现点

  • src/pages/manage/SideMenu.tsxSideMenuItemProps 增加 backend?: BackendKind[]ifShow 里按模式过滤。
  • src/pages/manage/sidemenu_items.tsxtaskss3backend: ["go"]pluginsbackend: ["ts-worker"]
  • src/pages/manage/routes.tsxRoute 透传 backendhide_routes 注册 plugins/addplugins/config/:id
  • src/pages/manage/index.tsxvisibleRoutescreateMemo 按模式过滤路由。
  • src/pages/home/uploads/uploads.tsMultipartUploadisGo()ChunkedUploadisTsWorker()

4. 以 GO 为准的原则

  • 分片上传 / S3:两边都实现时,统一后以 Go 后端的接口与逻辑为准;TS 后端逐步对齐 Go 接口。
    • Go 分片:src/pages/home/uploads/multipart.ts(MultipartUpload)
    • TS 分片:src/pages/home/uploads/chunked.ts(ChunkedUpload,会话式,为 Workers 环境设计)
  • 后续新增能力,优先遵循 Go 版 OpenList 的 API 契约,TS 后端适配之。

5. 翻译方案

  • 官方采用 crowdin 自动翻译(lang/en 为源,其他语言由 CI 生成)。
  • 本地手写的 lang/zh-CN 已移除,改由官方翻译流程产出。
  • 相关脚本:pnpm run i18n:build / pnpm run i18n:releasecrowdin download + scripts/i18n.mjs)。

6. 插件系统(TS 独有,保留)

  • 文件:src/pages/manage/plugins/*src/types/plugin.tssrc/utils/plugin_engine.tssrc/utils/zip_plugin.tssrc/lang/en/plugins.json
  • 仅 TS 模式启用(GO 后端无 /public/plugins/admin/plugin/* 接口)。
  • 插件引擎通过 initPluginEngine()App.tsx 初始化;window.OpenListPlugin SDK 依赖 Window 的索引签名(见 main.tsxdeclare global)。
  • 实现方式后续可能调整(对齐 Go 后端若将来引入插件能力)。

7. 后端集成(TSWorker)

  • TS 后端 /api/public/settings 已返回 backend: "ts-worker"
  • TSWorker 后续方向:不再维护内嵌前端 src/(前端部分),改为使用本仓库构建产物(dist/),由构建/CI 拉取官方前端产物注入。

8. 关键文件清单

新增:

  • src/utils/backend.ts(模式探测)
  • src/utils/plugin_engine.tssrc/utils/zip_plugin.ts(插件引擎)
  • src/types/plugin.ts
  • src/pages/manage/plugins/{index,Plugin,AddPlugin,ConfigPlugin}.tsx
  • src/pages/home/uploads/chunked.ts(TS 会话分片上传)
  • src/components/Face404.tsx
  • src/lang/en/plugins.json

修改:

  • src/store/settings.tssetSettings 接入 setBackendKind
  • src/utils/index.ts(导出 backend / plugin_engine / zip_plugin)
  • src/types/index.ts(导出 plugin)
  • src/utils/bus.ts(插件事件类型)
  • src/pages/manage/SideMenu.tsxsidemenu_items.tsxroutes.tsxindex.tsx(模式过滤)
  • src/pages/home/uploads/uploads.ts(上传方式按模式选择)
  • src/components/{index.ts,Base.tsx}(Face404 导出 + Error 的 show404Face
  • src/app/App.tsxinitPluginEngine
  • src/pages/home/Obj.tsx(分享过期 show404Face
  • src/lang/en/{entry.ts,manage.json,shares.json}(插件/菜单/分享翻译注册)

… detection

Add runtime backend detection (window config backend field), port TS-only features (plugin system, session chunked upload, Face404) into the official frontend, and gate S3/tasks/multipart to GO mode vs plugins/chunked-upload to TS mode.
@PIKACHUIM
PIKACHUIM marked this pull request as draft September 4, 2026 09:15
Use MultipartUpload for both GO and TS backends (single API contract); fall back to StreamUpload when backend returns data:null for storages without session upload. Remove ChunkedUpload backend branching.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant