FE Day 2 環境與工具鏈:Node、pnpm、TypeScript、VS Code
執行需求:CPU 可跑。昨天我們畫完四十五天的地圖,今天要實際動手把環境架起來。一個前端專案能不能順利跑起來,有 80% 決定在環境:有沒有裝對 Node.js、有沒有用對套件管理工具、有沒有把 TypeScript 編譯器設定好、有沒有讓編輯器看懂 .tsx。這一篇會帶你把這四件事一次搞定,後續四十三篇都會站在這個地基上。
引言
後端工程師對「環境」這件事並不陌生:裝 Python、設虛擬環境、裝框架、寫 requirements.txt、設 IDE。Node.js 的世界也有一套類似的流程,但因為生態圈更新速度快、工具鏈更碎片,剛轉過來的工程師很容易卡在「裝了但跑不起來」或「能跑但不知道裝了什麼」。本篇要解決的正是這兩個痛點。
這篇文章會做八件事:第一,解釋 Node.js 與 JavaScript 執行環境的關係;第二,說明為什麼選 pnpm 而不是 npm 或 yarn;第三,示範 TypeScript 5.8/5.9 的安裝與編譯器設定;第四,介紹 VS Code 必裝的擴充套件與設定;第五,給出 ESLint 9 flat config 的最小設定檔;第六,示範怎麼用 Vite 7 建立一個能跑的 React + TypeScript 專案;第七,把 package.json 的 scripts 整理成一份可以照抄的清單;第八,把幾個常見的 .npmrc / .nvmrc / .gitignore 設定一次給齊。整篇讀完大約 30 分鐘,動手做大約 30 分鐘。
Node.js 是什麼?為什麼前端要裝它
Node.js 是一個「讓 JavaScript 跑在作業系統上」的執行環境,2009 年由 Ryan Dahl 開源。它採用 Google V8 引擎,把原本只能在瀏覽器裡跑的 JavaScript 變成可以當作系統工具使用。後端工程師可以把它想成「JavaScript 版的 CPython」:裝了 Node.js 之後,node xxx.js 就等同 python xxx.py,而 npm(Node Package Manager)就等同 pip。
為什麼前端要裝 Node.js?因為前端的「建置流程」(build pipeline)需要 Node 來執行:把 .tsx 編譯成 .js、把多個檔案打包成 bundle、跑開發伺服器、跑測試、跑 lint。這些工作全部都跑在 Node 上;瀏覽器最後拿到的只是一份已經處理好的靜態檔案。所以 Node.js 是「工具」而不是「執行環境」——瀏覽器才是 React 程式碼最終跑起來的地方。
Node.js 的版本有兩條線:Current(每年十月發新版,支援六個月)與 LTS(Long Term Support,長期支援版,支援 30 個月)。本系列鎖定 22 LTS 與 24 LTS:22 LTS 在 2024 年 10 月進入維護期、24 LTS 在 2025 年 10 月成為 Active LTS。兩個版本對本系列用到的 API 都足夠。
怎麼確認 Node 版本
裝好 Node 之後,用以下指令確認版本:
node -v
# 輸出:v22.11.0(或 v24.x.x)
npm -v
# 輸出:10.x.x
如果你看到比 22 還舊的版本(例如 v18、v16),那代表你的作業系統用的是「系統內建」的 Node。強烈建議改用 nvm(macOS/Linux)或 fnm(跨平台)來管理版本,避免污染系統環境。
用 nvm / fnm 切換版本
如果你的工作需要同時跑 Node 18(舊專案)與 Node 22(新專案),裝 nvm 或 fnm 是最直覺的做法。fnm 是 Rust 寫的跨平台版本管理器,速度比 nvm 快很多:
# macOS / Linux 安裝 fnm
curl -fsSL https://fnm.vercel.app/install | bash
# 安裝 Node 22 LTS
fnm install 22
# 在當前目錄自動切到 Node 22(會寫進 .node-version 檔案)
fnm use 22
# 確認版本
node -v
# 輸出:v22.x.x
fnm 還有一個好用功能:在包含 .node-version 檔案的目錄自動切換版本。我們會在每個專案根目錄放一份,確保團隊每個人都用同一個 Node:
# 在專案根目錄建立 .node-version
echo "22" > .node-version
這樣無論誰 clone 專案、cd 進來,fnm 都會自動切到 Node 22。後端工程師可以把它想成「Python 的 .python-version(pyenv 用)」。
為什麼選 pnpm 而不是 npm
Node.js 內建的套件管理工具是 npm(Node Package Manager)。它功能齊全、能裝能砍能更新,但有兩個缺點:磁碟用量大(每個專案都各裝一份相同的依賴)與安裝速度中等。pnpm(performant npm)解決了這兩個問題:它用「內容定址儲存」(content-addressable store)把同一個套件版本在所有專案之間共用,硬碟用量可以省下 50% 以上;安裝速度也比 npm 快 2 到 3 倍。
pnpm 還有一個後端工程師會覺得「似曾相識」的設計:嚴格的依賴隔離。npm 與 yarn classic 會把套件的依賴「攤平」到最外層,導致你的程式碼可以意外引用到沒宣告的套件(所謂的幽靈依賴 phantom dependency);pnpm 用 symlink 結構把每個專案的依賴關在 node_modules/.pnpm/ 下面,你的程式碼只能引用 package.json 裡明確宣告的套件。這條規則會在前幾天讓你覺得有點囉嗦,但能避免很多「在我電腦能跑」的神奇 bug。
安裝 pnpm
官方推薦的安裝方式是用 Corepack,這是 Node.js 16.13 之後內建的工具,可以確保團隊每個人用同樣的 pnpm 版本:
# 啟用 Corepack(Node 內建,不需要額外安裝)
corepack enable
# 用 Corepack 安裝 pnpm 最新穩定版
corepack prepare pnpm@latest --activate
# 確認版本
pnpm -v
# 輸出:9.x.x(或更新)
如果你不想用 Corepack,也可以直接裝:macOS 用 Homebrew brew install pnpm、Windows 用 winget winget install pnpm、Linux 用 curl -fsSL https://get.pnpm.io/install.sh | sh -。本系列所有範例都假設你用 pnpm。
建立第一個 React + TypeScript 專案
裝好 Node 與 pnpm 之後,建立 React 專案最快的方式是用 Vite 的官方範本。Vite 是 2026 年 3 月 React 生態的主流打包工具,比舊的 Create React App(CRA)快 10 到 100 倍,並且原生支援 TypeScript、JSX、CSS Modules 等格式。
# 用 Vite 官方 React + TypeScript 範本建立專案
pnpm create vite@latest hello-fe -- --template react-ts
cd hello-fe
# 安裝依賴
pnpm install
# 啟動開發伺服器
pnpm dev
# 輸出:VITE v7.x.x ready in xxx ms
# 輸出:Local: http://localhost:5173/
這個指令會建立一個完整的最小專案,裡面有 src/(React 元件)、public/(靜態檔)、package.json(依賴與 scripts)、tsconfig.json(TypeScript 設定)、vite.config.ts(Vite 設定)。瀏覽器打開 http://localhost:5173/ 就能看到 Vite 的歡迎畫面。
TypeScript 與 tsconfig.json
TypeScript 是 JavaScript 的「超集合」:任何合法的 JavaScript 程式碼都是合法的 TypeScript,多出來的部分是「型別註記」。裝好之後 tsc 編譯器會幫你做型別檢查,發現問題就報錯;沒問題則輸出普通的 JavaScript 給瀏覽器執行。後端工程師可以把它想成「JavaScript 版的 mypy + pydantic 驗證」。
TypeScript 5.8 與 5.9 是 2026 年 3 月當下的主流版本。兩個版本對本系列用到的語法(泛型、條件型別、satisfies 運算子等)都支援。Vite 預設裝的是 5.8,你可以手動升到 5.9:
# 把 TypeScript 升到 5.9
pnpm add -D typescript@5.9
# 確認版本
pnpm tsc -v
# 輸出:Version 5.9.x
Vite 範本預設的 tsconfig.json 已經對 React 專案最佳化,但有幾個地方可以再加強。打開來看:
{
"compilerOptions": {
"target": "ES2022",
"useDefineForClassFields": true,
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"]
}
幾個關鍵設定值得說明:第一,"target": "ES2022" 表示編譯出來的 JavaScript 用 ES2022 標準(包含 top-level await、私有欄位 #x 等);第二,"jsx": "react-jsx" 表示 JSX 由新版 React 自動 runtime 處理,你不用在每支檔案 import React from "react";第三,"strict": true 開啟一整套嚴格模式(包含 strictNullChecks、noImplicitAny 等),這是後端工程師最熟悉的「嚴格把關」;第四,"noUnusedLocals" 與 "noUnusedParameters" 會在你留了沒用到的變數或函式參數時報錯,逼你維持乾淨。Day 3 會把 strict 的每個子選項展開,這裡先看到一個整體輪廓。
另外,建立一個 tsconfig.node.json 給 Vite 設定檔(vite.config.ts)用:
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true,
"noEmit": true
},
"include": ["vite.config.ts"]
}
這份設定「不包含 DOM 函式庫」,避免 Vite 設定檔誤用 document、window 這類瀏覽器專屬 API。Day 3 會再示範怎麼把 tsconfig.json 拆成多份(應用、前端共用、Node 端)。
一個最小的 tsconfig 實戰範例
如果你對上面的選項還是有點抽象,這裡用一段「故意寫錯」的程式碼示範 strict 模式帶來的差異:
// src/greeter.ts
// 故意寫錯的版本:strict 模式會報錯,沒開 strict 不會
function greet(name: string) {
console.log("Hello, " + name.toUppercase()); // 拼錯方法名
}
greet("後端工程師");
// 輸出 TS 編譯錯誤:
// Property 'toUppercase' does not exist on type 'string'.
// Did you mean 'toUpperCase'?
把這段程式碼存檔後跑 pnpm typecheck,TypeScript 會立刻告訴你 toUppercase 拼錯、應該是 toUpperCase。這種「型別層級的拼字檢查」正是後端寫 Python 用 mypy 時最懷念的功能,現在 JavaScript 也有同樣的保護了。
ESLint 9 與扁平設定檔
ESLint 是 JavaScript/TypeScript 的 lint 工具,會自動檢查程式碼風格、常見錯誤。9 版開始推「扁平設定檔」(flat config),把過去散落在 .eslintrc 的多份檔案合併成一個 eslint.config.js,語法更單純、與 TypeScript 的整合也更好。
裝好 Vite 範本之後,預設就有 ESLint,但設定檔是傳統格式。我們把它改成 9 版的扁平設定:
# 移除舊的 ESLint 設定檔
rm .eslintrc.cjs .eslintignore 2>/dev/null
# 裝新的依賴
pnpm add -D eslint@9 @eslint/js typescript-eslint eslint-plugin-react-hooks eslint-plugin-react-refresh
然後新增 eslint.config.js:
// eslint.config.js
// ESLint 9 扁平設定檔:把多份設定合併成一個陣列
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
export default tseslint.config(
// 忽略不需要檢查的目錄
{ ignores: ["dist", "node_modules", "coverage"] },
// 基礎規則
js.configs.recommended,
...tseslint.configs.recommended,
// 針對 src/ 的 React Hooks 規則
{
files: ["src/**/*.{ts,tsx}"],
plugins: {
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
},
},
);
這個設定檔把「全域規則」、「TypeScript 規則」、「React Hooks 規則」三層合併起來。react-hooks 會檢查你有沒有違反 Hook 的呼叫規則(例如在條件裡呼叫 useState);react-refresh 是 Vite 的搭配套件,確保 Fast Refresh 正常運作。執行的方式:
# 跑 ESLint 檢查整個 src/
pnpm lint
# 自動修正可修的問題
pnpm lint -- --fix
ESLint 9 與 Prettier 的分工
新手最常問的問題是「ESLint 跟 Prettier 是不是在做一樣的事?」答案是「它們職責不同」。ESLint 管「邏輯層級」的問題:變數沒用、有沒有違反 Hook 規則、潛在的 bug;Prettier 管「格式層級」的問題:縮排幾格、單引號還是雙引號、行尾要不要分號。把兩者串起來的方式是讓 ESLint 9 把格式問題交給 Prettier,不重複檢查:
// eslint.config.js
// 加 prettier 整合:讓 ESLint 不管格式,把格式交給 Prettier
import prettier from "eslint-config-prettier";
export default tseslint.config(
{ ignores: ["dist", "node_modules", "coverage"] },
js.configs.recommended,
...tseslint.configs.recommended,
// 這一行必須放最後,把已被 Prettier 涵蓋的規則關掉
prettier,
{
files: ["src/**/*.{ts,tsx}"],
plugins: {
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
},
},
);
裝 eslint-config-prettier 之後,pnpm lint 不會再抱怨「應該用單引號」這類格式問題,留給 Prettier 處理。存檔時 Prettier 自動排版、ESLint 自動修邏輯問題,兩個工具各司其職。後端工程師可以把它想成「flake8 管邏輯、black 管格式」。
VS Code 設定與擴充套件
VS Code 是 2026 年前端社群的主流編輯器(雖然 WebStorm 也有人用)。裝好 VS Code 之後,建議裝以下擴充套件:
- ESLint(dbaeumer.vscode-eslint):把 ESLint 9 的錯誤直接顯示在編輯器裡,存檔自動修。
- Prettier(esbenp.prettier-vscode):自動排版工具,與 ESLint 互補(ESLint 管邏輯、Prettier 管格式)。
- Tailwind CSS IntelliSense(bradlc.vscode-tailwindcss):Tailwind class 自動完成與 hover 預覽(Day 8 開始會用到)。
- ES7+ React/Redux/React-Native snippets(dsznajder.es7-react-js-snippets):常用 React 樣板,例如
rfce自動展開成 React Functional Component Export。 - Error Lens(Alexander.error-lens):把錯誤訊息直接顯示在行尾,比預設的小紅色波浪線更顯眼。
- GitLens(eamodio.gitlens):強化 Git 整合,對齊後端工程師熟悉的 blame 與 log。
裝好之後,建議建立一份工作區設定 .vscode/settings.json,把團隊的編輯器行為統一:
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"tailwindCSS.experimental.classRegex": [
["clsx\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
["cn\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
]
}
幾個關鍵設定:第一,formatOnSave: true 讓存檔自動排版,避免「改完忘記排版」這種小麻煩;第二,codeActionsOnSave.source.fixAll.eslint 讓 ESLint 在存檔時自動修可修的問題;第三,typescript.tsdk 指向專案內的 TypeScript,避免團隊成員各自裝到不同版本的 TypeScript。第四,tailwindCSS.experimental.classRegex 讓 IntelliSense 認得 clsx(...) 與 cn(...) 內的 className(Day 8 會用到)。
讓 VS Code 在儲存時跑 ESLint 自動修
上面的 "source.fixAll.eslint" 設定背後其實就是「存檔時呼叫 ESLint 的 --fix」。它能處理的範例如下:
// src/sample.ts
// 寫一個有 ESLint 警告的版本,存檔看會不會自動修
function add(a: number, b: number): number {
const unused = "我沒用到"; // 觸發 no-unused-vars
return a + b;
}
console.log(add(1, 2));
把這段存檔,VS Code 會立刻把 unused 那行刪掉(或加底線前綴),這就是 source.fixAll.eslint 的效果。如果出現「無法自動修」的錯誤(例如型別錯誤),VS Code 會在那一行顯示紅色波浪線,把游標移過去就能看到完整訊息。
package.json 與 scripts
Vite 範本預設的 package.json 已經有幾個 scripts,但可以再擴充成一份「團隊友善」版本:
{
"name": "hello-fe",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"typecheck": "tsc --noEmit",
"format": "prettier --write \"src/**/*.{ts,tsx,css,md}\"",
"verify": "pnpm typecheck && pnpm lint && pnpm build"
},
"dependencies": {
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.0",
"@vitejs/plugin-react": "^4.3.0",
"eslint": "^9.18.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.16",
"prettier": "^3.4.0",
"typescript": "^5.9.0",
"typescript-eslint": "^8.20.0",
"vite": "^7.0.0"
},
"engines": {
"node": ">=22 <25"
}
}
幾個重點:"type": "module" 表示整個專案用 ESM(ES Modules),.js 檔案裡的 import 與 export 才會被當作模組;"build": "tsc -b && vite build" 先跑 TypeScript 編譯檢查,再跑 Vite build(順序很重要,型別錯了就不要浪費時間打包);"typecheck": "tsc --noEmit" 不輸出檔案只做型別檢查,CI 上會跑這個;"engines" 鎖定 Node 22–24,避免同事裝到奇怪版本。
驗證整個專案是否健康
裝好所有套件之後,跑一次 pnpm verify 把三個關卡都跑過,確保環境真的可用:
pnpm verify
# 輸出:
# > hello-fe@0.0.0 verify /path/to/hello-fe
# > pnpm typecheck && pnpm lint && pnpm build
# typecheck:跑 TypeScript 編譯,沒錯就靜默通過
# lint:跑 ESLint,沒錯就靜默通過
# build:先跑 tsc,再跑 vite build,最後輸出 dist/
如果三個指令都跑完沒有錯誤訊息,你的工作環境就準備好了。Day 15 會在 verify 加 vitest run、Day 27 會加 playwright test,驗收關卡會愈來愈完整。
常見錯誤與踩雷
第一次把環境架起來,最常踩的雷有四個。第一個是「pnpm install 之後出現 ERR_PNPM_PEER_DEP_ISSUES」。這是 pnpm 在告訴你「某個套件對另一個套件的版本有意見」。大部分時候這只是警告,不會讓專案壞掉;如果你看到 WARN 就跳過,看到 ERR 再去查官方 issue tracker。
第二個是「tsc --noEmit 報 Cannot find module 'react'」。這通常代表 TypeScript 找不到 React 的型別。修法是確認 tsconfig.json 的 moduleResolution 設成 "bundler"(Vite 範本預設),並把 node_modules/@types/react 真的裝好(pnpm add -D @types/react)。
第三個是「ESLint 9 設定檔 eslint.config.js 沒被讀到」。ESLint 9 預設讀的檔名是 eslint.config.js,如果你的檔名是 eslint.config.mjs 或 .eslintrc.js,CLI 會找不到。要嘛改檔名,要嘛在 package.json 加 "type": "module" 並把設定改成 ESM 語法。
第四個是「VS Code 的 TypeScript 版本跟終端機的不一樣」。VS Code 預設用「VS Code 內建 TypeScript」,可能比專案裡裝的版本舊或新。要解決就在 .vscode/settings.json 加 "typescript.tsdk": "node_modules/typescript/lib",強制 VS Code 用專案版本。
效能與實務提醒
環境架好之後,順手把幾個小檔案補齊。第一,.npmrc 放進專案根目錄,鎖定 pnpm 的行為:
# .npmrc
engine-strict=true
auto-install-peers=true
strict-peer-dependencies=false
engine-strict=true 強制檢查 Node 版本;auto-install-peers=true 自動裝 peer 依賴,減少手動 pnpm add 的次數;strict-peer-dependencies=false 不要把 peer 警告升級為錯誤,避免升級 React 時被不相容警告卡住。
第二,.gitignore 至少要排除這些(Vite 範本預設就有了,但要檢查一遍):
# .gitignore
node_modules
dist
dist-ssr
*.local
# 編輯器
.vscode/*
!.vscode/settings.json
!.vscode/extensions.json
.idea
.DS_Store
# 測試與覆蓋率
coverage
*.lcov
# 環境變數
.env
.env.*.local
第三,把 verify 跑進 CI(GitHub Actions):
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm verify
這份 CI 設定做四件事:拉原始碼、裝 pnpm 9、裝 Node 22、安裝依賴(用 frozen lockfile 確保 lockfile 不被偷偷改)、跑 verify。Day 29 部署時會再展開。
裝完上述工具之後,讓我們寫一個小型的 TypeScript 工具函式,順便驗證 tsc 與 ESLint 真的會把關。這支函式處理「把使用者輸入的字串標準化」(去頭尾空白、第一字大寫),是後端寫表單驗證時很常見的需求:
// src/utils/normalize.ts
// 把任意字串標準化成「首字大寫、其餘原樣」
export function normalizeName(raw: string): string {
const trimmed = raw.trim();
if (trimmed.length === 0) return "";
return trimmed.charAt(0).toUpperCase() + trimmed.slice(1);
}
console.log(normalizeName(" hello fe "));
// 輸出:Hello fe
存檔之後,跑 pnpm typecheck 與 pnpm lint 都應該是靜默通過。如果故意把 trim 改成 trimX,TypeScript 會立刻在 trimX 那一行報 Property 'trimX' does not exist on type 'string';如果把 trimmed.length 改成 trimmed.lenght(拼錯),編輯器會即時顯示紅色波浪線,存檔時 ESLint 的 no-undef 規則也會提示。這就是「型別 + lint」雙重把關的效果。
另一個值得一試的小範例:用 tsx 直接跑 TypeScript 檔案,繞過 tsc 編譯,適合寫一次性的腳本或測試:
// scripts/check-node.ts
// 用 tsx 直接執行 TypeScript:常用於一次性腳本
import { execSync } from "node:child_process";
const version = execSync("node -v").toString().trim();
console.log("目前 Node 版本:", version);
if (!version.startsWith("v22") && !version.startsWith("v24")) {
console.error("此專案需要 Node 22 或 24");
process.exit(1);
}
這支腳本檢查當前 Node 版本是否符合 engines 設定。執行方式:
# 安裝 tsx
pnpm add -D tsx
# 直接執行 TypeScript
pnpm tsx scripts/check-node.ts
# 輸出:目前 Node 版本:v22.x.x
後端工程師可以把 tsx 理解成「TypeScript 版的 python -m」:不需要先編譯、直接執行;常用於 CI 預檢、build script、一次性資料處理。Day 16 與 Day 17 會看到 tsx 在 Next.js 專案的 prisma seed、setup script 中大量使用。
小結
今天我們把整個前端工具鏈蓋起來了:Node.js 22/24 LTS 是基礎,pnpm 9 是套件管理,TypeScript 5.8/5.9 提供型別系統,ESLint 9 flat config 把風格檢查現代化,VS Code 的擴充套件讓編輯器看懂 React 與 TypeScript。這套環境可以撐到中型專案,後續 Day 17 進入 Next.js 時,create-next-app 會基於同一套原則(pnpm + TypeScript + ESLint 9)自動建好,你只要會調整 tsconfig.json 與 eslint.config.js 就能駕馭。明天我們正式進入 TypeScript,把型別系統、tsconfig、泛型、收窄等觀念一個個拆開來講。
結語
明天,我們會正式進入 TypeScript 基礎:原始型別、物件型別、陣列、元組、聯合型別、型別別名、介面的差別,以及 tsconfig.json 的 strict 模式怎麼打開、為什麼值得打開。Day 3 結束時,你應該能用 TypeScript 描述 React 元件的 props 形狀,並看懂編譯器的錯誤訊息,知道怎麼修。Day 4 接著把泛型、條件型別、收窄、工具型別(Pick、Omit、Partial、Readonly)一次學完,到時候寫 React 元件就能享受「型別即說明書」的好處。
延伸資源
- Node.js Release 工作表(22 LTS / 24 LTS):
https://nodejs.org/en/about/previous-releases - pnpm 官方〈Installation〉(9.x):
https://pnpm.io/installation - TypeScript Handbook〈tsconfig.json〉(5.9):
https://www.typescriptlang.org/docs/handbook/tsconfig-json.html - ESLint 9 官方〈Getting Started〉:
https://eslint.org/docs/latest/use/getting-started - Vite 官方〈Getting Started〉(7.x):
https://vite.dev/guide/ - VS Code 工作區設定說明:
https://code.visualstudio.com/docs/configure/settings
留言
張貼留言