網(wǎng)站成立時(shí)間查詢抖音關(guān)鍵詞搜索指數(shù)
Day 1 開發(fā)文檔:項(xiàng)目初始化與基礎(chǔ)架構(gòu)搭建
一、項(xiàng)目初始化
1. 創(chuàng)建項(xiàng)目
首先,我們使用 Vite 創(chuàng)建一個(gè)基于 Vue 3 的項(xiàng)目:
# 創(chuàng)建項(xiàng)目
npm create vite@latest my-blog -- --template vue
# 這條命令會(huì)創(chuàng)建一個(gè)名為 my-blog 的新項(xiàng)目,使用 Vue 3 模板# 進(jìn)入項(xiàng)目目錄
cd my-blog# 安裝項(xiàng)目依賴
npm install
2. 安裝必要依賴
接下來(lái),我們需要安裝項(xiàng)目所需的核心依賴:
# 安裝核心依賴
npm install vue-router@4 vuex@4 axios marked dompurify
# vue-router@4: Vue 3 的路由管理器,用于處理頁(yè)面導(dǎo)航
# vuex@4: Vue 3 的狀態(tài)管理庫(kù),用于管理全局狀態(tài)
# axios: HTTP 請(qǐng)求庫(kù),用于與后端 API 通信
# marked: Markdown 解析器,用于解析文章內(nèi)容
# dompurify: HTML 凈化庫(kù),用于防止 XSS 攻擊# 安裝開發(fā)依賴
npm install -D sass @types/node
# sass: CSS 預(yù)處理器,提供更強(qiáng)大的樣式編寫功能
# @types/node: Node.js 的 TypeScript 類型定義
3. 項(xiàng)目結(jié)構(gòu)規(guī)劃
創(chuàng)建以下目錄結(jié)構(gòu),每個(gè)目錄都有其特定用途:
blog-website/
├── src/
│ ├── components/ # 公共組件目錄
│ │ ├── TheHeader.vue # 網(wǎng)站頭部導(dǎo)航
│ │ ├── ScrollProgress.vue # 滾動(dòng)進(jìn)度條
│ │ ├── BlogCard.vue # 博客卡片
│ │ └── TheFooter.vue # 網(wǎng)站底部
│ ├── views/ # 頁(yè)面組件目錄
│ │ ├── HomeView.vue # 首頁(yè)
│ │ └── BlogView.vue # 博客列表頁(yè)
│ ├── router/ # 路由配置目錄
│ │ └── index.js # 路由配置文件
│ ├── store/ # 狀態(tài)管理目錄
│ │ └── index.js # Vuex 配置文件
│ ├── api/ # API 接口目錄
│ │ └── blog.js # 博客相關(guān)接口
│ └── assets/ # 靜態(tài)資源目錄
│ └── styles/ # 樣式文件目錄
│ ├── main.css # 主樣式文件
│ └── responsive.css # 響應(yīng)式樣式
├── index.html # 入口 HTML 文件
└── package.json # 項(xiàng)目配置文件
二、基礎(chǔ)組件開發(fā)
1. 響應(yīng)式導(dǎo)航欄組件
[文件位置: src/components/TheHeader.vue]
TheHeader.vue 組件說(shuō)明:
1. 功能:實(shí)現(xiàn)響應(yīng)式導(dǎo)航欄
2. 主要特點(diǎn):- 自適應(yīng)布局:在不同屏幕尺寸下自動(dòng)調(diào)整顯��方式- 移動(dòng)端菜單:在小屏幕設(shè)備上顯示漢堡菜單按鈕- 動(dòng)態(tài)交互:菜單展開/收起動(dòng)畫,滾動(dòng)時(shí)自動(dòng)隱藏/顯示
3. 核心實(shí)現(xiàn):- 使用 Vue 3 組合式 API- 響應(yīng)式狀態(tài)管理- CSS 過(guò)渡動(dòng)畫
<template><header class="header" :class="{ 'header-hidden': isHeaderHidden }"><div class="container"><nav class="nav"><!-- Logo 區(qū)域 --><router-link to="/" class="logo"><h1>? My Blog ?</h1></router-link><!-- 移動(dòng)端菜單按鈕 --><div class="menu-toggle" @click="toggleMenu"><i class="fas fa-bars"></i></div><!-- 導(dǎo)航鏈接 --><ul class="nav-links" :class="{ active: isMenuOpen }"><li v-for="item in menuItems" :key="item.path"><router-link :to="item.path" @click="closeMenu"active-class="active"><i :class="item.icon"></i>{{ item.name }}</router-link></li></ul></nav></div></header>
</template><script setup>
import { ref } from 'vue'// 控制菜單顯示狀態(tài)
const isMenuOpen = ref(false)
// 控制導(dǎo)航欄顯示/隱藏
const isHeaderHidden = ref(false)// 導(dǎo)航菜單項(xiàng)配置
const menuItems = [{ path: '/', name: '首頁(yè)', icon: 'fas fa-home' },{ path: '/blog', name: '博客', icon: 'fas fa-cloud' }
]// 切換菜單顯示狀態(tài)
const toggleMenu = () => {isMenuOpen.value = !isMenuOpen.value
}// 關(guān)閉菜單
const closeMenu = () => {isMenuOpen.value = false
}
</script>
2. 滾動(dòng)進(jìn)度條組件
[文件位置: src/components/ScrollProgress.vue]
ScrollProgress.vue 組件說(shuō)明:
1. 功能:顯示頁(yè)面閱讀進(jìn)度
2. 主要特點(diǎn):- 實(shí)時(shí)進(jìn)度更新:隨頁(yè)面滾動(dòng)實(shí)時(shí)計(jì)算和顯示進(jìn)度- 平滑動(dòng)畫:使用 CSS 過(guò)渡實(shí)現(xiàn)流暢的進(jìn)度更新- 性能優(yōu)化:使用節(jié)流函數(shù)優(yōu)化滾動(dòng)事件處理
3. 核心實(shí)現(xiàn):- 滾動(dòng)事件監(jiān)聽- 進(jìn)度計(jì)算邏輯- 組件生命周期管理
<template><div class="scroll-progress" :style="{ width: progress + '%' }"></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue'// 存儲(chǔ)滾動(dòng)進(jìn)度
const progress = ref(0)// 更新滾動(dòng)進(jìn)度
const updateProgress = () => {// 計(jì)算頁(yè)面總高度(減去視口高度)const windowHeight = document.documentElement.scrollHeight - window.innerHeight// 計(jì)算滾動(dòng)百分比const scrolled = (window.scrollY / windowHeight) * 100progress.value = scrolled
}// 組件掛載時(shí)添加滾動(dòng)監(jiān)聽
onMounted(() => {window.addEventListener('scroll', updateProgress)
})// 組件卸載時(shí)移除監(jiān)聽,防止內(nèi)存泄漏
onUnmounted(() => {window.removeEventListener('scroll', updateProgress)
})
</script>
3. 博客卡片組件
[文件位置: src/components/BlogCard.vue]
BlogCard.vue 組件說(shuō)明:
1. 功能:展示博客文章預(yù)覽卡片
2. 主要特點(diǎn):- 響應(yīng)式布局:適應(yīng)不同屏幕尺寸- 圖片處理:懶加載和錯(cuò)誤處理- 內(nèi)容格式化:日期和摘要的智能處理
3. 核心實(shí)現(xiàn):- 圖片懶加載- Markdown 解析- XSS 防護(hù)- 路由導(dǎo)航
<template><div class="blog-card" @click="handleClick"><!-- 文章封面圖片 --><div class="card-image"><img :src="post.image || '/images/placeholder.jpg'" :alt="post.title"@error="handleImageError"></div><!-- 文章內(nèi)容預(yù)覽 --><div class="card-content"><h3 class="card-title">{{ post.title }}</h3><p class="card-excerpt">{{ formatExcerpt(post.excerpt) }}</p><!-- 文章元信息 --><div class="card-meta"><span class="date"><i class="far fa-calendar-alt"></i>{{ formatDate(post.date) }}</span><span class="category"><i class="fas fa-folder"></i>{{ post.category }}</span></div></div></div>
</template><script setup>
import { ref } from 'vue'
import { marked } from 'marked'
import DOMPurify from 'dompurify'
import { useRouter } from 'vue-router'// 定義組件屬性
const props = defineProps({post: {type: Object,required: true}
})const router = useRouter()// 處理卡片點(diǎn)擊,跳轉(zhuǎn)到文章詳情
const handleClick = () => {const id = props.post?.idif (!id) returnrouter.push(`/blog/${id}`)
}// 格式化文章摘要,去除 HTML 標(biāo)簽限制長(zhǎng)度
const formatExcerpt = (excerpt) => {if (!excerpt) return ''const html = DOMPurify.sanitize(marked(excerpt))const div = document.createElement('div')div.innerHTML = htmllet text = div.textContent || div.innerText || ''return text.length > 200 ? text.slice(0, 200) + '...' : text
}// 格式化日期顯示
const formatDate = (date) => {return new Date(date).toLocaleDateString('zh-CN')
}// 處理圖片加載失敗
const handleImageError = (e) => {e.target.src = '/images/placeholder.jpg'
}
</script>
三、路由配置
1. 基礎(chǔ)路由設(shè)置
[文件位置: src/router/index.js]
配置頁(yè)面路由和導(dǎo)航規(guī)則:
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '@/views/HomeView.vue'
import BlogView from '@/views/BlogView.vue'const routes = [{path: '/',name: 'home',component: HomeView,meta: {title: '首頁(yè)'}},{path: '/blog',name: 'blog',component: BlogView,meta: {title: '博客'}}
]const router = createRouter({history: createWebHistory(),routes,scrollBehavior(to, from, savedPosition) {// 頁(yè)面切換時(shí)滾動(dòng)到頂部return { top: 0 }}
})export default router
路由配置說(shuō)明:
1. 功能:實(shí)現(xiàn)頁(yè)面導(dǎo)航和路由控制
2. 主要特點(diǎn):- 歷史模式:使用 HTML5 History API- 路由懶加載:優(yōu)化首屏加載時(shí)間- 滾動(dòng)行為:自動(dòng)滾動(dòng)到頁(yè)面頂部
3. 核心實(shí)現(xiàn):- 路由注冊(cè)- 導(dǎo)航守衛(wèi)- 滾動(dòng)控制
3. 懶加載優(yōu)化
[文件位置: src/router/index.js, src/components/BlogCard.vue, src/App.vue]
為了提升性能,我們?cè)谝韵聨讉€(gè)方面實(shí)現(xiàn)了懶加載:
- 路由懶加載
// [文件位置: src/router/index.js]
const routes = [{path: '/',name: 'home',component: () => import('@/views/HomeView.vue') // 懶加載首頁(yè)},{path: '/blog',name: 'blog',component: () => import('@/views/BlogView.vue') // 懶加載博客頁(yè)}
]
- 圖片懶加載
// [文件位置: src/components/BlogCard.vue]
<template><div class="blog-card"><div class="card-image"><img :src="post.image || '/images/placeholder.jpg'" :alt="post.title"loading="lazy" // 使用瀏覽器原生懶加載@error="handleImageError"></div></div>
</template>
- 組件懶加載
// [文件位置: src/App.vue]
<script setup>
import { defineAsyncComponent } from 'vue'// 懶加載非關(guān)鍵組件
const TheFooter = defineAsyncComponent(() => import('./components/TheFooter.vue')
)// 帶加載狀態(tài)的懶加載組件
const BlogEditor = defineAsyncComponent({loader: () => import('./components/BlogEditor.vue'),loadingComponent: LoadingSpinner,delay: 200,timeout: 3000
})
</script>
- 懶加載效果
- 首屏加載時(shí)間優(yōu)化:只加載必要的組件
- 圖片加載優(yōu)化:減少首屏請(qǐng)求數(shù)量
- 路由切換優(yōu)化:按需加載頁(yè)面組件
- 內(nèi)存使用優(yōu)化:減少初始化時(shí)的內(nèi)存占用
四、狀態(tài)管理
1. Vuex Store 配置
[文件位置: src/store/index.js]
配置全局狀態(tài)管理:
import { createStore } from 'vuex'
import { blogApi } from '@/api/blog'export default createStore({// 狀態(tài)定義state: {posts: [], // 文章列表loading: false, // 加載狀態(tài)error: null // 錯(cuò)誤信息},// 修改狀態(tài)的方法mutations: {SET_POSTS(state, posts) {state.posts = posts},SET_LOADING(state, loading) {state.loading = loading},SET_ERROR(state, error) {state.error = error}},// 異步操作actions: {// 獲取文章列表async fetchPosts({ commit }) {try {commit('SET_LOADING', true)const { data } = await blogApi.getPosts()commit('SET_POSTS', data)return data} catch (err) {commit('SET_ERROR', err.message)throw err} finally {commit('SET_LOADING', false)}}}
})
Vuex Store 配置說(shuō)明:
1. 功能:全局狀態(tài)管理
2. 主要特點(diǎn):- 集中管理數(shù)據(jù)- 異步操作處理- 狀態(tài)追蹤
3. 核心實(shí)現(xiàn):- 狀態(tài)定義- 同步修改- 異步操作
五、樣式系統(tǒng)
1. 全局主題變量
[文件位置: src/assets/styles/main.css]
定義全局樣式變量,確保設(shè)計(jì)的一致性:
:root {/* 顏色系統(tǒng) - 定義網(wǎng)站配色方案 */--color-primary: #3498db; /* 主要顏色 */--color-secondary: #2ecc71; /* 次要顏色 */--color-text: #2c3e50; /* 文本顏色 */--color-background: #ffffff; /* 背景顏色 */--color-border: #e0e0e0; /* 邊框顏色 *//* 字體系統(tǒng) - 定義文字樣式 */--font-family: 'Inter', system-ui, sans-serif;--font-size-base: 16px; /* 基礎(chǔ)字號(hào) */--font-size-lg: 18px; /* 大號(hào)字體 */--font-size-xl: 24px; /* 特大號(hào)字體 *//* 間距系統(tǒng) - 統(tǒng)一間距標(biāo)準(zhǔn) */--spacing-xs: 4px; /* 超小間距 */--spacing-sm: 8px; /* 小間距 */--spacing-md: 16px; /* 中等間距 */--spacing-lg: 24px; /* 大間距 */--spacing-xl: 32px; /* 特大間距 *//* 圓角 - 統(tǒng)一圓角大小 */--border-radius: 8px;--border-radius-lg: 12px;/* 陰影 - 統(tǒng)一陰影效果 */--shadow-sm: 0 1px 3px rgba(0,0,0,0.12);--shadow-md: 0 4px 6px rgba(0,0,0,0.1);--shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
}
2. 響應(yīng)式布局
[文件位置: src/assets/styles/responsive.css]
實(shí)現(xiàn)移動(dòng)端優(yōu)先的響應(yīng)式設(shè)計(jì):
/* 移動(dòng)端優(yōu)先的響應(yīng)式設(shè)計(jì) */
.container {width: 100%;padding: 0 var(--spacing-md);margin: 0 auto;
}/* 平板設(shè)備斷點(diǎn) (>= 768px) */
@media (min-width: 768px) {.container {max-width: 720px; /* 限制容器最大寬度 */}.header__nav {display: flex; /* 顯示導(dǎo)航菜單 */}.header__toggle {display: none; /* 隱藏菜單按鈕 */}
}/* 桌面設(shè)備斷點(diǎn) (>= 1024px) */
@media (min-width: 1024px) {.container {max-width: 960px;}.posts-grid {grid-template-columns: repeat(3, 1fr); /* 三列布局 */}
}/* 大屏設(shè)備斷點(diǎn) (>= 1280px) */
@media (min-width: 1280px) {.container {max-width: 1200px;}
}
樣式系統(tǒng)說(shuō)明:
1. 功能:統(tǒng)一的設(shè)計(jì)系統(tǒng)
2. 主要特點(diǎn):- 主題變量:統(tǒng)一的顏色和尺寸- 響應(yīng)式設(shè)計(jì):適配不同設(shè)備- 組件樣式:模塊化的樣式管理
3. 核心實(shí)現(xiàn):- CSS 變量系統(tǒng)- 媒體查詢- 布局系統(tǒng)
六、第一天完成的功能
-
項(xiàng)目初始化
- 使用 Vite 創(chuàng)建 Vue 3 項(xiàng)目
- 安裝必要的依賴包
- 規(guī)劃項(xiàng)目目錄結(jié)構(gòu)
-
基礎(chǔ)組件開發(fā)
- 響應(yīng)式導(dǎo)航欄(TheHeader)
- 網(wǎng)站標(biāo)題和 Logo
- 響應(yīng)式菜單
- 移動(dòng)端適配
- 滾動(dòng)進(jìn)度條(ScrollProgress)
- 實(shí)時(shí)顯示閱讀進(jìn)度
- 平滑動(dòng)畫效果
- 博客卡片(BlogCard)
- 文章預(yù)覽展示
- 圖片加載優(yōu)化
- 響應(yīng)式布局
- 響應(yīng)式導(dǎo)航欄(TheHeader)
-
路由配置
- 設(shè)置基礎(chǔ)路由(首頁(yè)、博客列表)
- 配置路由歷史模式
- 添加滾動(dòng)行為控制
-
狀態(tài)管理
- 配置 Vuex store
- 實(shí)現(xiàn)文章數(shù)據(jù)管理
- 添加加載狀態(tài)控制
-
樣式系統(tǒng)
- 定義全局主題變量
- 實(shí)現(xiàn)響應(yīng)式布局
- 設(shè)置統(tǒng)一的設(shè)計(jì)標(biāo)準(zhǔn)