介紹:
React 徹底改變了我們建立使用者介面的方式,但能力越大,責任越大。當我們在 2024 年應對不斷變化的 React 開發格局時,了解最佳實踐和常見陷阱至關重要。在這份綜合指南中,我們將深入探討開發人員在啟動新的 React 專案時常犯的五個嚴重錯誤。透過理解並避免這些錯誤,您將為成功做好準備,編寫更清晰的程式碼,並建立更有效率、可維護的 React 應用程式。
1. 僅依賴 Create React App (CRA),而不探索現代替代方案
Create React App (CRA) 多年來一直是快速設定 React 專案的首選工具。雖然它仍然是一個可行的選擇,但盲目地使用 CRA 而不考慮替代方案可能意味著錯過顯著的效能改進和開發人員體驗增強。
為什麼 CRA 可能不是 2024 年的最佳選擇:
與新工具相比,建置時間更慢
不彈出配置彈性較差
潛在的過時依賴項
需要考慮的現代替代方案:
Vite:提供閃電般的熱模組更換和建造時間
Next.js:提供伺服器端渲染和出色的開發者體驗
Remix:一個專注於 Web 標準和效能的全端 React 框架
如何選擇:
評估您的專案需求(SSR、靜態網站產生等)
考慮您的團隊對不同工具的熟悉程度
評估每個選項的社區支持和生態系統
專業提示:嘗試使用不同的工具建立小專案,以了解其工作流程和效能特徵。
2. 不必要地在每個文件中匯入 React
自 React 17 以來,JSX 轉換已更新,無需在每個使用 JSX 的檔案中匯入 React。此變更可能看起來很小,但它可能會對程式碼庫的整潔性和可維護性產生重大影響。
跳過不必要的 React 導入的好處:
減少樣板程式碼
更乾淨的文件頭
稍微改進了捆綁包大小
之前(React 17 之前):
import React from 'react';
function MyComponent() {
return <div>Hello, World!</div>;
}
之後(React 17+):
function MyComponent() {
return <div>Hello, World!</div>;
}
重要提示:如果您使用 useState 或 useEffect 等 React 方法,您仍然需要明確匯入它們:
import { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
// ...
}
3. 堅持使用 PropTypes 而不是擁抱 TypeScript
PropTypes 為 React 開發人員提供了很好的類型檢查服務,但隨著專案變得越來越複雜,TypeScript 提供了更強大的解決方案來確保類型安全並改善整體開發體驗。
為什麼 TypeScript 勝過 PropTypes:
在編譯時而不是執行時捕獲錯誤
透過更好的自動完成和重構工具改進了 IDE 支持
自記錄程式碼更易於理解和維護
讓我們來比較一下 PropTypes 和 TypeScript:
使用 PropTypes:
import PropTypes from 'prop-types';
function UserProfile({ name, age, email }) {
return (
<div>
<h1>{name}</h1>
<p>Age: {age}</p>
<p>Email: {email}</p>
</div>
);
}
UserProfile.propTypes = {
name: PropTypes.string.isRequired,
age: PropTypes.number,
email: PropTypes.string
};
使用打字稿:
interface UserProfileProps {
name: string;
age?: number;
email?: string;
}
function UserProfile({ name, age, email }: UserProfileProps) {
return (
<div>
<h1>{name}</h1>
<p>Age: {age}</p>
<p>Email: {email}</p>
</div>
);
}
TypeScript 版本不僅提供更好的類型檢查,而且還可以作為元件屬性的清晰文件。
遷移提示:如果您正在處理現有專案,則可以透過將檔案重新命名為 .tsx 並逐步新增類型註解來逐步採用 TypeScript。
4. 使用defaultProps作為預設值而不是ES6解構
defaultProps 模式已在 React 中廣泛使用,但隨著功能元件和 ES6 功能的出現,有一種更簡潔的方式來為 props 提供預設值。
為什麼首選 ES6 解構:
將所有與 prop 相關的邏輯保留在一處
更直觀並符合現代 JavaScript 實踐
與功能元件和類別元件無縫協作
讓我們比較一下這些方法:
使用預設屬性:
function Button({ text, color }) {
return <button style={{ color }}>{text}</button>;
}
Button.defaultProps = {
text: 'Click me',
color: 'blue'
};
使用 ES6 解構:
function Button({ text = 'Click me', color = 'blue' }) {
return <button style={{ color }}>{text}</button>;
}
ES6 的解構方式更簡潔,將所有元件的 prop 邏輯集中在一起,一目了然。
進階提示:您可以將其與 TypeScript 結合使用,以實現更好的道具管理:
interface ButtonProps {
text?: string;
color?: string;
}
function Button({ text = 'Click me', color = 'blue' }: ButtonProps) {
return <button style={{ color }}>{text}</button>;
}
5. 選擇類別元件而不是功能元件和鉤子
雖然類別元件多年來一直是 React 的基本組成部分,但功能元件與鉤子相結合已成為 2024 年編寫 React 程式碼的首選模式。
功能元件和鉤子的優點:
文法更簡單,更容易閱讀
由於開銷減少,在某些情況下性能更好
更容易跨元件測試和重複使用邏輯
更符合現代 JavaScript 實踐
讓我們用鉤子將類別元件重構為功能元件:
類別元件:
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
componentDidMount() {
document.title = `Count: ${this.state.count}`;
}
componentDidUpdate() {
document.title = `Count: ${this.state.count}`;
}
increment = () => {
this.setState(prevState => ({ count: prevState.count + 1 }));
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.increment}>Increment</button>
</div>
);
}
}
帶鉤子的功能元件:
import { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
const increment = () => setCount(prevCount => prevCount + 1);
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
功能元件版本更簡潔、更容易理解,並使用現代 React 模式,如 useState 和 useEffect 鉤子。
獎勵:定制掛鉤
鉤子最強大的功能之一是能夠建立自訂鉤子來封裝和重複使用狀態邏輯。以下是如何將計數器邏輯提取到自訂掛鉤中的範例:
function useCounter(initialCount = 0) {
const [count, setCount] = useState(initialCount);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
const increment = () => setCount(prevCount => prevCount + 1);
return { count, increment };
}
function Counter() {
const { count, increment } = useCounter();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
這種方法可讓您輕鬆地跨多個元件重複使用計數器邏輯。
結論:
正如我們已經探討了在 2024 年啟動新的 React 專案時要避免的這五個關鍵錯誤,很明顯,與現代實踐保持同步對於編寫高效、可維護和令人愉悅的 React 程式碼至關重要。透過選擇正確的專案設定工具、採用 TypeScript、利用 ES6 功能以及採用帶鉤子的功能元件,您將有能力應對現代 React 開發的挑戰。
請記住,React 生態系統不斷發展,因此請養成隨時了解新工具、技術和最佳實踐的習慣。嘗試不同的方法,為開源專案做出貢獻,並與 React 社群互動以不斷提高您的技能。
透過避免這些常見的陷阱並採用現代 React 開發實踐,您不僅可以編寫更好的程式碼,而且還可以享受更有效率、更令人滿意的開發體驗。祝您編碼愉快,願您的 React 專案成為乾淨、高效且強大的 Web 應用程式的證明!