1. 项目概述:打造专业级前端作品集
前端作品集是开发者展示技术实力的最佳名片。这个实战项目将带你从零开始构建一个现代化、响应式的个人作品集网站,涵盖从项目架构到部署上线的完整流程。不同于简单的静态页面,我们将采用Vue3+TypeScript技术栈,集成单元测试、性能优化和CI/CD等工程化实践,打造一个真正能体现专业水准的作品集。
作品集的核心价值在于"展示"与"互动"的结合。我们不仅要呈现项目案例,还要通过精心设计的交互体验让访客直观感受你的技术能力。比如添加3D模型展示、动画效果、暗黑模式切换等细节,这些都能显著提升作品集的竞争力。
2. 技术选型与架构设计
2.1 基础技术栈选择
Vue3 + TypeScript的组合是目前企业级前端开发的主流选择:
- Composition API提供更好的逻辑复用
- TypeScript类型系统减少运行时错误
- 更好的IDE支持提升开发效率
# 项目初始化命令 npm init vue@latest my-portfolio -- --typescript2.2 样式方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CSS Modules | 天然隔离作用域 | 动态样式较麻烦 | 组件化程度高的项目 |
| TailwindCSS | 开发效率高 | 学习曲线陡峭 | 快速原型开发 |
| Sass/Less | 功能强大 | 需要配置预处理 | 传统项目迁移 |
我们选择Sass+CSS Modules的组合,既保持灵活性又确保样式隔离:
// 示例:带主题色的按钮组件 .button { &--primary { background: var(--primary-color); &:hover { background: lighten(var(--primary-color), 10%); } } }2.3 项目目录结构设计
专业级的目录结构应该遵循功能分组原则:
src/ ├── assets/ # 静态资源 ├── components/ # 通用组件 ├── composables/ # 组合式函数 ├── layouts/ # 页面布局 ├── pages/ # 路由页面 ├── stores/ # 状态管理 ├── styles/ # 全局样式 ├── utils/ # 工具函数 └── main.ts # 应用入口提示:使用
unplugin-auto-import可以自动导入Vue API,减少样板代码
3. 核心功能实现
3.1 响应式布局方案
采用移动优先的响应式策略,使用CSS Grid和Flexbox实现:
.project-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 2rem; } @media (max-width: 768px) { .project-grid { grid-template-columns: 1fr; } }3.2 项目展示组件
实现带3D翻转效果的卡片组件:
<template> <div class="project-card" @mouseenter="isHover = true"> <div class="card-inner" :class="{ 'is-flipped': isHover }"> <div class="card-front"> <img :src="project.cover" alt="项目封面"> </div> <div class="card-back"> <h3>{{ project.title }}</h3> <p>{{ project.description }}</p> <button @click="visitDemo">查看演示</button> </div> </div> </div> </template> <script setup> const props = defineProps({ project: Object }) const isHover = ref(false) </script>3.3 动态主题切换
使用CSS变量实现主题系统:
// theme.ts export const themes = { light: { '--primary-color': '#4f46e5', '--bg-color': '#ffffff' }, dark: { '--primary-color': '#a78bfa', '--bg-color': '#1a1a1a' } } export function applyTheme(themeName: keyof typeof themes) { const theme = themes[themeName] Object.entries(theme).forEach(([key, value]) => { document.documentElement.style.setProperty(key, value) }) }4. 性能优化实践
4.1 图片懒加载与优化
使用Intersection Observer API实现懒加载:
const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target as HTMLImageElement img.src = img.dataset.src! observer.unobserve(img) } }) }) onMounted(() => { document.querySelectorAll('.lazy-img').forEach(img => { observer.observe(img) }) })4.2 代码分割与预加载
配置Vue Router的懒加载路由:
const routes = [ { path: '/projects/:id', component: () => import(/* webpackPrefetch: true */ '@/views/ProjectDetail.vue') } ]4.3 关键指标优化目标
| 指标 | 优秀值 | 实现方法 |
|---|---|---|
| LCP | <2.5s | 预加载关键资源 |
| FID | <100ms | 减少长任务 |
| CLS | <0.1 | 预留图片空间 |
5. 测试与部署
5.1 单元测试配置
使用Vitest+Testing Library编写组件测试:
import { render, screen } from '@testing-library/vue' import ProjectCard from '../ProjectCard.vue' describe('ProjectCard', () => { it('显示项目标题', async () => { const project = { title: '测试项目' } render(ProjectCard, { props: { project } }) await screen.findByText('测试项目') }) })5.2 CI/CD流水线
GitHub Actions配置示例:
name: Deploy on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: npm ci - run: npm run build - uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist6. 常见问题与解决方案
6.1 字体闪烁问题
解决方案:使用font-display: swap并预加载字体
<link rel="preload" href="/fonts/Inter.woff2" as="font" type="font/woff2" crossorigin>6.2 移动端点击延迟
解决方案:引入fastclick库或使用touch事件
import FastClick from 'fastclick' FastClick.attach(document.body)6.3 SEO优化方案
- 使用vue-meta管理meta标签
- 预渲染关键页面
- 添加规范的JSON-LD结构化数据
7. 进阶功能扩展
7.1 添加博客系统
集成Markdown解析:
// 使用marked解析Markdown import { marked } from 'marked' const html = marked(markdownText)7.2 访问统计
使用Plausible实现隐私友好的统计:
<script defer><template> <form @submit.prevent="submit"> <input v-model="form.email" type="email" required> <button type="submit">发送</button> </form> </template> <script setup> const form = reactive({ email: '' }) async function submit() { await fetch('https://formspree.io/f/your-form-id', { method: 'POST', body: JSON.stringify(form), headers: { 'Accept': 'application/json' } }) } </script>在开发过程中,我发现合理使用Web Worker处理复杂计算能显著提升页面响应速度。比如当作品集需要处理大量3D模型数据时,可以将其移入Worker线程避免阻塞UI。