Files
video_socket-server/.qoder/repowiki/zh/content/开发指南/代码规范与质量.md
2026-05-16 13:24:02 +08:00

379 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 代码规范与质量
<cite>
**本文引用的文件**
- [.eslintrc.cjs](file://.eslintrc.cjs)
- [.eslintrc.json客户端](file://client/.eslintrc.json)
- [.editorconfig](file://.editorconfig)
- [package.json服务端](file://package.json)
- [package.json客户端](file://client/package.json)
- [tsconfig.json](file://tsconfig.json)
- [tsconfig.lint.json](file://tsconfig.lint.json)
- [jest.config.js](file://jest.config.js)
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [client/src/peer.js](file://client/src/peer.js)
- [client/src/sender.js](file://client/src/sender.js)
- [test/websockethandler.test.ts](file://test/websockethandler.test.ts)
- [client/test/inputremoting.test.js](file://client/test/inputremoting.test.js)
</cite>
## 目录
1. 引言
2. 项目结构
3. 核心组件
4. 架构总览
5. 详细组件分析
6. 依赖分析
7. 性能考虑
8. 故障排查指南
9. 结论
10. 附录
## 引言
本指南面向视频服务器项目的开发者与维护者,系统性阐述代码规范与质量控制策略,覆盖以下方面:
- ESLint 规则与 TypeScript/JavaScript 的差异化配置
- 代码格式化工具与自动格式化设置EditorConfig
- 命名约定与变量命名最佳实践
- 注释规范与文档编写标准
- 代码审查流程与质量检查要点
- 常见问题识别与修复方法
- 自动化质量检查工具的配置与使用
## 项目结构
该项目采用前后端分离的多包结构:
- 服务端TypeScriptsrc、test、配置文件tsconfig、eslint、jest
- 客户端(前端 JS/TSclient 目录下包含公共资源、源码与测试
- 全局脚本与工具:根目录 package.json 提供 lint、test、build 等命令
```mermaid
graph TB
subgraph "服务端"
TS["TypeScript 源码<br/>src/*.ts"]
TSTest["测试<br/>test/*.test.ts"]
ESLintCJS[".eslintrc.cjs<br/>TypeScript 规则"]
JestCfg["jest.config.js<br/>测试配置"]
TSConf["tsconfig.json<br/>编译配置"]
LintTSConf["tsconfig.lint.json<br/>ESLint 专用"]
end
subgraph "客户端"
JS["前端源码<br/>client/src/*.js"]
JSTest["前端测试<br/>client/test/*.test.js"]
ESLintJSON[".eslintrc.json<br/>浏览器环境规则"]
end
RootPkg["根 package.json<br/>脚本与依赖"]
RootPkg --> ESLintCJS
RootPkg --> JestCfg
RootPkg --> TSConf
RootPkg --> LintTSConf
TS --> ESLintCJS
TSTest --> JestCfg
JS --> ESLintJSON
JSTest --> JestCfg
```
图表来源
- [.eslintrc.cjs](file://.eslintrc.cjs)
- [.eslintrc.json客户端](file://client/.eslintrc.json)
- [jest.config.js](file://jest.config.js)
- [tsconfig.json](file://tsconfig.json)
- [tsconfig.lint.json](file://tsconfig.lint.json)
- [package.json服务端](file://package.json)
- [package.json客户端](file://client/package.json)
章节来源
- [package.json服务端:1-60](file://package.json#L1-L60)
- [package.json客户端:1-19](file://client/package.json#L1-L19)
## 核心组件
- 代码检查ESLint
- 服务端:基于 TypeScript ESLint 插件,启用推荐规则集,解析器为 TypeScript使用独立的 tsconfig.lint.json 以避免 sourceMap 影响性能。
- 客户端:基于 eslint:recommended 与 jest 插件,针对浏览器与 ES6 环境,强制分号与禁止多余分号。
- 测试框架Jest
- 收集覆盖率、使用 ts-jest 转换 TS/TSX测试环境为 node客户端测试使用 jsdom 环境。
- 编辑器配置EditorConfig
- 统一缩进风格、换行符、结尾换行与尾随空白处理。
章节来源
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [.eslintrc.json客户端:1-23](file://client/.eslintrc.json#L1-L23)
- [tsconfig.lint.json:1-12](file://tsconfig.lint.json#L1-L12)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
- [.editorconfig:1-20](file://.editorconfig#L1-L20)
## 架构总览
整体质量控制链路如下:
- 开发阶段:编辑器读取 EditorConfig 进行基础格式化;保存时由 IDE 或插件执行 ESLint 校验。
- CI/本地:通过 npm/yarn scripts 执行 lint 与 testESLint 针对 src 与 testJest 覆盖服务端与客户端测试。
- 发布前:构建产物生成于 build 目录,确保 TypeScript 编译无误。
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant IDE as "编辑器/IDE"
participant ESL as "ESLint"
participant Jest as "Jest"
participant TS as "TypeScript 编译器"
Dev->>IDE : 保存文件
IDE->>ESL : 触发语法与风格检查
ESL-->>Dev : 报告规则违规
Dev->>Jest : 运行测试
Jest-->>Dev : 输出测试结果与覆盖率
Dev->>TS : 执行构建
TS-->>Dev : 生成构建产物
```
图表来源
- [package.json服务端:5-12](file://package.json#L5-L12)
- [jest.config.js:174-176](file://jest.config.js#L174-L176)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
## 详细组件分析
### ESLint 配置与规则
- 服务端TypeScript
- 环境node、jest
- 继承eslint:recommended、@typescript-eslint/eslint-recommended、@typescript-eslint/recommended、jest/recommended
- 解析器:@typescript-eslint/parser
- 解析选项module、project 指向 tsconfig.lint.json
- 关键规则:
- 禁止 var 的 require 使用
- any 类型放宽
- 分号:强制;多余分号:报错
- 客户端JavaScript
- 环境browser、es6、jest
- 继承eslint:recommended、jest/recommended
- 规则:强制分号、禁止多余分号
章节来源
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [.eslintrc.json客户端:1-23](file://client/.eslintrc.json#L1-L23)
### 代码格式化与 EditorConfig
- 统一规则:
- 缩进:空格
- 行结束符LF
- 缩进大小2
- 文件末尾插入换行
- 字符集UTF-8
- 去除行尾空白
- 适用范围ts、js、json、html
章节来源
- [.editorconfig:10-20](file://.editorconfig#L10-L20)
### TypeScript 与 JavaScript 的差异化规则
- TypeScript
- 使用 @typescript-eslint 推荐规则,强调类型安全与结构一致性
- 通过 tsconfig.lint.json 优化 ESLint 性能(关闭 sourceMap
- JavaScript客户端
- 面向浏览器与 ES6强调语义正确性与简洁性
- 保留分号一致性,避免多余分号
章节来源
- [.eslintrc.cjs:6-16](file://.eslintrc.cjs#L6-L16)
- [.eslintrc.json客户端:3-22](file://client/.eslintrc.json#L3-L22)
- [tsconfig.lint.json:4-11](file://tsconfig.lint.json#L4-L11)
### 命名约定与变量命名最佳实践
- 类型与模块
- 类名:帕斯卡命名(如 RenderStreaming
- 接口/类型:帕斯卡命名(如 Options
- 模块导出:默认导出或具名导出保持一致,避免混用
- 变量与函数
- 变量:小驼峰命名(如 connectionId、options
- 函数:动词短语或小驼峰(如 getIPAddress、createServer
- 常量:全大写蛇形(如 MAX_RETRIES
- 文件与路径
- 源文件:按功能分层组织(如 src/class、src/signaling
- 测试文件:与被测模块同名或以 .test 后缀
- 前端输入设备类
- 类名:帕斯卡命名(如 Sender、Observer
- 属性与方法:小驼峰(如 devices、onEvent
章节来源
- [src/index.ts:13-106](file://src/index.ts#L13-L106)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [client/src/peer.js:3-188](file://client/src/peer.js#L3-L188)
- [client/src/sender.js:14-209](file://client/src/sender.js#L14-L209)
### 注释规范与文档编写标准
- 文件级注释
- 说明模块职责、入口点与关键行为
- 函数/方法注释
- 参数与返回值:使用 JSDoc 风格(如 @param@returns
- 复杂逻辑:简述目的与边界条件
- 类注释
- 类的用途、构造参数、事件与生命周期
- 前端类示例
- 类定义处与关键方法处提供注释,描述事件派发与状态变化
章节来源
- [client/src/sender.js:107-112](file://client/src/sender.js#L107-L112)
- [client/src/sender.js:191-201](file://client/src/sender.js#L191-L201)
### 代码审查流程与质量检查要点
- 代码检查
- 本地npm run lint服务端与 npm run lint客户端
- CI集成 lint 与 test 步骤,确保通过后再合并
- 测试覆盖率
- Jest 启用覆盖率收集,建议设定最小阈值
- 审查清单
- 类型安全TS 是否启用严格模式相关规则
- 命名一致性:是否遵循命名约定
- 注释完整性:关键函数/类是否具备必要注释
- 错误处理:异常分支与日志记录
- 性能与资源:定时任务、事件监听与清理
章节来源
- [package.json服务端:5-12](file://package.json#L5-L12)
- [package.json客户端:5-8](file://client/package.json#L5-L8)
- [jest.config.js:20-34](file://jest.config.js#L20-L34)
### 常见代码问题与修复方法
- TypeScript
- any 类型滥用:优先使用具体类型或泛型
- 导入路径不一致:统一相对路径或别名
- 未使用的变量/私有成员:删除或标记为私有
- JavaScript客户端
- 事件监听未移除:在组件销毁时解绑
- 分号缺失:遵循 EditorConfig 与 ESLint 规则
- 重复逻辑:抽取为函数或工具模块
- 通用
- 日志与错误:使用统一的日志模块,避免直接 console
- 资源清理WebSocket、HTTP 请求、文件句柄等及时释放
章节来源
- [.eslintrc.cjs:18-23](file://.eslintrc.cjs#L18-L23)
- [.eslintrc.json客户端:19-22](file://client/.eslintrc.json#L19-L22)
- [src/server.ts:44-57](file://src/server.ts#L44-L57)
### 自动化质量检查工具配置与使用
- ESLint
- 服务端npm run lint 检查 src 与 test 下的 TypeScript 文件
- 客户端npm run lint 检查 public 与 src、test 下的 JS 文件
- Jest
- 服务端npm test 运行所有测试
- 客户端npm test 运行前端测试(需 jsdom 环境)
- TypeScript
- 构建npm run build 使用 tsconfig.build.json
- ESLint 专用tsconfig.lint.json 关闭 sourceMap提升性能
章节来源
- [package.json服务端:5-12](file://package.json#L5-L12)
- [package.json客户端:5-8](file://client/package.json#L5-L8)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.lint.json:1-12](file://tsconfig.lint.json#L1-L12)
- [jest.config.js:174-176](file://jest.config.js#L174-L176)
## 依赖分析
- 工具链耦合
- ESLint 与 TypeScript 解析器耦合,解析选项指向 tsconfig.lint.json
- Jest 与 ts-jest 耦合,支持 TS/TSX 测试文件
- 环境差异
- 服务端Node 环境Jest 测试环境为 node
- 客户端浏览器环境Jest 使用 jsdom 与自定义环境配置
```mermaid
graph LR
ESLintTS["@typescript-eslint/parser<br/>解析 TS/TSX"]
ESLintCfg[".eslintrc.cjs<br/>规则与插件"]
JestTS["ts-jest<br/>转换 TS/TSX"]
JestCfg["jest.config.js<br/>测试环境与扩展"]
TSConf["tsconfig.json<br/>编译配置"]
LintTSConf["tsconfig.lint.json<br/>ESLint 专用"]
ESLintCfg --> ESLintTS
ESLintCfg --> LintTSConf
JestCfg --> JestTS
JestCfg --> TSConf
```
图表来源
- [.eslintrc.cjs:12-16](file://.eslintrc.cjs#L12-L16)
- [tsconfig.lint.json:4-11](file://tsconfig.lint.json#L4-L11)
- [jest.config.js:174-176](file://jest.config.js#L174-L176)
- [tsconfig.json:4-11](file://tsconfig.json#L4-L11)
章节来源
- [.eslintrc.cjs:12-16](file://.eslintrc.cjs#L12-L16)
- [tsconfig.lint.json:4-11](file://tsconfig.lint.json#L4-L11)
- [jest.config.js:174-176](file://jest.config.js#L174-L176)
- [tsconfig.json:4-11](file://tsconfig.json#L4-L11)
## 性能考虑
- ESLint 性能
- 使用 tsconfig.lint.json 关闭 sourceMap减少解析开销
- 仅对 src 与 test 目标进行检查,避免 node_modules
- 构建与测试
- 构建输出至 build 目录,便于缓存与增量编译
- Jest 使用 v8 覆盖率提供器,平衡速度与准确性
章节来源
- [tsconfig.lint.json:8](file://tsconfig.lint.json#L8)
- [jest.config.js:34](file://jest.config.js#L34)
- [package.json服务端:6](file://package.json#L6)
## 故障排查指南
- ESLint 报错
- 规则冲突:调整 .eslintrc.cjs 或 .eslintrc.json 中的 rules
- 解析失败:确认 tsconfig.lint.json 与 tsconfig.json 的 include/exclude 一致
- Jest 测试失败
- 环境问题:检查 jest.config.js 的 testEnvironment 与 jsdom 配置
- 转换问题:确认 ts-jest 版本与 tsconfig.json 设置匹配
- EditorConfig 不生效
- 检查文件扩展名是否在 [*.{ts,js,json,html}] 范围内
- 确认编辑器已加载 EditorConfig 插件
章节来源
- [.eslintrc.cjs:18-23](file://.eslintrc.cjs#L18-L23)
- [.eslintrc.json客户端:19-22](file://client/.eslintrc.json#L19-L22)
- [jest.config.js:140-145](file://jest.config.js#L140-L145)
- [.editorconfig:15-18](file://.editorconfig#L15-L18)
## 结论
本指南提供了从工具配置到编码实践的完整质量保障体系。建议团队在开发流程中坚持:
- 保存即检查:利用 EditorConfig 与 ESLint 在本地即时反馈
- 测试驱动:以 Jest 覆盖核心逻辑,持续改进覆盖率
- 文档与注释:关键模块与复杂函数必须具备清晰注释
- 审查与迭代:结合审查清单与自动化检查,逐步完善规则与流程
## 附录
### 示例WebSocket 信令处理测试流程
```mermaid
sequenceDiagram
participant Test as "测试用例"
participant WSHandler as "WebSocket 处理器"
participant MockWS as "WebSocket 模拟"
participant Signaling as "信令服务"
Test->>MockWS : 建立连接
Test->>WSHandler : add(客户端)
WSHandler->>Signaling : 广播 connect 消息
Test->>WSHandler : onOffer(发送 offer)
WSHandler->>Signaling : 广播 offer 消息
Test->>WSHandler : onAnswer(发送 answer)
WSHandler->>Signaling : 广播 answer 消息
Test->>WSHandler : remove(断开)
WSHandler->>Signaling : 广播 disconnect 消息
```
图表来源
- [test/websockethandler.test.ts:30-99](file://test/websockethandler.test.ts#L30-L99)
### 示例:输入远程控制测试流程
```mermaid
sequenceDiagram
participant Test as "测试用例"
participant Sender as "Sender"
participant Remoting as "InputRemoting"
participant Observer as "Observer"
Test->>Sender : 创建实例
Test->>Remoting : 创建实例并绑定 Sender
Test->>Observer : 创建观察者
Test->>Remoting : subscribe(Observer)
Test->>Remoting : startSending()
Test->>Remoting : stopSending()
```
图表来源
- [client/test/inputremoting.test.js:24-48](file://client/test/inputremoting.test.js#L24-L48)