一、前端src目录
open-webui\src
是前端代码的目录,从该目录下的文件结构和内容来看,可以分析出以下技术架构和各目录的功能作用。
技术架构
-
框架:
- 项目使用了 Svelte 框架(根据
svelte.config.js
和目录结构判断)。
- 项目使用了 Svelte 框架(根据
-
模块管理:
- 使用了 TypeScript (
*.ts
文件),表明项目采用了类型安全的开发方式。 - 组件化设计,通过
lib
目录中的模块来组织功能。
- 使用了 TypeScript (
-
状态管理:
- 使用了 stores 来管理全局状态(参考
src/lib/stores/index.ts
)。
- 使用了 stores 来管理全局状态(参考
-
国际化 (i18n):
- 多语言支持是通过 i18n 模块实现的,包含多个语言的翻译文件(如
en-US
,zh-CN
,ar
, 等)。
- 多语言支持是通过 i18n 模块实现的,包含多个语言的翻译文件(如
-
工具库:
- 使用了
dayjs
进行日期处理(参考dayjs.js
)。 - 使用了
emoji
数据(参考emoji-groups.json
,emoji-shortcodes.json
)。 - 包含了一些实用工具,如
utils
open-webui\backend\open_webui\socket\utils.py
模块中的websocket.ts
,oauth.ts
等。
- 使用了
-
UI 组件:
- UI 组件放在
components
目录中,例如RichTextInput
和其子组件AutoCompletion.js
。
- UI 组件放在
-
样式和主题:
- 使用了 Tailwind CSS(参考
tailwind.config.js
和tailwind.css
)。 - 支持多主题(参考
themes/rosepine-dawn.css
,themes/rosepine.css
)。
- 使用了 Tailwind CSS(参考
各目录功能描述
1. lib
- 功能: 存放核心功能模块,包括 API 调用、组件、工具等。
- 子目录:
- apis: 提供与后端交互的接口。每个子目录(如
auths(open-webui\backend\open_webui\models\auths.py)
,chats( open-webui\src\lib\stores\index.ts)
models(open-webui\src\lib\stores\index.ts)
)对应不同的 API 接口。 - components: 存放可复用的 UI 组件,如
common/RichTextInput/AutoCompletion.js
。 - i18n: 国际化支持,包含多个语言的翻译文件。
- pyodide: Pyodide 相关的内核逻辑,用于在浏览器中运行 Python。
- stores: Svelte 的状态管理模块,提供全局状态存储。
- types: TypeScript 类型定义。
- utils: 实用工具函数,如 WebSocket、OAuth、Markdown 解析等。
- workers: Web Worker 相关代码,如
KokoroWorker.ts
和pyodide.worker.ts
。
- apis: 提供与后端交互的接口。每个子目录(如
2. routes
- 功能: 页面路由配置,类似于 SvelteKit 的路由系统。
- 文件:
+layout.js
是布局文件,可能定义了全局布局或导航栏。
3. static
- 功能: 静态资源目录,存放图片、字体、图标等。
- 子目录:
- assets: 图片、图标等资源。
- swagger-ui: Swagger UI 相关资源。
- loader.js: 可能是加载器脚本。
4. app.css
, app.d.ts
, app.html
, tailwind.css
- 功能: 样式和模板文件。
app.css
: 主要样式表。app.d.ts
: TypeScript 声明文件。app.html
: HTML 模板。tailwind.css
: Tailwind CSS 配置文件。
总结
该项目采用 Svelte + TypeScript + Tailwind CSS 的技术栈,具有良好的模块化设计和国际化的支持。主要功能模块分布在 lib
目录下,涵盖了 API 调用、UI 组件、状态管理、工具函数等。此外,还利用了 Web Worker 和 Pyodide 来增强前端性能和功能扩展性。
二、vite.config.ts配置
vite.config.ts 是该项目的 Vite 构建配置文件,用于定义开发服务器行为、构建流程、插件集成等。下面我将详细说明它的主要功能和作用。
Vite 是一个超快的前端构建工具赋能下一代 Web 应用的发展
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';
// /** @type {import('vite').Plugin} */
// const viteServerConfig = {
// name: 'log-request-middleware',
// configureServer(server) {
// server.middlewares.use((req, res, next) => {
// res.setHeader('Access-Control-Allow-Origin', '*');
// res.setHeader('Access-Control-Allow-Methods', 'GET');
// res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
// res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
// next();
// });
// }
// };
export default defineConfig({
plugins: [
sveltekit(),
viteStaticCopy({
targets: [
{
src: 'node_modules/onnxruntime-web/dist/*.jsep.*',
dest: 'wasm'
}
]
})
],
define: {
APP_VERSION: JSON.stringify(process.env.npm_package_version),
APP_BUILD_HASH: JSON.stringify(process.env.APP_BUILD_HASH || 'dev-build')
},
build: {
sourcemap: true
},
worker: {
format: 'es'
}
});
当前文件 vite.config.ts
是该项目的 Vite 构建配置文件,用于定义开发服务器行为、构建流程、插件集成等。下面我将详细说明它的主要功能和作用。
🧰 文件整体作用
这是项目使用 [Vite](file://D:\GiteeDownloadProject\AIStudyProject\open-webui\vite.config.ts#L0-L0)(下一代前端构建工具)时的核心配置文件,主要负责:
- 启用 SvelteKit 开发和构建支持;
- 配置静态资源复制规则;
- 定义构建时的全局常量(如版本号);
- 控制 sourcemap 生成;
- 配置 Web Worker 的打包格式。
🔧 主要功能详解
1. ✅ 引入插件
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';
sveltekit
: 提供对 [SvelteKit](file://D:\GiteeDownloadProject\AIStudyProject\open-webui\src\lib\stores\index.ts#L49-L49) 框架的支持,是 Svelte 官方推荐的全栈框架。viteStaticCopy
: 插件用于在构建时将某些静态资源从源路径复制到输出目录。
2. ✅ 配置插件(plugins)
plugins: [
sveltekit(),
viteStaticCopy({
targets: [
{
src: 'node_modules/onnxruntime-web/dist/*.jsep.*',
dest: 'wasm'
}
]
})
]
作用:
sveltekit()
: 启用 SvelteKit 支持,包括客户端路由、SSR、预加载等功能。viteStaticCopy
插件:- 将
onnxruntime-web
中的.jsep.*
文件(WASM 相关)复制到输出目录下的wasm/
子目录中。 - 用于支持 ONNX Runtime Web 的 WASM 加载能力。
- 将
3. ✅ 定义全局常量(define)
define: {
APP_VERSION: JSON.stringify(process.env.npm_package_version),
APP_BUILD_HASH: JSON.stringify(process.env.APP_BUILD_HASH || 'dev-build')
}
作用:
- 在代码中可以通过
import.meta.env.APP_VERSION
或全局变量访问这些值。 APP_VERSION
: 来自package.json
中的版本号。APP_BUILD_HASH
: 构建哈希,如果没有设置则默认为'dev-build'
。
4. ✅ 构建选项(build)
build: {
sourcemap: true
}
作用:
- 生成
.map
文件,方便调试。 - 如果你希望减小生产环境包体积,可以设为
false
。
5. ✅ Worker 打包格式(worker)
worker: {
format: 'es'
}
作用:
- 使用 ES Module 格式打包 Web Worker 脚本,适用于现代浏览器支持的模块化方式。
6. 🔁 注释掉的中间件(可选启用)
// const viteServerConfig = { ... }
作用:
- 自定义开发服务器中间件,设置 CORS 和安全头。
- 当前被注释掉了,如果需要开启跨域或嵌入限制控制,可以取消注释并注册进插件。
📦 输出结构示例
根据此配置,最终打包后的结构可能会包含如下内容:
dist/
├── wasm/
│ ├── *.jsep.js
│ └── *.jsep.wasm
├── _app/
│ ├── entry.js
│ └── ...
├── index.html
└── *.js.map (sourcemap)
✅ 总结:该文件的主要功能
功能 | 说明 |
---|---|
✅ 启动 SvelteKit 支持 | 支持 SvelteKit 的 SSR、客户端路由等特性 |
✅ WASM 资源复制 | 将 ONNX Runtime 的 WASM 文件复制到构建目录 |
✅ 全局常量注入 | 注入 APP_VERSION 和 APP_BUILD_HASH 到代码中 |
✅ Sourcemap 生成 | 方便调试,适用于开发和测试 |
✅ Worker 模块打包 | 使用 es 模块格式打包 Web Worker |
⚙️ 可选中间件配置 | 可以启用 CORS 和 COOP/COEP 安全策略 |
三、package.json配置
当前文件 package.json
是 项目的根配置文件,它是 Node.js 项目中用于描述项目元信息、管理依赖和脚本的核心文件。
node.js文档说明
📁 文件作用总览
✅ 主要功能:
功能 | 描述 |
---|---|
🧱 项目基本信息 | 名称、版本号等 |
🛠️ 脚本命令(scripts) | 定义开发、构建、测试等常用命令 |
📦 依赖管理 | 声明第三方库(dependencies 和 devDependencies) |
🔧 开发环境约束 | node 版本、npm 版本要求 |
⚙️ 类型定义 | 模块类型(ES Module) |
🌐 工具集成 | TypeScript、Lint、Prettier、Cypress、Vitest 等工具的依赖 |
📝 具体字段详解
1. 基本元信息
{
"name": "open-webui",
"version": "0.6.13",
"private": true
}
name
: 项目名称。version
: 当前版本号,遵循 语义化版本 规范。private
: 设置为true
表示该项目不会被发布到 npm。
2. 脚本命令(scripts)
这是开发者最常使用的部分,通过 npm run <script-name>
来执行各种任务:
开发与构建
"scripts": {
"dev": "npm run pyodide:fetch && vite dev --host",
"dev:5050": "npm run pyodide:fetch && vite dev --port 5050",
"build": "npm run pyodide:fetch && vite build",
"preview": "vite preview"
}
dev
: 启动本地开发服务器。dev:5050
: 在端口5050
上启动开发服务器。build
: 构建生产包。preview
: 预览构建后的静态资源。
检查与格式化
"lint": "npm run lint:frontend ; npm run lint:types ; npm run lint:backend",
"format": "prettier --plugin-search-dir --write \"**/*.{js,ts,svelte,css,md,html,json}\""
lint
: 执行前端、TypeScript、后端代码的 Lint 检查。format
: 使用 Prettier 自动格式化所有支持的代码文件。
国际化支持
"i18n:parse": "i18next --config i18next-parser.config.ts && prettier --write \"src/lib/i18n/**/*.{js,json}\""
- 提取多语言内容并格式化翻译文件(如
en-US/translation.json
)。
测试相关
"cy:open": "cypress open",
"test:frontend": "vitest --passWithNoTests"
cy:open
: 启动 Cypress 浏览器测试界面。test:frontend
: 运行前端单元测试(基于 Vitest)。
Pyodide 准备
"pyodide:fetch": "node scripts/prepare-pyodide.js"
- 下载或准备 Pyodide 运行时所需资源,用于在浏览器中运行 Python 代码。
3. 开发依赖(devDependencies)
这些是开发过程中使用的工具,不包含在最终打包产物中。
"devDependencies": {
"@sveltejs/kit": "^2.5.20",
"vite": "^5.4.14",
"typescript": "^5.5.4",
"eslint": "^8.56.0",
"prettier": "^3.3.3",
"vitest": "^1.6.1",
...
}
- SvelteKit: Svelte 的全栈框架。
- Vite: 快速的现代前端构建工具。
- TypeScript: 支持类型安全开发。
- Eslint / Prettier: 代码规范和格式化工具。
- Vitest: 前端测试框架。
- Cypress: E2E 浏览器测试工具。
- i18next-parser: 多语言提取工具。
- TailwindCSS / PostCSS: CSS 工具链。
4. 运行时依赖(dependencies)
这些是项目运行所必需的库。
"dependencies": {
"dayjs": "^1.11.10",
"socket.io-client": "^4.2.0",
"marked": "^9.1.0",
"highlight.js": "^11.9.0",
"i18next": "^23.10.0",
"codemirror": "^6.0.1",
"pyodide": "^0.27.3",
"uuid": "^9.0.1",
...
}
- dayjs: 轻量级日期处理库。
- socket.io-client: WebSocket 实时通信客户端。
- marked / highlight.js: Markdown 渲染与语法高亮。
- i18next: 国际化支持。
- CodeMirror: 可嵌入网页的代码编辑器组件。
- Pyodide: 让浏览器中可以运行 Python。
- UUID: 生成唯一标识符。
- Mermaid: 绘制流程图、甘特图等图表。
- ProseMirror / Tiptap: 富文本编辑器底层依赖。
5. 引擎限制(engines)
"engines": {
"node": ">=18.13.0 <=22.x.x",
"npm": ">=6.0.0"
}
node
: 要求使用 Node.js v18.13.0 到 v22.x.x 之间的版本。npm
: 要求 npm 版本大于等于 6.0.0。
💡 如果你使用其他包管理器(如 yarn 或 pnpm),也可以用
"yarn"
字段指定版本。
6. 模块类型(type)
"type": "module"
- 表示这是一个使用 ECMAScript Modules (ESM) 的项目,意味着默认使用
.js
,.ts
,.mjs
等模块系统。
🧪 常用命令推荐
命令 | 说明 |
---|---|
npm run dev | 启动本地开发服务器 |
npm run build | 构建生产环境代码 |
npm run preview | 预览构建后的页面 |
npm run lint | 检查代码风格 |
npm run format | 格式化代码 |
npm run test:frontend | 运行前端单元测试 |
npm run cy:open | 打开 Cypress 编写或运行 E2E 测试 |
npm run i18n:parse | 提取国际化内容 |
🧠 小技巧:查看可用命令
你可以直接运行以下命令查看所有可用的脚本命令:
npm run
它会列出所有可执行的脚本,并显示它们的作用。
🔐 对比 package-lock.json
✅ 作用:
- 依赖树的精确快照
- 记录了当前安装的所有依赖及其子依赖的确切版本和下载地址。
🧩 主要内容包括:
内容 | 描述 |
---|---|
所有依赖的完整树状结构 | 包括一级依赖和其内部引用的二级、三级依赖 |
每个包的具体版本号 | 如 "version": "1.0.0" |
下载地址(resolved) | 包从哪里下载(如 https://registry.npmjs.org/... ) |
校验码(integrity) | 用于确保下载的包未被篡改(基于 SHA-256 哈希) |
是否为可选依赖 | "optional": true 或 "devOptional": true |
🧪 示例用途:
- 当你运行
npm install
时,package-lock.json
会被用来保证所有开发者和 CI 环境安装的是完全相同的依赖版本。 - 防止“在我本地能跑,在线上报错”的问题。
📌 这个文件是自动生成并由 npm 维护的,你不应该手动编辑它。
⚖️ 对比总结:package.json
vs package-lock.json
功能 | package.json | package-lock.json |
---|---|---|
✅ 是否必须 | 是 | 是(推荐提交到 Git) |
📝 是否人工可读 | 是 | 否(结构复杂,不建议人眼阅读) |
🛠️ 谁来维护 | 开发者手动修改 | npm 自动管理 |
💾 是否提交到 Git | 是 | 是 |
🧩 是否记录依赖树 | 否(仅一级依赖) | 是(完整的依赖嵌套关系) |
🔒 是否包含校验信息 | 否 | 是(SHA-256 校验码) |
📦 是否控制具体版本 | 否(使用语义化版本 ^1.0.0) | 是(固定版本 1.0.0) |
🔄 是否影响构建一致性 | 否 | 是(保障所有环境一致) |
三、tailwind.config.js 配置
当前文件 tailwind.config.js
是 Tailwind CSS 的配置文件,用于定义和定制 Tailwind 的样式系统、主题变量、插件等功能。
Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类(class)名,然后生成相应的样式代码并写入 到一个静态 CSS 文件中。
官方介绍如下:
Tailwind CSS 官方文档描述
📌 文件作用总览
该文件主要负责以下功能:
功能 | 描述 |
---|---|
✅ 启用深色模式(dark mode) | 支持通过类名切换深色/浅色主题。 |
🧩 配置内容扫描路径 | 告诉 Tailwind 哪些文件需要扫描以生成对应的 CSS 类。 |
🎨 自定义颜色扩展 | 定义了灰阶颜色(gray 50~950),支持 CSS 变量动态覆盖。 |
📖 排版样式控制 | 禁用了默认的 <code> 和 <pre> 标签样式。 |
📱 安全区适配 | 添加了针对 iOS 安全区底部(safe-area-inset-bottom)的 padding 支持。 |
🔌 插件加载 | 加载了 @tailwindcss/typography 和 @tailwindcss/container-queries 插件。 |
🛠️ 详细配置说明
1. 启用深色模式
darkMode: 'class'
- 使用
.dark
类来启用深色模式,而不是基于浏览器偏好。 - 示例:在 HTML 中添加
<html class="dark">
即可启用深色样式。
2. 指定扫描路径
content: ['./src/**/*.{html,js,svelte,ts}']
- Tailwind 会扫描
src/
目录下的所有.html
,.js
,.svelte
,.ts
文件,提取出使用到的 Tailwind 类并生成最终的 CSS。 - 这是构建时按需引入 CSS 的关键机制,避免全量加载不必要的样式。
3. 自定义颜色扩展
colors: {
gray: {
50: 'var(--color-gray-50, #f9f9f9)',
...
}
}
- 扩展了 Tailwind 默认的
gray
色板,增加了从50
到950
的多个灰度值。 - 每个颜色都使用了 CSS 变量,允许你在运行时通过修改变量来动态更改主题颜色。
示例:
<div class="bg-gray-800 text-gray-50">深灰背景 + 浅灰文字</div>
你可以通过 CSS 覆盖这些变量来自定义外观:
:root {
--color-gray-50: #ffffff;
--color-gray-800: #222222;
}
4. 排版(Typography)样式调整
typography: {
DEFAULT: {
css: {
pre: false,
code: false,
'pre code': false,
'code::before': false,
'code::after': false
}
}
}
- 使用了
@tailwindcss/typography
插件来增强 Markdown 或富文本中的排版能力。 - 上述配置禁用了 Typography 对
<code>
和<pre>
的默认样式,防止与代码高亮库(如 CodeMirror)冲突。
5. 安全区域适配(iOS 底部区域)
padding: {
'safe-bottom': 'env(safe-area-inset-bottom)'
}
- 定义了一个新的 Tailwind 工具类
pb-safe-bottom
,它会自动应用 iOS 设备底部的安全边距。 - 适用于移动端设计,防止内容被 iPhone 的“小刘海”或“圆角区域”遮挡。
使用方式:
<div class="pb-safe-bottom">这个 div 在 iOS 下会有底部留白</div>
6. 插件集成
a. @tailwindcss/typography
- 提供富文本渲染能力,优化
<p>
,<h1>
,<ul>
,<blockquote>
等标签的默认样式。 - 通常用于 Markdown 渲染器(如 Mermaid、Markdown 编辑器等)。
b. @tailwindcss/container-queries
- 实验性支持 CSS 容器查询,让组件可以基于其容器大小响应式变化。
- 更加灵活地实现响应式布局,而无需依赖全局视口尺寸。
🧩 插件来源
这两个插件是在顶部导入的:
import typography from '@tailwindcss/typography';
import containerQuries from '@tailwindcss/container-queries';
并在最后注册进 Tailwind:
plugins: [typography, containerQuries]
✅ 总结:该文件的功能结构
配置项 | 功能 |
---|---|
darkMode: 'class' | 启用类控制的深色模式 |
content | 指定哪些源码文件需要被 Tailwind 分析 |
theme.extend.colors.gray | 自定义灰阶颜色及变量支持 |
theme.extend.typography | 控制富文本样式输出 |
theme.extend.padding.safe-bottom | 新增一个适配 iOS 安全区的间距类 |
plugins | 加载 Tailwind 扩展插件 |