安装 Node.js 和 npm/yarn
Node.js 下载地址:https://nodejs.org/
安装后确认版本:
node -v
npm -v
安装包管理器(可选)
推荐使用 yarn
或 pnpm
(相比 npm 更快、依赖更干净):
npm install -g yarn
npm create vite@latest my-app -- --template react
cd my-app
npm install
npx create-react-app my-app
cd my-app
npm start
安装项目依赖
包括 UI 框架、路由、状态管理等:
npm install react-router-dom zustand axios classnames
安装开发辅助工具
npm install -D eslint prettier husky lint-staged
配置目录结构(建议)
├── public/ # 静态资源
├── src/
│ ├── assets/ # 图片、字体等资源
│ ├── components/ # 可复用组件
│ ├── pages/ # 页面级组件
│ ├── hooks/ # 自定义 hook
│ ├── stores/ # 状态管理
│ ├── utils/ # 工具函数
│ ├── App.tsx # 根组件
│ └── main.tsx # 入口文件
├── .eslintrc # ESLint 配置
├── .prettierrc # Prettier 配置
└── package.json
运行项目
npm run dev # vite
# or
npm start # CRA
热更新调试
API 代理 & 环境变量配置
.env
, .env.local
支持自定义变量,如:
VITE_API_BASE=https://api.example.com
构建生产包
npm run build
部署到平台
Netlify、Vercel、GitHub Pages、阿里云、腾讯云等
或使用 serve
工具本地部署:
npm install -g serve
serve -s dist
--template react-ts
)非常好,完成了初始化开发环境后,React 项目的代码开发也有明确的推荐顺序。下面是结合实际工程经验整理的一套标准化流程(适用于中小型到中大型项目),你可以直接作为开发参考:
在 src/pages/
中创建页面骨架(如 Home.tsx
、Login.tsx
)
在 src/App.tsx
中配置路由:
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./pages/Home";
import Login from "./pages/Login";
function App() {
return (
} />
} />
);
}
export default App;
src/layouts/
中创建布局组件,如 MainLayout.tsx
在 src/components/
中逐步开发:
引入 UI 框架(如 Ant Design、Tailwind UI、ShadCN)
在 src/stores/
中定义全局状态模块
// userStore.ts
import { create } from 'zustand';
const useUserStore = create(set => ({
user: null,
setUser: (user) => set({ user }),
}));
在 src/api/
中封装:
login()
, getUserInfo()
)// api/instance.ts
import axios from 'axios';
export const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE,
timeout: 10000,
});
每个页面:
src/hooks/
中)页面模块推荐结构(page 下结构):
pages/
Dashboard/
index.tsx
components/ # 页面局部组件
hooks/ # 页面独有逻辑
api.ts # 页面 API
重定向未登录用户.env.development
、.env.production
等import.meta.env.VITE_XXX
注入变量lint-staged
& husky
feature/login-page
, fix/bug-123
步骤 | 内容 | 文件/目录示例 |
---|---|---|
1 | 设置路由结构 | App.tsx , pages/Home.tsx |
2 | 建立页面布局(Layout) | layouts/MainLayout.tsx |
3 | 编写组件库(可复用) | components/Button.tsx |
4 | 引入状态管理 | stores/userStore.ts |
5 | 封装请求模块(axios) | api/request.ts |
6 | 编写业务页面 | pages/Dashboard/index.tsx |
7 | 接入权限控制 | routes/PrivateRoute.tsx |
8 | 环境变量配置 | .env.* |
9 | 体验优化:加载态、空态等 | components/Loading.tsx |
10 | 测试、提交、部署 | tests/ , build/ |
my-app/
├── public/
├── src/
│ ├── api/ # axios 封装 & API 方法
│ │ ├── request.ts
│ │ └── user.ts
│ ├── components/ # 通用组件
│ │ └── HelloBox.tsx
│ ├── layouts/ # 页面布局
│ │ └── MainLayout.tsx
│ ├── pages/ # 页面组件
│ │ └── Dashboard/
│ │ └── index.tsx
│ ├── stores/ # Zustand 状态管理
│ │ └── userStore.ts
│ ├── App.tsx # 路由配置
│ ├── main.tsx # 入口文件
│ └── vite-env.d.ts
├── .env # 环境变量
├── index.html
├── package.json
└── vite.config.ts
npm create vite@latest my-app -- --template react-ts
cd my-app
npm install
# 安装依赖
npm install react-router-dom axios zustand
# 启动项目
npm run dev
src/main.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')!).render(
);
src/App.tsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Dashboard from './pages/Dashboard';
import MainLayout from './layouts/MainLayout';
function App() {
return (
}>
} />
);
}
export default App;
src/layouts/MainLayout.tsx
import { Outlet } from 'react-router-dom';
const MainLayout = () => {
return (
My App Header
);
};
export default MainLayout;
src/pages/Dashboard/index.tsx
import HelloBox from '../../components/HelloBox';
import { useUserStore } from '../../stores/userStore';
export default function Dashboard() {
const user = useUserStore((state) => state.user);
return (
Dashboard
Current user: {user?.name || 'Guest'}
);
}
src/components/HelloBox.tsx
const HelloBox = () => {
return (
Hello from Component!
);
};
export default HelloBox;
src/stores/userStore.ts
import { create } from 'zustand';
interface User {
name: string;
email: string;
}
interface UserState {
user: User | null;
setUser: (user: User) => void;
}
export const useUserStore = create((set) => ({
user: null,
setUser: (user) => set({ user }),
}));
src/api/request.ts
import axios from 'axios';
export const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE || 'https://api.example.com',
timeout: 5000,
});
// 添加拦截器可选
request.interceptors.response.use(
(res) => res.data,
(err) => Promise.reject(err)
);
src/api/user.ts
import { request } from './request';
export const getUserInfo = () => {
return request.get('/user/info');
};
VITE_API_BASE=https://api.example.com
stores/userStore.ts
添加登录逻辑getUserInfo()
接入 Dashboard 页面/login
页面,配置权限拦截