什麼是 React?給非工程師的白話指南
React 是一個用來建立使用者介面的 JavaScript 函式庫,也就是人們在應用程式中看到並點擊的部分。你用稱為元件的可重複使用零件來組成畫面,例如一個按鈕、一張商品卡片或整個頁面。React 會讓畫面與你的資料保持同步:資料改變時,React 會更新依賴該資料的頁面部分。它由 Facebook(現在的 Meta)開發,是開放原始碼,也是最廣泛使用的網頁應用程式建構方式之一。
用 AI 建立東西時,為什麼它很重要
如果你用 AI 工具建立網頁應用程式,它很可能是以 React 寫成的。許多 AI 應用程式建構工具預設就使用 React,因為它很受歡迎、文件完善,而且 AI 模型可以學習的 React 程式碼非常多。
你不需要會寫 React 也能用 AI 建立應用程式。但稍微了解一點會幫助你:
- 精準描述修改。 「把 ProductCard 元件的價格改成粗體」比「讓價格在某處更醒目」清楚得多。
- 理解錯誤訊息。 像「Cannot read properties of undefined」或「Too many re-renders」這類訊息會比較容易理解。
- 做出合理的選擇。 純 React 應用程式是在瀏覽器中渲染,這會影響搜尋能見度和首次載入速度。了解這點,有助於你決定何時要求改用不同的架構。
- 日後與開發者合作。 React 是常見的技能,開發者通常能很快接手 React 程式碼。
日常生活中的比喻
想想樂高積木。你不需要從一整塊積木雕刻出完整的模型,而是用標準的積木組合起來。幾塊積木可以做出一個輪子;四個輪子加上其他零件就變成一輛車。如果你希望每輛車的輪子都是紅色,只需要改一次輪子的設計。
React 元件就是這些積木。Button 元件會用在 ProductCard 裡面,ProductCard 又用在 ProductGrid 裡面,而 ProductGrid 是 ShopPage 的一部分。只要修改一次 Button,應用程式中的每一個按鈕都會跟著改變。
比喻的另一半是:想像樂高模型會在你改變說明書時自動重組。這就是 React 的另一個特色:你描述在目前資料下畫面應該長什麼樣子,React 會自行計算頁面上需要改變的部分。
核心概念
元件(Components)
元件就是一個會回傳一段介面的 JavaScript 函式。React 的文件把元件描述為擁有自己的邏輯和外觀的一塊 UI。元件名稱以大寫字母開頭。
JSX
元件通常以 JSX 撰寫,它看起來就像混在 JavaScript 裡的 HTML:
function Greeting() {
return <h1>Welcome back!</h1>;
}
JSX 並非必要,但 React 的文件指出大多數專案都會使用它。它在瀏覽器執行前會被轉換為普通的 JavaScript。
Props
Props 是你傳入元件的輸入值,就像可重複使用零件上的設定:
<ProductCard name="Lavender Candle" price={24} />
同一個 ProductCard 可以顯示任何商品。
State
State 是元件記住的資訊,會在應用程式執行時改變,例如選單是否展開、搜尋框裡輸入了什麼、購物車裡有幾件商品。當 state 改變時,React 會重新渲染該元件,讓畫面與資料一致。
Hooks
Hooks 是名稱以 use 開頭的函式,例如 useState(記住一個值)和 useEffect(在渲染後執行程式碼,例如抓取資料)。你會在 AI 產生的 React 程式碼中到處看到它們。
實例:購物車計數器
假設你的線上商店有一個「加入購物車」按鈕,以及一個顯示商品數量的購物車圖示。在 React 中大致會像這樣:
import { useState } from "react";
function Shop() {
const [cartCount, setCartCount] = useState(0);
return (
<div>
<CartIcon count={cartCount} />
<ProductCard
name="Lavender Candle"
price={24}
onAdd={() => setCartCount(cartCount + 1)}
/>
</div>
);
}
function CartIcon({ count }) {
return <span>Cart ({count})</span>;
}
function ProductCard({ name, price, onAdd }) {
return (
<div>
<h2>{name}</h2>
<p>${price}</p>
<button onClick={onAdd}>Add to cart</button>
</div>
);
}
當顧客點擊「加入購物車」時會發生什麼事:
- 按鈕的
onClick呼叫onAdd,而onAdd再呼叫setCartCount。 - React 把
cartCount這個 state 從 0 更新為 1。 - React 重新渲染
Shop,並將count={1}傳入CartIcon。 - 頁面現在顯示「Cart (1)」。沒有人寫程式去說「找到購物車文字並改掉它」,畫面是跟著資料走的。
但也要注意它的限制。這個數字存在瀏覽器的記憶體中。重新整理頁面後,它會回到 0。要保留購物車,你需要把它存到持久的地方,例如 cookie、瀏覽器儲存空間,或是透過後端存進資料庫。React 負責畫面,它並不會儲存你的資料。
React 在網頁應用程式中的位置
| 組成部分 | 功能 | 常見選擇 |
|---|---|---|
| UI 函式庫 | 建立介面 | React |
| 語言 | 程式碼所使用的語言 | JavaScript 或 TypeScript |
| 建置工具 | 把原始碼轉換為瀏覽器可載入的檔案;執行開發伺服器 | Vite |
| 框架(選用) | 加入路由、伺服器端渲染、資料載入 | Next.js、React Router |
| 樣式 | 外觀呈現 | Tailwind CSS、CSS 檔案 |
| 後端 | 商業邏輯、資料、機密 | Node.js、Python 等 |
| 資料庫 | 儲存資料 | Postgres 等 |
「Vite + React」應用程式是在瀏覽器中渲染(單頁應用程式)。Next.js 應用程式則可以先在伺服器上渲染頁面,有助於搜尋引擎並提升首次載入速度。
常見術語說明
| 術語 | 意思 |
|---|---|
| 元件(Component) | 以函式撰寫、可重複使用的介面零件。 |
| JSX | 在 JavaScript 中使用、類似 HTML 的語法,用來描述元件。 |
| Props | 傳入元件的輸入值。 |
| State | 元件記住、且會隨時間改變的資料。 |
| Hook | 以 use 開頭的函式,可為元件加入 state 等功能。 |
| 渲染/重新渲染(Render / re-render) | React 在變更後再次計算畫面應該顯示什麼。 |
| 單頁應用程式(SPA) | 只載入一次,之後以 JavaScript 更新頁面、而不是載入新頁面的應用程式。 |
| 伺服器端渲染(SSR) | 在傳送之前,先於伺服器上產生頁面的 HTML。 |
| npm 套件 | 可安裝的可重複使用程式庫,例如日期選擇器或圖表函式庫。 |
| React Native | 用來建立原生行動應用程式的相關專案。 |
常見錯誤與迷思
- 「React 是一種程式語言。」 它是以 JavaScript(或 TypeScript)撰寫並在其中使用的函式庫。
- 「React 會儲存我的資料。」 State 存在瀏覽器中,重新整理就會消失。需要長期保存的資料必須使用後端與資料庫。
- 把機密放進 React 程式碼。 React 應用程式中的所有內容都會傳送到訪客的瀏覽器,放在那裡的 API 金鑰等同公開。請把它們保留在伺服器上。
- 「React 應用程式無法在搜尋中排名。」 僅在客戶端渲染對搜尋較不利,但預先渲染或伺服器端渲染能解決大部分問題。
- 超大型元件。 一個 1,000 行的元件,無論是人還是 AI 都很難安全地修改。請要求拆分成較小的元件。
- 以為 React 網頁應用程式就是手機應用程式。 它在瀏覽器中執行,包括在手機上,但它不是 App Store 的應用程式。
可以向 AI 建構工具要求的事項
- 「把這個頁面拆分成小型且有名稱的元件,並告訴我每個元件位於哪個檔案。」
- 「讓 ProductCard 元件可以重複使用,並以 name、price 和 image 作為 props。」
- 「把購物車儲存到資料庫,讓它在重新整理後仍然保留。」
- 「所有 API 金鑰都保留在伺服器上;React 程式碼應該呼叫我們自己的 API。」
- 「為來自伺服器的資料加入載入中與錯誤狀態。」
- 「如果這些頁面的搜尋能見度很重要,請預先渲染它們,或使用伺服器端渲染的架構。」
- 「用白話文解釋這個錯誤的意思,以及它來自哪個元件。」
若要了解更全面的架構,請參閱前端與後端;若要檢視 AI 寫出的程式碼,請參閱如何檢視 AI 產生的程式碼。
Mythex 中的 React
除非你另外指定,Mythex 會以 Vite + React + TypeScript + Tailwind 開始新專案,並在你聊天時執行即時預覽。你可以在第一則提示詞中指定其他架構,例如「使用 Next.js」或「單純的靜態 HTML 登陸頁」,Mythex 會根據你的描述來選擇;目前沒有相關的設定畫面。技術選擇方式的文件頁面說明了各種選項。程式碼編輯器在免費方案中為唯讀;在 Pro 方案中,你可以直接編輯 React 程式碼,並將專案匯出,在其他地方繼續開發。
常見問題
簡單來說,什麼是 React?
React 是一個用來建立使用者介面的 JavaScript 函式庫。你用稱為元件的可重複使用零件來組成畫面,例如一個按鈕、一張商品卡片或整個頁面。當背後的資料改變時,React 會更新畫面上的內容。
React 是框架還是函式庫?
React 自稱是函式庫:它專注於建立介面。建立在它之上的框架,例如 Next.js,則會加入路由、伺服器端渲染和資料載入等功能。
為什麼 AI 應用程式建構工具會使用 React?
React 是最廣泛使用的網頁介面建構方式之一,因此 AI 模型有大量的 React 程式碼和文件可以學習。它的元件結構也適合進行小範圍、精準的修改。
React 對 SEO 不好嗎?
本身並不會。如果 React 應用程式完全在瀏覽器中渲染,有些爬蟲會比較難讀取,但 React 也可以預先渲染(prerender)或在伺服器端渲染,例如使用 Next.js,大部分的問題都能解決。
React 和 React Native 一樣嗎?
不一樣。React 用來建立在瀏覽器中執行的網頁介面。React Native 則沿用相同的概念,來建立原生的 iOS 與 Android 應用程式。兩者共享概念,但大部分的建構元件並不相同。