第 4 章:
约 2169 字大约 7 分钟
2025-11-20
在全栈开发中,建立统一的代码规范和遵循最佳实践对于保证项目质量、提高团队协作效率至关重要。本章将详细介绍前端和后端的代码规范,以及如何使用工具来自动化代码质量控制。
4.1 前端代码规范
4.1.1 基础规范
- 使用 TypeScript 进行类型检查,提高代码的健壮性
- 遵循 Vue 3 的 Composition API 风格进行组件开发
- 组件命名采用 PascalCase,如
UserProfile.vue - Props 命名采用 camelCase,事件命名采用 kebab-case
- 常量命名使用全大写加下划线,如
MAX_RETRY_COUNT
4.1.2 进阶规范
- 为组件和函数添加适当的 JSDoc 文档注释
- 使用 ESLint 和 Prettier 保持代码风格一致
- 组件拆分遵循单一职责原则,避免过大的组件
- 使用 Pinia 进行状态管理,遵循 Store 的最佳实践
- 合理使用 Vue 的响应式 API,避免不必要的响应式开销
4.1.3 文件结构规范
- 相关组件放在同一目录下,使用 index.ts 导出
- 工具函数按功能模块组织在 utils 目录
- 样式文件与组件文件放在同一目录,使用 Vue 的单文件组件模式
4.2 后端代码规范
4.2.1 基础规范
- 遵循 PEP 8 编码规范,使用 4 个空格进行缩进
- 模块和函数命名使用 snake_case,类名使用 PascalCase
- 变量命名清晰明确,避免使用单字母变量(循环变量除外)
- 使用 Black、isort 和 Flake8 格式化和检查代码
4.2.2 进阶规范
- 使用 Pydantic 模型进行数据验证和序列化/反序列化
- 为 API 添加清晰的文档字符串和请求/响应示例
- 实现适当的错误处理和日志记录
- 遵循依赖注入原则,提高代码的可测试性
- 数据库操作封装在专门的服务层,避免直接在路由处理函数中操作数据库
4.2.3 文件结构规范
- API 路由按资源类型组织
- 数据模型和业务逻辑分离
- 配置信息集中管理,支持不同环境的配置切换
4.3 通用开发规范
4.3.1 开发流程规范
- 代码提交前运行格式化和检查工具
- 编写单元测试和集成测试,确保代码质量
- 提交信息使用清晰的格式,描述变更内容和原因
- 功能开发前编写技术方案文档
4.3.2 代码质量规范
- 保持函数的单一职责原则
- 代码注释应解释"为什么"而不是"是什么"
- 避免深度嵌套的条件语句和循环
- 优先使用不可变数据结构
- 避免使用魔术数字和硬编码字符串
4.3.3 安全规范
- 前端避免在客户端存储敏感信息
- 后端实现适当的认证和授权机制
- 使用参数化查询,避免 SQL 注入
- 对用户输入进行严格验证
4.4 代码规范工具配置
下面是推荐的代码规范工具配置,帮助你在项目中实现自动化的代码检查和格式化:
4.4.1 前端项目配置
4.4.1.1 ESLint 配置
创建或完善 .eslintrc.js 文件:
// .eslintrc.js
module.exports = {
extends: [
'@nuxt/eslint-config',
'plugin:prettier/recommended',
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended'
],
parserOptions: {
ecmaVersion: 2020,
parser: '@typescript-eslint/parser'
},
rules: {
// 基础规则
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
// Vue 规则
'vue/multi-word-component-names': 'warn',
'vue/attribute-hyphenation': 'on',
'vue/require-default-prop': 'off',
// TypeScript 规则
'@typescript-eslint/explicit-module-boundary-types': 'warn',
'@typescript-eslint/no-explicit-any': 'warn'
}
}4.4.1.2 Prettier 配置
创建或完善 .prettierrc 文件:
{
"semi": false,
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 80,
"tabWidth": 2,
"arrowParens": "avoid",
"vueIndentScriptAndStyle": true
}4.4.1.3 TypeScript 配置
在 tsconfig.json 中添加严格的类型检查选项:
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"alwaysStrict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}4.4.1.4 package.json 中的脚本配置
{
"scripts": {
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
"format": "prettier --write .",
"type-check": "vue-tsc --noEmit -p tsconfig.json --composite false"
}
}4.4.2 后端项目配置
4.4.2.1 pyproject.toml 配置
[tool.black]
line-length = 88
target-version = ['py39']
include = '\\.pyi?$'
exclude = '''
/(\\.
|venv
|__pycache__
|build
|dist
)/
'''
[tool.isort]
profile = "black"
line_length = 88
known_first_party = ["app"]
known_third_party = ["fastapi", "uvicorn", "sqlalchemy", "pydantic"]
[tool.flake8]
max-line-length = 88
extend-ignore = ["E203", "W503"]
select = ["E9", "F63", "F7", "F82"]4.4.2.2 mypy 配置(可选,用于类型检查)
创建 mypy.ini 文件:
[mypy]
python_version = 3.9
warn_return_any = True
warn_unused_configs = True
no_implicit_optional = True
disallow_untyped_defs = False
disallow_incomplete_defs = False
check_untyped_defs = False
[mypy-fastapi.*]
follow_imports = skip
[mypy-pydantic.*]
follow_imports = skip4.4.2.3 任务脚本配置
使用 taskipy 或创建 Makefile 来管理开发任务:
# 在 pyproject.toml 中添加
[tool.taskipy.tasks]
dev = "uvicorn app.main:app --reload --host 0.0.0.0 --port 8000"
test = "pytest"
format = "black app tests && isort app tests"
lint = "flake8 app tests"
check-types = "mypy app"
check-all = "task format && task lint && task check-types && task test"4.4.3 工具使用指南
通过以上配置,你可以在开发过程中使用以下命令来保持代码质量:
前端项目:
pnpm run lint- 检查并修复代码风格问题pnpm run format- 格式化所有代码pnpm run type-check- 运行 TypeScript 类型检查
后端项目:
task format- 使用 Black 和 isort 格式化代码task lint- 使用 Flake8 检查代码质量task check-types- 使用 mypy 检查类型 task check-all - 运行所有检查和测试
这些工具和配置将帮助你在项目开发过程中保持一致的代码风格,减少常见错误,并提高代码的可读性和可维护性。
4.5 命令行与计算机基础概念
作为全栈开发者,熟练掌握命令行工具和理解计算机基础概念是必不可少的技能。这不仅能提高开发效率,还能帮助你更好地理解系统运行机制。
4.5.1 终端与 Shell
- 终端 (Terminal): 提供与计算机交互的文本输入输出环境的程序(如 VS Code 的终端、Windows Terminal、iTerm2)。
- Shell: 运行在终端中的命令解释器,负责处理用户输入的命令并传递给操作系统执行(如 PowerShell, Bash, Zsh, Cmd)。
- 命令行界面 (CLI): 通过文本命令进行交互的界面,相对于图形用户界面 (GUI)。
4.5.2 文件系统概念
- 路径 (Path): 文件或目录在文件系统中的位置。
- 绝对路径: 从根目录开始的完整路径 (如
C:\Users\Name\Project或/home/user/project)。 - 相对路径: 相对于当前工作目录的路径 (如
./src,../components)。.代表当前目录。..代表上一级目录。~通常代表用户主目录 (Home Directory)。
- 绝对路径: 从根目录开始的完整路径 (如
4.5.3 常用命令行操作
以下命令以 PowerShell (Windows) 和 Bash (macOS/Linux) 为主:
目录导航
pwd(Print Working Directory): 显示当前工作目录路径。ls(List): 列出当前目录下的文件和文件夹 (Windows PowerShell 中ls是Get-ChildItem的别名,dir也可以)。cd <目录>(Change Directory): 进入指定目录。cd ..: 返回上一级。cd ~: 回到用户主目录。
文件操作
mkdir <目录名>(Make Directory): 创建新目录。touch <文件名>(Linux/Mac) /ni <文件名>(PowerShell): 创建空文件。cp <源> <目标>(Copy): 复制文件或目录 (PowerShell 中使用cp或Copy-Item)。mv <源> <目标>(Move): 移动或重命名文件 (PowerShell 中使用mv或Move-Item)。rm <文件>(Remove): 删除文件 (PowerShell 中使用rm或Remove-Item)。rm -r <目录>: 递归删除目录及其内容。
4.5.4 网络基础概念
- IP 地址: 计算机在网络中的唯一标识 (如
192.168.1.1)。- Localhost / 127.0.0.1: 指向当前计算机本身的特殊 IP 地址。
- 端口 (Port): 应用程序在计算机上的通信通道 (如 Web 服务常用 80, 443, 3000, 8080)。
- 开发中常见:
localhost:3000(前端),localhost:8000(后端)。
- 开发中常见:
- HTTP/HTTPS: 超文本传输协议,Web 通信的基础。
- Request (请求): 客户端发出的消息 (GET, POST, PUT, DELETE)。
- Response (响应): 服务器返回的消息 (状态码 200 OK, 404 Not Found, 500 Error)。
4.5.5 环境变量
- 环境变量: 操作系统级别的变量,用于存储系统配置信息。
- PATH: 最重要的环境变量之一,存储了可执行程序的搜索路径。当你输入一个命令 (如
node,python) 时,系统会在 PATH 包含的目录中查找对应的程序。 - 设置环境变量:
- 在开发中常用
.env文件来管理项目级别的环境变量 (如数据库密码、API 密钥),避免硬编码在代码中。
- 在开发中常用
4.5.6 进程管理
- 进程 (Process): 正在运行的程序实例。
- PID (Process ID): 进程的唯一标识符。
- 终止进程:
Ctrl + C: 在终端中强制停止当前运行的命令。kill <PID>(Linux/Mac) /Stop-Process <PID>(PowerShell): 根据 ID 停止进程。- 常见场景:端口被占用时,需要找到占用端口的进程并结束它。