一、前端項目常見模塊及功能(以 Vue/React 通用結構為例)
前端項目的模塊本質是「按功能拆分的代碼文件/文件夾」,就像蓋房子的「磚、梁、窗」各司其職:
模塊類型 | 功能說明(大白話) | 舉個例子 |
---|---|---|
pages(頁面) | 對應瀏覽器里能看到的完整頁面(如首頁、詳情頁) | HomePage.vue (首頁)、DetailPage.jsx (詳情頁) |
components(組件) | 可復用的「小零件」(按鈕、卡片、彈窗等),用來拼頁面 | Button.vue (按鈕)、Card.jsx (卡片) |
api(接口) | 專門和后端交互的代碼(發請求、拿數據) | userApi.js (用戶相關接口:登錄、獲取信息) |
utils(工具) | 通用功能代碼(格式化時間、處理數據、判斷設備等) | formatTime.js (把時間戳轉成「2024-07-25」) |
store(狀態) | 存全局數據的「共享倉庫」(如用戶登錄信息、購物車數據) | Vue 用 Vuex/Pinia,React 用 Redux/Zustand |
router(路由) | 控制頁面跳轉(比如點擊「首頁」跳轉到 /home ) | 定義 /home 對應 HomePage 頁面 |
二、模塊之間的關系:誰依賴誰?
模塊間的關系就像「組裝機器」—— 大零件依賴小零件,小零件可能依賴更小的零件:
-
pages 依賴 components
頁面是「大容器」,需要用組件拼起來。比如HomePage
可能包含Banner
組件(頂部輪播)、ProductList
組件(商品列表)。 -
pages/components 依賴 api
頁面/組件要顯示數據(如商品列表),得通過 api 模塊向后端要數據。比如ProductList
組件會調用productApi.getList()
拿商品數據。 -
pages/components 依賴 utils
拿到數據后可能需要處理(比如時間戳轉成正常時間),就會調用 utils 里的工具函數。比如formatTime(new Date())
。 -
pages/components 依賴 store
全局共享的數據(如用戶昵稱)存在 store 里,頁面/組件可以直接取來用。比如store.userInfo.nickname
。 -
router 關聯 pages
路由模塊定義「訪問哪個地址顯示哪個頁面」,比如router
里配置{ path: '/home', component: HomePage }
,就意味著訪問/home
時顯示HomePage
頁面。
三、模塊間怎么調用?(核心:import 引入 + 直接用)
調用本質是「我需要你的功能,就把你引進來用」,和「借工具干活」一樣:
1. 頁面里用組件(pages 調用 components)
<!-- 比如在 HomePage.vue 里用 Card 組件 -->
<template><div class="home"><!-- 直接用引入的組件,就像用 HTML 標簽 --><Card title="推薦商品" /> </div>
</template><script>
// 第一步:從 components 文件夾引入組件
import Card from '../components/Card.vue'; export default {components: { Card } // 第二步:注冊后才能用
};
</script>
2. 組件里調接口(components 調用 api)
// 比如在 UserCard.jsx 組件里拿用戶信息
import { getUserInfo } from '../api/userApi'; // 引入接口函數function UserCard() {// 組件加載時,調用 api 拿數據useEffect(() => {// 直接調用 api 里的函數getUserInfo().then(data => {console.log('拿到用戶數據:', data);});}, []);return <div>用戶信息卡片</div>;
}
3. 接口里用工具函數(api 調用 utils)
// api/userApi.js 里處理請求參數
import { formatParams } from '../utils/format'; // 引入工具函數// 登錄接口
export function login(phone, password) {// 調用工具函數格式化參數(比如給參數加個時間戳)const params = formatParams({ phone, password }); return axios.post('/login', params); // 發請求
}
四、方法內部的調用邏輯(以「用戶登錄」為例串一遍)
拿「用戶點擊登錄按鈕 → 登錄成功 → 顯示用戶信息」這個流程,看代碼是怎么一步步調用的:
-
組件里的方法(觸發點):
LoginButton.vue
組件里的handleLogin
方法(用戶點擊按鈕時執行):import { loginApi } from '../api/userApi'; // 引入登錄接口 import { setToken } from '../utils/auth'; // 引入存 token 的工具methods: {handleLogin() {// 1. 調用 api 里的登錄接口,傳賬號密碼loginApi(this.phone, this.password).then(res => {// 2. 登錄成功后,調用工具函數存 tokensetToken(res.token); // 3. 跳轉到首頁(調用路由方法)this.$router.push('/home'); });} }
-
接口方法(中間層):
api/userApi.js
里的loginApi
方法:import axios from 'axios'; import { showError } from '../utils/alert'; // 引入彈窗工具export function loginApi(phone, password) {return axios.post('/api/login', { phone, password }).catch(err => {// 出錯時調用工具函數顯示錯誤彈窗showError('登錄失敗,請檢查賬號密碼'); }); }
-
工具方法(底層支持):
utils/auth.js
里的setToken
方法(單純存數據):export function setToken(token) {// 把 token 存在瀏覽器本地存儲里localStorage.setItem('token', token); }
總結:快速上手的小技巧
- 先找
pages
文件夾,打開一個頁面文件(比如首頁),看它引入了哪些components
和api
,順著「引入關系」找代碼。 - 遇到不認識的函數,看它的
import
路徑,就能知道來自哪個模塊。 - 從一個簡單功能(比如點擊按鈕)入手,用「斷點調試」一步步跟代碼(瀏覽器 F12 → Sources 面板),看它調用了哪些方法。