版本控制规范
工程化规范的必要性
工程化规范是团队协作的基础保障。缺乏统一规范会导致代码风格混乱、维护成本增加、协作效率低下。以CSS为例,不同开发者可能采用不同命名方式:
/* 驼峰式 */
.mainContainer {}
/* 中划线式 */
.main-container {}
/* 下划线式 */
.main_container {}
这种不一致性会导致样式冲突和选择器权重问题。工程化规范通过约束以下方面提升质量:
- 代码风格一致性
- 目录结构标准化
- 自动化流程统一
- 质量管控指标
版本控制规范的核心原则
分支管理策略
Git Flow是最常用的分支模型,包含以下分支类型:
master
- 生产环境代码develop
- 集成开发分支feature/*
- 功能开发分支release/*
- 预发布分支hotfix/*
- 紧急修复分支
示例创建功能分支:
git checkout -b feature/user-auth develop
提交信息规范
采用Angular提交规范,格式为:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
常见type类型:
- feat:新功能
- fix:bug修复
- docs:文档变更
- style:代码格式
- refactor:重构代码
- test:测试用例
示例提交:
feat(login): add OAuth2.0 support
- implement Google OAuth integration
- add token refresh mechanism
Closes #123
前端工程化规范实践
目录结构规范
推荐按功能模块划分的目录结构:
src/
├── assets/ # 静态资源
├── components/ # 公共组件
├── pages/ # 页面组件
├── store/ # 状态管理
├── utils/ # 工具函数
├── styles/ # 全局样式
└── router/ # 路由配置
ESLint配置示例
.eslintrc.js
基础配置:
module.exports = {
extends: ['airbnb', 'prettier'],
rules: {
'react/jsx-filename-extension': [
1,
{ extensions: ['.js', '.jsx'] }
],
'import/no-extraneous-dependencies': [
'error',
{ devDependencies: true }
]
}
};
Git Hook配置
通过husky实现提交前检查:
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.{js,jsx}": ["eslint --fix", "git add"]
}
}
代码审查规范
审查要点清单
- 功能实现是否符合需求
- 是否存在潜在性能问题
- 错误处理是否完备
- 测试覆盖率是否达标
- 文档是否同步更新
代码审查示例
问题代码:
// 缺乏错误处理
async function fetchData() {
const res = await axios.get('/api/data');
return res.data;
}
改进建议:
async function fetchData() {
try {
const res = await axios.get('/api/data');
return res.data;
} catch (error) {
console.error('Fetch failed:', error);
throw new Error('Failed to fetch data');
}
}
持续集成规范
CI流程配置
.gitlab-ci.yml
示例:
stages:
- test
- build
- deploy
unit_test:
stage: test
script:
- npm run test
build_prod:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
deploy_staging:
stage: deploy
script:
- scp -r dist/* user@server:/path
only:
- develop
质量门禁设置
- 单元测试覆盖率≥80%
- ESLint零错误
- 构建时间<5分钟
- 关键路径测试100%通过
版本发布规范
语义化版本控制
版本号格式:MAJOR.MINOR.PATCH
- MAJOR:不兼容的API修改
- MINOR:向下兼容的功能新增
- PATCH:向下兼容的问题修正
changelog生成
使用standard-version自动生成:
{
"scripts": {
"release": "standard-version"
}
}
执行后会生成包含以下内容的CHANGELOG.md:
# Changelog
## [1.1.0] - 2023-05-20
### Added
- User profile editing feature
### Fixed
- Login page layout issue
异常处理规范
前端错误监控
Sentry初始化配置:
import * as Sentry from '@sentry/react';
Sentry.init({
dsn: 'YOUR_DSN',
release: process.env.REACT_APP_VERSION,
environment: process.env.NODE_ENV,
tracesSampleRate: 0.2
});
错误边界实现
React错误边界组件示例:
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, info) {
Sentry.captureException(error, { extra: info });
}
render() {
if (this.state.hasError) {
return <FallbackUI />;
}
return this.props.children;
}
}
文档编写规范
组件文档示例
使用Storybook的MDX格式:
import { Meta, Story, ArgsTable } from '@storybook/addon-docs';
import Button from './Button';
<Meta title="Components/Button" component={Button} />
# Button
通用按钮组件,支持多种状态和样式。
<ArgsTable of={Button} />
## Primary Button
<Story name="Primary">
<Button variant="primary">Submit</Button>
</Story>
API文档要求
- 参数说明包含类型和默认值
- 提供完整的使用示例
- 标注版本变更记录
- 注意事项和常见问题
自动化测试规范
测试金字塔实践
- 单元测试:70%覆盖率
- 集成测试:20%覆盖率
- E2E测试:10%覆盖率
Jest测试示例
React组件测试案例:
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Button from './Button';
describe('Button Component', () => {
it('triggers onClick handler', async () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick} />);
await userEvent.click(screen.getByRole('button'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
it('shows loading state', () => {
render(<Button loading />);
expect(screen.getByTestId('spinner')).toBeInTheDocument();
});
});
依赖管理规范
版本锁定机制
使用package-lock.json
或yarn.lock
确保依赖一致性。禁止使用模糊版本声明:
// 不推荐
"dependencies": {
"react": "^17.0.0"
}
// 推荐
"dependencies": {
"react": "17.0.2"
}
依赖更新策略
- 定期执行
npm outdated
检查 - 重大更新创建独立分支测试
- 次版本更新需通过回归测试
- 补丁版本可自动更新
性能优化规范
打包体积控制
webpack配置示例:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
maxSize: 244 * 1024 // 244KB
}
}
};
关键渲染路径优化
- 内联关键CSS
- 延迟加载非关键JS
- 预加载关键资源
- 使用Intersection Observer实现懒加载
示例懒加载组件:
const LazyComponent = React.lazy(() => import('./HeavyComponent'));
function MyComponent() {
return (
<Suspense fallback={<Spinner />}>
<LazyComponent />
</Suspense>
);
}
多环境管理规范
环境变量配置
.env
文件示例:
# .env.development
API_BASE_URL=http://dev.api.example.com
DEBUG=true
# .env.production
API_BASE_URL=https://api.example.com
DEBUG=false
环境检测逻辑
const getApiBaseUrl = () => {
switch(process.env.NODE_ENV) {
case 'development':
return process.env.API_BASE_URL || 'http://localhost:3000';
case 'production':
return process.env.API_BASE_URL;
default:
throw new Error('Unknown environment');
}
};
前端安全规范
XSS防护措施
- 使用DOMPurify处理富文本
- 避免直接使用innerHTML
- 设置CSP安全策略
- 对用户输入进行转义
示例安全渲染:
function SafeRender({ html }) {
const clean = DOMPurify.sanitize(html);
return <div dangerouslySetInnerHTML={{ __html: clean }} />;
}
CSRF防护方案
- 使用SameSite Cookie属性
- 添加CSRF Token验证
- 检查Origin/Referer头部
- 关键操作要求二次验证
axios拦截器配置示例:
axios.interceptors.request.use(config => {
config.headers['X-CSRF-TOKEN'] = getCSRFToken();
return config;
});
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:MongoDB核心知识点
下一篇:构建工具配置