Skip to content

16.3 项目管理

文档信息

  • 标题: HTML5项目管理
  • 版本: 1.0
  • 更新日期: 2024年
  • 难度级别: 中级
  • 预计学习时间: 50分钟

SEO关键词

HTML5项目管理, 前端项目管理, 需求分析, 技术选型, 开发流程, 测试策略, 部署策略, 项目监控

学习目标

学完本节内容,您将能够:

  • 掌握HTML5项目的需求分析方法
  • 理解技术选型的决策过程
  • 建立高效的开发流程
  • 制定完整的测试策略
  • 实施可靠的部署策略

内容目录

  1. 需求分析
  2. 技术选型
  3. 开发流程
  4. 测试策略
  5. 部署策略

1. 需求分析

1.1 需求收集

需求收集方法

markdown
# 需求收集方法

## 1. 用户访谈
- 目标用户画像
- 使用场景分析
- 痛点问题识别
- 期望功能梳理

## 2. 问卷调查
- 大范围用户调研
- 数据统计分析
- 趋势预测
- 需求验证

## 3. 竞品分析
- 功能对比
- 用户体验分析
- 技术架构研究
- 差异化识别

## 4. 业务分析
- 业务流程梳理
- 系统边界定义
- 数据流分析
- 集成需求

需求文档模板

markdown
# 项目需求文档

## 1. 项目概述
- 项目背景
- 项目目标
- 成功标准
- 时间计划

## 2. 用户需求
- 目标用户群体
- 用户故事
- 使用场景
- 用户体验要求

## 3. 功能需求
- 核心功能
- 辅助功能
- 权限管理
- 数据管理

## 4. 非功能需求
- 性能要求
- 安全要求
- 兼容性要求
- 可用性要求

## 5. 技术约束
- 技术栈限制
- 预算约束
- 时间约束
- 人员限制

1.2 需求分析工具

用户故事映射

markdown
# 用户故事映射示例

## 用户角色:网站访客
目标:快速找到所需信息

### 用户旅程
1. 访问网站
2. 浏览导航
3. 搜索内容
4. 查看详情
5. 联系客服

### 用户故事
- 作为访客,我希望能够快速加载页面,以便节省时间
- 作为访客,我希望有清晰的导航结构,以便快速找到信息
- 作为访客,我希望有搜索功能,以便精确查找内容
- 作为访客,我希望有移动端适配,以便在手机上正常使用
- 作为访客,我希望有在线客服,以便及时获得帮助

### 验收标准
- 页面加载时间 < 3秒
- 导航层级 <= 3层
- 搜索响应时间 < 1秒
- 移动端兼容性 >= 95%
- 客服响应时间 < 30秒

原型设计

html
<!-- 低保真原型示例 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>网站原型</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        .wireframe {
            font-family: Arial, sans-serif;
            background-color: #f5f5f5;
        }
        
        .box {
            border: 2px solid #333;
            background-color: white;
            margin: 10px;
            padding: 10px;
            text-align: center;
        }
        
        .header {
            height: 80px;
            background-color: #e0e0e0;
            display: flex;
            align-items: center;
            justify-content: space-between;
        }
        
        .nav {
            height: 50px;
            background-color: #d0d0d0;
            display: flex;
            align-items: center;
        }
        
        .main-content {
            display: grid;
            grid-template-columns: 200px 1fr;
            gap: 20px;
            min-height: 500px;
        }
        
        .sidebar {
            background-color: #c0c0c0;
        }
        
        .content-area {
            background-color: white;
            padding: 20px;
        }
        
        .footer {
            height: 60px;
            background-color: #b0b0b0;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .placeholder {
            color: #666;
            font-style: italic;
        }
    </style>
</head>
<body class="wireframe">
    <header class="header box">
        <div class="placeholder">LOGO</div>
        <div class="placeholder">搜索框</div>
        <div class="placeholder">用户菜单</div>
    </header>
    
    <nav class="nav box">
        <div class="placeholder">导航菜单 | 首页 | 产品 | 服务 | 关于我们 | 联系我们</div>
    </nav>
    
    <main class="main-content">
        <aside class="sidebar box">
            <div class="placeholder">侧边栏</div>
            <div class="placeholder">- 分类1</div>
            <div class="placeholder">- 分类2</div>
            <div class="placeholder">- 分类3</div>
        </aside>
        
        <section class="content-area box">
            <div class="placeholder">主要内容区域</div>
            <div class="placeholder">文章标题</div>
            <div class="placeholder">文章内容...</div>
            <div class="placeholder">相关推荐</div>
        </section>
    </main>
    
    <footer class="footer box">
        <div class="placeholder">页脚信息 | 版权声明 | 友情链接</div>
    </footer>
</body>
</html>

1.3 需求管理

需求优先级评估

markdown
# 需求优先级矩阵

## 评估维度
1. 业务价值 (1-5分)
2. 技术难度 (1-5分)
3. 用户影响 (1-5分)
4. 开发成本 (1-5分)

## 优先级计算
优先级 = (业务价值 × 0.4) + (用户影响 × 0.3) + (技术难度 × 0.2) + (开发成本 × 0.1)

## 需求列表示例
| 需求ID | 需求描述 | 业务价值 | 技术难度 | 用户影响 | 开发成本 | 优先级 | 状态 |
|--------|----------|----------|----------|----------|----------|--------|------|
| REQ001 | 响应式设计 | 5 | 3 | 5 | 3 | 4.4 | 高 |
| REQ002 | 搜索功能 | 4 | 4 | 4 | 4 | 4.0 | 高 |
| REQ003 | 用户评论 | 3 | 3 | 3 | 3 | 3.0 | 中 |
| REQ004 | 多语言支持 | 2 | 4 | 2 | 4 | 2.6 | 低 |
| REQ005 | 深色模式 | 2 | 2 | 2 | 2 | 2.0 | 低 |

需求变更管理

markdown
# 需求变更管理流程

## 变更请求流程
1. 提交变更请求
2. 影响评估
3. 成本估算
4. 风险评估
5. 决策审批
6. 实施计划
7. 跟踪验证

## 变更请求模板
### 变更请求ID: CR-001
### 提交日期: 2024-01-15
### 提交人: 项目经理

### 变更描述
原需求:简单的联系表单
变更为:支持文件上传的联系表单

### 变更原因
用户反馈需要能够上传附件

### 影响分析
- 开发工作量:+2天
- 测试工作量:+1天
- 技术风险:低
- 进度影响:延期1周

### 成本估算
- 开发成本:+5000元
- 测试成本:+2000元
- 总成本:+7000元

### 审批意见
□ 同意  □ 拒绝  □ 待定

### 审批人签名:_________
### 审批日期:_________

2. 技术选型

2.1 技术评估框架

技术选型矩阵

markdown
# 技术选型评估矩阵

## 评估维度
1. 技术成熟度 (20%)
2. 社区支持 (15%)
3. 性能表现 (20%)
4. 学习成本 (15%)
5. 开发效率 (15%)
6. 维护成本 (10%)
7. 未来发展 (5%)

## 前端框架对比
| 框架 | 技术成熟度 | 社区支持 | 性能表现 | 学习成本 | 开发效率 | 维护成本 | 未来发展 | 总分 |
|------|------------|----------|----------|----------|----------|----------|----------|------|
| React | 9 | 9 | 8 | 6 | 8 | 7 | 9 | 7.95 |
| Vue | 8 | 8 | 8 | 8 | 9 | 8 | 8 | 8.25 |
| Angular | 9 | 7 | 7 | 5 | 7 | 6 | 8 | 7.15 |
| 原生JS | 10 | 5 | 9 | 9 | 5 | 8 | 6 | 7.55 |

## 构建工具对比
| 工具 | 配置复杂度 | 构建速度 | 生态系统 | 学习成本 | 总分 |
|------|------------|----------|----------|----------|------|
| Webpack | 7 | 6 | 9 | 5 | 6.75 |
| Vite | 9 | 9 | 7 | 8 | 8.25 |
| Rollup | 8 | 8 | 7 | 7 | 7.50 |
| Parcel | 9 | 7 | 6 | 9 | 7.75 |

技术选型决策树

mermaid
graph TD
    A[项目规模] --> B[小型项目]
    A --> C[中型项目]
    A --> D[大型项目]
    
    B --> E[原生JavaScript]
    B --> F[轻量级框架]
    
    C --> G[Vue.js]
    C --> H[React]
    
    D --> I[Angular]
    D --> J[React + Redux]
    
    E --> K[简单构建工具]
    F --> L[Vite]
    G --> M[Vite/Webpack]
    H --> N[Webpack/Vite]
    I --> O[Angular CLI]
    J --> P[Webpack]

2.2 技术方案设计

系统架构设计

markdown
# 系统架构设计

## 整体架构

┌─────────────────────────────────────────────────────┐ │ 前端应用 │ ├─────────────────────────────────────────────────────┤ │ HTML5 + CSS3 + JavaScript ES6+ │ │ ├─ 组件库 (Vue.js/React) │ │ ├─ 状态管理 (Vuex/Redux) │ │ ├─ 路由管理 (Vue Router/React Router) │ │ └─ 构建工具 (Vite/Webpack) │ ├─────────────────────────────────────────────────────┤ │ API层 │ ├─────────────────────────────────────────────────────┤ │ RESTful API / GraphQL │ │ ├─ 数据获取 │ │ ├─ 身份验证 │ │ ├─ 错误处理 │ │ └─ 数据缓存 │ ├─────────────────────────────────────────────────────┤ │ 后端服务 │ ├─────────────────────────────────────────────────────┤ │ 应用服务器 (Node.js/Python/Java) │ │ ├─ 业务逻辑 │ │ ├─ 数据库访问 │ │ ├─ 文件存储 │ │ └─ 第三方集成 │ └─────────────────────────────────────────────────────┘


## 前端技术栈选择
- **框架**: Vue.js 3
- **状态管理**: Pinia
- **路由**: Vue Router 4
- **构建工具**: Vite
- **UI组件**: Element Plus
- **样式**: SCSS + PostCSS
- **测试**: Vitest + Vue Test Utils
- **代码质量**: ESLint + Prettier

技术实施计划

markdown
# 技术实施计划

## 第一阶段:基础设施搭建 (1周)
- [ ] 项目初始化
- [ ] 开发环境配置
- [ ] 代码规范配置
- [ ] 构建流程配置
- [ ] 版本控制配置

## 第二阶段:核心架构开发 (2周)
- [ ] 路由系统配置
- [ ] 状态管理配置
- [ ] API接口封装
- [ ] 通用组件开发
- [ ] 样式系统建立

## 第三阶段:功能模块开发 (3周)
- [ ] 页面模板开发
- [ ] 业务组件开发
- [ ] 数据交互实现
- [ ] 错误处理机制
- [ ] 性能优化

## 第四阶段:测试与优化 (1周)
- [ ] 单元测试编写
- [ ] 集成测试
- [ ] 性能测试
- [ ] 兼容性测试
- [ ] 代码优化

## 第五阶段:部署上线 (1周)
- [ ] 生产环境配置
- [ ] 部署流程配置
- [ ] 监控系统配置
- [ ] 备份策略配置
- [ ] 上线发布

3. 开发流程

3.1 开发生命周期

敏捷开发流程

markdown
# 敏捷开发流程

## Sprint计划 (2周一个迭代)

### Sprint 1: 基础架构
- 目标:搭建项目基础架构
- 用户故事:
  - 作为开发者,我需要一个稳定的开发环境
  - 作为开发者,我需要规范的代码规范
  - 作为开发者,我需要自动化的构建流程

### Sprint 2: 核心功能
- 目标:实现核心业务功能
- 用户故事:
  - 作为用户,我需要浏览网站内容
  - 作为用户,我需要搜索功能
  - 作为用户,我需要用户注册登录

### Sprint 3: 增强功能
- 目标:完善用户体验
- 用户故事:
  - 作为用户,我需要个人中心
  - 作为用户,我需要收藏功能
  - 作为用户,我需要分享功能

### Sprint 4: 优化发布
- 目标:性能优化和发布准备
- 用户故事:
  - 作为用户,我需要快速的页面加载
  - 作为用户,我需要稳定的系统
  - 作为管理员,我需要监控系统状态

开发工作流

mermaid
graph TD
    A[需求分析] --> B[技术设计]
    B --> C[开发实现]
    C --> D[代码评审]
    D --> E[测试验证]
    E --> F[集成测试]
    F --> G[部署发布]
    G --> H[监控反馈]
    H --> A
    
    D --> I[返回修改]
    I --> C
    
    E --> J[测试失败]
    J --> C
    
    F --> K[集成失败]
    K --> C

3.2 版本控制策略

Git Flow工作流

bash
# Git Flow 分支策略

# 主要分支
main        # 生产分支,稳定版本
develop     # 开发分支,最新开发版本

# 辅助分支
feature/*   # 功能分支,从develop分出
release/*   # 发布分支,从develop分出
hotfix/*    # 热修复分支,从main分出

# 示例操作流程
# 1. 创建功能分支
git checkout develop
git checkout -b feature/user-login

# 2. 开发完成后合并到develop
git checkout develop
git merge feature/user-login
git branch -d feature/user-login

# 3. 准备发布
git checkout develop
git checkout -b release/v1.0.0
# 修复bug,更新版本号
git checkout main
git merge release/v1.0.0
git tag v1.0.0
git checkout develop
git merge release/v1.0.0

# 4. 紧急修复
git checkout main
git checkout -b hotfix/critical-bug
# 修复bug
git checkout main
git merge hotfix/critical-bug
git tag v1.0.1
git checkout develop
git merge hotfix/critical-bug

提交规范

bash
# 提交信息格式
<type>(<scope>): <subject>

<body>

<footer>

# 类型说明
feat:     新功能
fix:      修复bug
docs:     文档更新
style:    代码格式化
refactor: 代码重构
test:     测试相关
chore:    构建过程或辅助工具的变动
perf:     性能优化

# 示例
feat(auth): 添加用户登录功能

- 实现用户名密码登录
- 添加记住密码功能
- 集成第三方登录

Closes #123

3.3 质量保证

代码质量检查

json
// .eslintrc.js
{
  "extends": [
    "eslint:recommended",
    "@vue/typescript/recommended",
    "@vue/prettier",
    "@vue/prettier/@typescript-eslint"
  ],
  "rules": {
    "no-console": "warn",
    "no-debugger": "error",
    "vue/no-unused-components": "error",
    "vue/no-unused-vars": "error",
    "@typescript-eslint/no-explicit-any": "warn",
    "prefer-const": "error",
    "no-var": "error"
  },
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module"
  }
}

自动化工作流

yaml
# .github/workflows/ci.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '16'
      - name: Install dependencies
        run: npm ci
      - name: Run ESLint
        run: npm run lint
      - name: Run Prettier
        run: npm run format:check

  test:
    runs-on: ubuntu-latest
    needs: lint
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '16'
      - name: Install dependencies
        run: npm ci
      - name: Run tests
        run: npm run test:unit
      - name: Run e2e tests
        run: npm run test:e2e

  build:
    runs-on: ubuntu-latest
    needs: [lint, test]
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '16'
      - name: Install dependencies
        run: npm ci
      - name: Build application
        run: npm run build
      - name: Upload build artifacts
        uses: actions/upload-artifact@v2
        with:
          name: build-files
          path: dist/

4. 测试策略

4.1 测试金字塔

测试层次结构

markdown
# 测试金字塔

## 单元测试 (70%)
- 测试范围:个别组件和函数
- 测试工具:Vitest, Jest
- 测试内容:
  - 组件渲染
  - 函数逻辑
  - 边界条件
  - 异常处理

## 集成测试 (20%)
- 测试范围:组件间交互
- 测试工具:Vue Test Utils
- 测试内容:
  - 组件通信
  - 状态管理
  - API调用
  - 路由导航

## 端到端测试 (10%)
- 测试范围:完整用户流程
- 测试工具:Cypress, Playwright
- 测试内容:
  - 用户界面
  - 业务流程
  - 浏览器兼容性
  - 性能测试

4.2 测试实现

单元测试示例

javascript
// tests/unit/components/UserCard.spec.js
import { mount } from '@vue/test-utils'
import UserCard from '@/components/UserCard.vue'

describe('UserCard.vue', () => {
  const defaultProps = {
    user: {
      id: 1,
      name: 'John Doe',
      email: 'john@example.com',
      avatar: 'https://example.com/avatar.jpg'
    }
  }

  it('renders user information correctly', () => {
    const wrapper = mount(UserCard, {
      props: defaultProps
    })
    
    expect(wrapper.find('.user-name').text()).toBe('John Doe')
    expect(wrapper.find('.user-email').text()).toBe('john@example.com')
    expect(wrapper.find('.user-avatar').attributes('src')).toBe('https://example.com/avatar.jpg')
  })

  it('emits delete event when delete button is clicked', async () => {
    const wrapper = mount(UserCard, {
      props: defaultProps
    })
    
    await wrapper.find('.delete-btn').trigger('click')
    
    expect(wrapper.emitted().delete).toBeTruthy()
    expect(wrapper.emitted().delete[0]).toEqual([1])
  })

  it('handles missing avatar gracefully', () => {
    const propsWithoutAvatar = {
      user: {
        id: 1,
        name: 'John Doe',
        email: 'john@example.com'
      }
    }
    
    const wrapper = mount(UserCard, {
      props: propsWithoutAvatar
    })
    
    expect(wrapper.find('.user-avatar').attributes('src')).toBe('/default-avatar.png')
  })
})

集成测试示例

javascript
// tests/integration/UserManagement.spec.js
import { mount } from '@vue/test-utils'
import { createRouter, createWebHistory } from 'vue-router'
import { createPinia } from 'pinia'
import UserManagement from '@/views/UserManagement.vue'
import { useUserStore } from '@/stores/user'

describe('UserManagement Integration', () => {
  let wrapper
  let router
  let pinia
  let userStore

  beforeEach(() => {
    pinia = createPinia()
    router = createRouter({
      history: createWebHistory(),
      routes: [
        { path: '/users', component: UserManagement },
        { path: '/users/:id', component: UserDetail }
      ]
    })

    wrapper = mount(UserManagement, {
      global: {
        plugins: [pinia, router]
      }
    })

    userStore = useUserStore()
  })

  it('loads users on component mount', async () => {
    // Mock API response
    const mockUsers = [
      { id: 1, name: 'John Doe', email: 'john@example.com' },
      { id: 2, name: 'Jane Smith', email: 'jane@example.com' }
    ]
    
    userStore.fetchUsers = vi.fn().mockResolvedValue(mockUsers)
    
    await wrapper.vm.$nextTick()
    
    expect(userStore.fetchUsers).toHaveBeenCalled()
    expect(wrapper.findAll('.user-card')).toHaveLength(2)
  })

  it('navigates to user detail when user is clicked', async () => {
    const mockUsers = [
      { id: 1, name: 'John Doe', email: 'john@example.com' }
    ]
    
    userStore.users = mockUsers
    await wrapper.vm.$nextTick()
    
    const userCard = wrapper.find('.user-card')
    await userCard.trigger('click')
    
    expect(router.currentRoute.value.path).toBe('/users/1')
  })
})

端到端测试示例

javascript
// tests/e2e/user-workflow.spec.js
import { test, expect } from '@playwright/test'

test.describe('User Management Workflow', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('http://localhost:3000')
  })

  test('complete user registration flow', async ({ page }) => {
    // Navigate to registration page
    await page.click('text=注册')
    await expect(page).toHaveURL('/register')

    // Fill registration form
    await page.fill('#username', 'testuser')
    await page.fill('#email', 'test@example.com')
    await page.fill('#password', 'password123')
    await page.fill('#confirmPassword', 'password123')

    // Submit form
    await page.click('button[type="submit"]')

    // Verify success message
    await expect(page.locator('.success-message')).toContainText('注册成功')
    
    // Verify redirect to login page
    await expect(page).toHaveURL('/login')
  })

  test('user login and dashboard access', async ({ page }) => {
    // Login
    await page.click('text=登录')
    await page.fill('#username', 'testuser')
    await page.fill('#password', 'password123')
    await page.click('button[type="submit"]')

    // Verify dashboard access
    await expect(page).toHaveURL('/dashboard')
    await expect(page.locator('.user-welcome')).toContainText('欢迎,testuser')

    // Test navigation
    await page.click('text=用户管理')
    await expect(page).toHaveURL('/users')
    await expect(page.locator('.user-list')).toBeVisible()
  })
})

4.3 测试自动化

测试配置文件

javascript
// vitest.config.js
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

export default defineConfig({
  plugins: [vue()],
  test: {
    environment: 'jsdom',
    setupFiles: ['./tests/setup.js'],
    coverage: {
      reporter: ['text', 'html', 'lcov'],
      exclude: [
        'node_modules/',
        'tests/',
        '*.config.js',
        'dist/'
      ]
    }
  },
  resolve: {
    alias: {
      '@': resolve(__dirname, './src')
    }
  }
})

测试覆盖率配置

json
// package.json
{
  "scripts": {
    "test:unit": "vitest run --coverage",
    "test:watch": "vitest watch",
    "test:e2e": "playwright test",
    "test:all": "npm run test:unit && npm run test:e2e"
  },
  "devDependencies": {
    "@playwright/test": "^1.40.0",
    "@vue/test-utils": "^2.4.0",
    "vitest": "^0.34.0",
    "jsdom": "^22.0.0"
  }
}

5. 部署策略

5.1 部署环境

环境配置

markdown
# 部署环境配置

## 开发环境 (Development)
- 目的:日常开发和调试
- 特点:
  - 热重载
  - 详细错误信息
  - 开发工具支持
  - 本地数据库

## 测试环境 (Testing)
- 目的:功能测试和质量保证
- 特点:
  - 模拟生产环境
  - 测试数据库
  - 日志记录
  - 性能监控

## 预发布环境 (Staging)
- 目的:发布前最终验证
- 特点:
  - 完全模拟生产环境
  - 生产数据副本
  - 完整监控系统
  - 负载测试

## 生产环境 (Production)
- 目的:正式对外服务
- 特点:
  - 高可用性
  - 性能优化
  - 安全防护
  - 监控告警

环境变量管理

javascript
// .env.development
VITE_APP_TITLE=开发环境
VITE_API_BASE_URL=http://localhost:3000/api
VITE_APP_DEBUG=true
VITE_APP_LOG_LEVEL=debug

// .env.production
VITE_APP_TITLE=生产环境
VITE_API_BASE_URL=https://api.example.com
VITE_APP_DEBUG=false
VITE_APP_LOG_LEVEL=error

// .env.staging
VITE_APP_TITLE=测试环境
VITE_API_BASE_URL=https://staging-api.example.com
VITE_APP_DEBUG=false
VITE_APP_LOG_LEVEL=warn

5.2 部署流程

CI/CD管道

yaml
# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '16'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm run test:all

      - name: Build application
        run: npm run build
        env:
          VITE_API_BASE_URL: ${{ secrets.PROD_API_URL }}

      - name: Deploy to S3
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
        
      - name: Sync to S3
        run: aws s3 sync dist/ s3://my-app-bucket --delete

      - name: Invalidate CloudFront
        run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"

      - name: Notify deployment
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          channel: '#deployments'
          webhook_url: ${{ secrets.SLACK_WEBHOOK }}

部署脚本

bash
#!/bin/bash
# deploy.sh

set -e

echo "开始部署..."

# 1. 环境检查
if [ "$NODE_ENV" != "production" ]; then
    echo "错误:请在生产环境中运行此脚本"
    exit 1
fi

# 2. 备份当前版本
echo "备份当前版本..."
if [ -d "/var/www/html/backup" ]; then
    rm -rf /var/www/html/backup
fi
cp -r /var/www/html /var/www/html/backup

# 3. 安装依赖
echo "安装依赖..."
npm ci --production

# 4. 构建应用
echo "构建应用..."
npm run build

# 5. 部署文件
echo "部署文件..."
cp -r dist/* /var/www/html/

# 6. 重启服务
echo "重启服务..."
sudo systemctl restart nginx

# 7. 健康检查
echo "健康检查..."
sleep 5
if curl -f http://localhost:80/health; then
    echo "部署成功!"
else
    echo "部署失败,回滚..."
    cp -r /var/www/html/backup/* /var/www/html/
    sudo systemctl restart nginx
    exit 1
fi

echo "部署完成!"

5.3 监控和维护

性能监控

javascript
// src/utils/performance.js
class PerformanceMonitor {
  constructor() {
    this.metrics = {
      pageLoadTime: 0,
      renderTime: 0,
      apiResponseTime: {},
      errorCount: 0
    }
  }

  // 监控页面加载时间
  measurePageLoad() {
    window.addEventListener('load', () => {
      const navigation = performance.getEntriesByType('navigation')[0]
      this.metrics.pageLoadTime = navigation.loadEventEnd - navigation.loadEventStart
      this.sendMetrics('page-load', this.metrics.pageLoadTime)
    })
  }

  // 监控API响应时间
  measureApiResponse(endpoint, startTime) {
    const responseTime = Date.now() - startTime
    this.metrics.apiResponseTime[endpoint] = responseTime
    this.sendMetrics('api-response', { endpoint, responseTime })
  }

  // 监控错误
  trackError(error) {
    this.metrics.errorCount++
    this.sendMetrics('error', {
      message: error.message,
      stack: error.stack,
      url: window.location.href
    })
  }

  // 发送监控数据
  sendMetrics(type, data) {
    // 发送到监控服务
    fetch('/api/metrics', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        type,
        data,
        timestamp: Date.now(),
        userAgent: navigator.userAgent
      })
    }).catch(err => {
      console.error('Failed to send metrics:', err)
    })
  }
}

export default new PerformanceMonitor()

错误监控

javascript
// src/utils/errorHandler.js
class ErrorHandler {
  constructor() {
    this.setupGlobalErrorHandling()
  }

  setupGlobalErrorHandling() {
    // JavaScript错误监控
    window.addEventListener('error', (event) => {
      this.handleError({
        type: 'javascript',
        message: event.message,
        filename: event.filename,
        lineno: event.lineno,
        colno: event.colno,
        stack: event.error?.stack
      })
    })

    // Promise错误监控
    window.addEventListener('unhandledrejection', (event) => {
      this.handleError({
        type: 'promise',
        message: event.reason?.message || 'Unhandled Promise Rejection',
        stack: event.reason?.stack
      })
    })

    // Vue错误监控
    app.config.errorHandler = (err, vm, info) => {
      this.handleError({
        type: 'vue',
        message: err.message,
        stack: err.stack,
        component: vm?.$options.name,
        info
      })
    }
  }

  handleError(error) {
    console.error('Application Error:', error)
    
    // 发送错误报告
    this.reportError(error)
    
    // 用户友好的错误提示
    this.showUserNotification(error)
  }

  reportError(error) {
    fetch('/api/errors', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        ...error,
        timestamp: Date.now(),
        url: window.location.href,
        userAgent: navigator.userAgent
      })
    }).catch(err => {
      console.error('Failed to report error:', err)
    })
  }

  showUserNotification(error) {
    if (error.type === 'javascript' || error.type === 'vue') {
      // 显示用户友好的错误消息
      this.showToast('系统出现错误,请刷新页面重试')
    }
  }

  showToast(message) {
    // 实现toast提示
    const toast = document.createElement('div')
    toast.className = 'error-toast'
    toast.textContent = message
    document.body.appendChild(toast)
    
    setTimeout(() => {
      document.body.removeChild(toast)
    }, 3000)
  }
}

export default new ErrorHandler()

要点回顾

关键要点

  1. 需求分析:明确用户需求,制定详细的需求文档
  2. 技术选型:基于项目特点选择合适的技术栈
  3. 开发流程:建立高效的开发工作流程
  4. 测试策略:构建完整的测试体系确保质量
  5. 部署策略:实现自动化部署和监控

最佳实践

  1. 迭代开发:采用敏捷开发方法,快速迭代
  2. 质量保证:建立完善的质量保证体系
  3. 自动化:尽可能自动化重复性工作
  4. 监控运维:建立完善的监控和运维机制

拓展学习资源

项目管理工具

部署平台

监控工具

常见问题解答

Q1:如何平衡功能需求和技术债务?

A1:建立需求优先级矩阵,定期评估技术债务,在每个迭代中分配时间处理技术债务。

Q2:如何选择合适的技术栈?

A2:基于项目规模、团队技能、时间预算和长期维护考虑,使用技术评估矩阵进行综合评估。

Q3:如何确保代码质量?

A3:建立代码评审流程,使用自动化工具检查,编写完整的测试用例,定期重构代码。

Q4:如何处理项目延期?

A4:及时识别风险,调整项目范围,重新评估时间计划,与相关方沟通并制定应对方案。

Q5:如何实现零宕机部署?

A5:使用蓝绿部署或滚动部署策略,建立健康检查机制,准备快速回滚方案。


本文档是HTML5学习小册的一部分,更多内容请查看其他章节。