搭建react_ts后台管理系统项目依赖集成步骤
以下集成内容仅对思想进行说明,如需进行代码对照,可参考目录下 react19_ts 项目内实际代码,文档与代码会在git上持续补充
git仓库地址:https://gitee.com/xiaoli-account/react19_tsReact Router 集成
[参考文档](https://reactrouter.com/en/main/start/tutorial)
项目路由管理,页面跳转与导航
1、安装
npm install react-router-dom
2、配置
1、`src` 目录下新建 `router` 文件夹,内置两个文件(`index.tsx`、 `routes.ts`)
`index.tsx` 代表路由配置的唯一出口,导出 `<Routes>` 组件
`routes.ts` 代表项目的静态路由配置
2、在 `App.tsx` 中使用 `<BrowserRouter>` 包裹应用
3、使用 `<Route>` 定义路由规则,嵌套路由使用 `<Outlet />` 渲染子路由
4、至此项目静态路由集成完毕,动态权限路由需与后台配合制作
3、使用示例
// src/router/index.tsximport { Routes, Route, Navigate } from 'react-router-dom';import LayoutManager from '@/layout';import Login from '@/pages/login';import Dashboard from '@/pages/dashboard';const AppRouter = () => { return ( <Routes> <Routepath="/login"element={<Login />} /> <Routepath="/"element={<LayoutManager />}> <Routeindexelement={<Navigateto="/dashboard"replace />} /> <Routepath="dashboard"element={<Dashboard />} /> </Route> </Routes> );};export default AppRouter;
// src/App.tsximport { BrowserRouter } from 'react-router-dom';import AppRouter from './router';function App() { return ( <BrowserRouter> <AppRouter /> </BrowserRouter> );}
Zustand 状态管理集成
[参考文档](https://zustand.docs.pmnd.rs/getting-started/introduction)
项目全局状态管理,轻量级 React 状态管理库
1、安装
2、配置
1、`src` 目录下新建 `store` 文件夹
- 内置各个模块的独立 store,如:`user.ts`、`app.ts`、`layout.ts` 等
- `index.ts` 作为统一导出文件
2、使用 `create` 创建 store,支持中间件(如 `persist` 持久化)
3、使用示例
// src/store/user.tsimport { create } from 'zustand';import { persist } from 'zustand/middleware';interface UserState { token: string; userInfo: any; setToken: (token: string) => void; setUserInfo: (info: any) => void; logout: () => void;}export const useUserStore = create<UserState>()( persist( set => ({ token: '', userInfo: null, setToken: token => set({ token }), setUserInfo: userInfo => set({ userInfo }), logout: () => set({ token: '', userInfo: null }), }), { name: 'user-storage', } ));
import { useUserStore } from '@/store/user';function UserProfile() { const { userInfo, setUserInfo } = useUserStore(); // ...}
## Axios 集成
[参考文档](https://axios-http.com/zh/docs/intro)
项目的 HTTP 通信,Ajax 请求
1、安装
2、配置
- 1、`src` 目录下新建 `utils` 文件夹,用来存储项目内使用到的共用方法类
- 2、在 `utils` 文件夹内新建 `request.ts` 文件
- 3、创建 axios 实例,为请求的共用配置进行统一处理
- 4、对实例进行请求与响应的拦截处理
- 5、额外可拓展:文件下载、文件上传、(GET/POST/PUT/DELETE)的请求 方法封装
3、使用示例
// src/utils/request.tsimport axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';import { message } from 'antd';import { useUserStore } from '@/store/user';const request: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 50000, headers: { 'Content-Type': 'application/json' },});// 请求拦截器request.interceptors.request.use( config => { const token = useUserStore.getState().token; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => Promise.reject(error));// 响应拦截器request.interceptors.response.use( (response: AxiosResponse) => { const { code, data, msg } = response.data; if (code === 200) { return data; } else { message.error(msg || '请求失败'); return Promise.reject(new Error(msg)); } }, error => { message.error(error.message || '网络错误'); return Promise.reject(error); });export default request;
## qs 集成
[参考文档](https://www.npmjs.com/package/qs)
配合 axios 使用,序列化 JSON 参数,防止参数格式错误
1、安装
npm install qsnpm install @types/qs -D
import qs from 'qs';import axios from 'axios';const request = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 50000, headers: { 'Content-Type': 'application/json' }, paramsSerializer: { serialize(params) { return qs.stringify(params, { allowDots: true }); }, },});
## js-cookie 集成
[参考文档](https://www.npmjs.com/package/js-cookie)
浏览器 Cookie 操作库
npm install js-cookienpm install @types/js-cookie -D
// src/utils/storage.tsimport Cookies from 'js-cookie';export const TOKEN_KEY = 'access_token';export const getToken = () => Cookies.get(TOKEN_KEY);export const setToken = (token: string) => Cookies.set(TOKEN_KEY, token);export const removeToken = () => Cookies.remove(TOKEN_KEY);
## i18next 国际化集成
[参考文档](https://react.i18next.com/)
React 国际化实现插件,中英文切换功能
npm install i18next react-i18next i18next-browser-languagedetector i18next-http-backend
2、配置
- 1、`src` 目录下新建 `i18n` 文件夹,内置 `index.ts` 入口文件与语言包
- 2、`index.ts` 内配置 i18next 插件
- 3、在 `main.tsx` 中引入 i18n 配置
### 3、使用示例
// src/i18n/index.tsimport i18n from 'i18next';import { initReactI18next } from 'react-i18next';import LanguageDetector from 'i18next-browser-languagedetector';import zhCN from './locales/zh-CN.json';import enUS from './locales/en-US.json';i18n .use(LanguageDetector) .use(initReactI18next) .init({ resources: { 'zh-CN': { translation: zhCN }, 'en-US': { translation: enUS }, }, fallbackLng: 'zh-CN', interpolation: { escapeValue: false, }, });export default i18n;
// 组件中使用import { useTranslation } from 'react-i18next';function MyComponent() { const { t, i18n } = useTranslation(); return ( <div> <h1>{t('welcome')}</h1> <buttononClick={() => i18n.changeLanguage('en-US')}>English</button> </div> );}
## iconfont集成
[参考文档]
(https://www.iconfont.cn/help/detail?spm=a313x.manage_type_myprojects.i3.48.84e93a815Qrxgj&helptype=code)
1、安装、配置
- 1、本次使用font-class 引用
- 2、进入【资源管理】-【我的项目】-【选中项目】-【选择font-class】- 【查看在线链接】
- 3、找到类似下方链接
`//at.alicdn.com/t/c/font_1557744_9lcj2fgybmk.css`
- 4、点击链接,进入一个新浏览器标签,会看到网页上的css代码,复制代码
- 5、进入src/assets目录新建目录iconfont/iconfont.css
- 6、将复制的代码存放与iconfont.css文件内保存
- 7、在main.tsx文件内,引入iconfont.css文件
## Ant Design 集成
[参考文档](https://ant.design/docs/react/introduce-cn)
企业级 UI 组件库
1、安装
npm install antdnpm install @ant-design/icons
2、配置
// src/App.tsximport { ConfigProvider } from 'antd';import zhCN from 'antd/locale/zh_CN';import 'antd/dist/reset.css';function App() { return <ConfigProviderlocale={zhCN}>{/* 应用内容 */}</ConfigProvider>;}
3、按需引入(自动)
Vite 项目中,Ant Design 5.x 默认支持 Tree Shaking,无需额外配置。
## Sass 编译器集成
[官方文档](https://sass-lang.com/)
[参考文档](https://www.npmjs.com/package/sass)
1、安装
2、配置
- 1、安装完成后,在项目内即可使用 `.scss` 文件
- 2、在 `vite.config.ts` 中配置全局 SCSS 变量
// vite.config.tsexport default defineConfig({ css: { preprocessorOptions: { scss: { additionalData: `@use "@/styles/variables.scss" as *;`, }, }, },});
3、使用方式
// src/styles/variables.scss$primary-color: #1890ff;$font-size-base: 14px;
// 组件中使用import './index.scss';function MyComponent() { return <divclassName="my-component">Hello</div>;}
// index.scss.my-component { color: $primary-color; font-size: $font-size-base;}
## TailwindCSS 样式库集成
[参考文档](https://tailwindcss.com/docs/installation/using-vite)
原子化 CSS 框架
1、安装
npm install tailwindcss @tailwindcss/postcss autoprefixer
2、配置
// vite.config.tsimport tailwindcss from '@tailwindcss/vite';export default defineConfig({ plugins: [react(), tailwindcss()],});
// tailwind.config.jsmodule.exports = { content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], theme: { extend: {}, }, plugins: [],};
/* src/index.css */@import 'tailwindcss';
3、使用示例
function Button() { return ( <buttonclassName="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">Click me</button> );}
4、VS Code 插件
安装 **Tailwind CSS IntelliSense** 插件获得智能提示。
## NProgress 路由加载动画集成
[参考文档](https://www.npmjs.com/package/nprogress)
路由切换时的加载进度条
1、安装
npm install nprogressnpm install @types/nprogress -D
2、工具封装
在 `src/utils/nprogress.ts` 中封装:
// src/utils/nprogress.tsimport NProgress from 'nprogress';import 'nprogress/nprogress.css';// 配置 NProgressNProgress.configure({ showSpinner: false, // 不显示右上角的旋转图标 trickleSpeed: 200, // 自动递增间隔 minimum: 0.3, // 初始化时的最小百分比 easing: 'ease', // 动画方式 speed: 500, // 递增进度条的速度});/** * 开始加载进度条 */export const startProgress = (): void => { NProgress.start();};/** * 完成加载进度条 */export const doneProgress = (): void => { NProgress.done();};/** * 设置进度条百分比 */export const setProgress = (n: number): void => { NProgress.set(n);};export default { start: startProgress, done: doneProgress, set: setProgress,};
3、自定义样式
在 `src/styles/nprogress.scss` 中自定义样式:
// src/styles/nprogress.scss#nprogress { pointer-events: none;}#nprogress .bar { background: linear-gradient(90deg, #1890ff 0%, #52c41a 100%); position: fixed; z-index: 9999; top: 0; left: 0; width: 100%; height: 3px; box-shadow: 0 0 10px rgba(24, 144, 255, 0.5);}#nprogress .peg { display: block; position: absolute; right: 0; width: 100px; height: 100%; box-shadow: 0 0 10px rgba(24, 144, 255, 0.8), 0 0 5px rgba(24, 144, 255, 0.8); opacity: 1; transform: rotate(3deg) translate(0px, -4px);}
4、集成到路由
推荐方式:在 `src/router/index.tsx` 中集成
将 `RouteProgress` 组件放在路由文件中,使路由相关逻辑更内聚:
// src/router/index.tsximport { Routes, Route, useLocation } from 'react-router-dom';import { useEffect } from 'react';import { startProgress, doneProgress } from '@/utils/nprogress';import '@/styles/nprogress.scss';/** * 路由加载进度条组件 * 监听路由变化,自动显示/隐藏加载进度条 */function RouteProgress() { const location = useLocation(); useEffect(() => { startProgress(); const timer = setTimeout(() => { doneProgress(); }, 300); return () => { clearTimeout(timer); doneProgress(); }; }, [location.pathname]); return null;}const AppRouter = () => { return ( <> <RouteProgress /> <Routes>{/* 路由配置 */}</Routes> </> );};export default AppRouter;
为什么推荐这种方式?
1. 职责更清晰:路由相关的功能都在 `router` 目录中
2. 更好的内聚性:进度条是路由切换的副作用,放在路由文件中更合理
3. 更易维护:修改路由加载逻辑只需修改 `router/index.tsx`
App.tsx 保持简洁:
// src/App.tsximport { BrowserRouter } from 'react-router-dom';import AppRouter from './router';function App() { return ( <BrowserRouter> <AppRouter /> </BrowserRouter> );}
5、使用示例
1、自动使用(已在 router/index.tsx 中配置)
路由切换时会自动显示加载进度条,无需手动调用。
2、手动控制
import { startProgress, doneProgress, setProgress } from '@/utils/nprogress';// 开始加载startProgress();// 设置进度(0-1)setProgress(0.5);// 完成加载doneProgress();
3、在异步操作中使用
import { startProgress, doneProgress } from '@/utils/nprogress';const fetchData = async () => { startProgress(); try { const data = await api.getData(); return data; } finally { doneProgress(); }};
6、常见问题
NProgress 进度条不显示?
检查是否引入了样式文件:
// src/router/index.tsximport '@/styles/nprogress.scss';
如何修改进度条颜色?
编辑 `src/styles/nprogress.scss` 文件:
#nprogress .bar { background: linear-gradient(90deg, #1890ff 0%, #52c41a 100%);}
如何调整进度条速度?
修改 `src/utils/nprogress.ts` 中的配置:
NProgress.configure({ trickleSpeed: 200, // 调整这个值 speed: 500, // 调整这个值});
## gm-crypt加密工具集成
1、安装
2、配置
- 参考当前目录下的react19_ts项目下login页面中的实际使用
- src/utils/sm4.ts
- src/store/user.ts
- 为避免在使用时发生的ts类型检查错误,需对插件进行自定以类型声明,
- 新建文件:gm-crypt.d.ts
declare module 'gm-crypt' { export class sm4 { constructor(config: SM4Config); encrypt(plaintext: string): string; decrypt(ciphertext: string): string; } export interface SM4Config { key: string; mode: 'ecb' | 'cbc'; iv?: string; outType?: 'base64' | 'text'; }}
## crypto-js 加密工具集成
[参考文档](https://www.npmjs.com/package/crypto-js)
JavaScript 加密库
1、安装
npm install crypto-jsnpm install @types/crypto-js -D
2、工具封装
在 `src/utils/crypto.ts` 中封装常用加密方法:
// src/utils/crypto.tsimport CryptoJS from 'crypto-js';// 默认密钥(建议从环境变量读取)const DEFAULT_SECRET_KEY = import.meta.env.VITE_CRYPTO_SECRET_KEY || 'react19-ts-default-key';/** * AES 加密 */export const encryptAES = (data: string, secretKey: string = DEFAULT_SECRET_KEY): string => { try { return CryptoJS.AES.encrypt(data, secretKey).toString(); } catch (error) { console.error('AES 加密失败:', error); return ''; }};/** * AES 解密 */export const decryptAES = (ciphertext: string, secretKey: string = DEFAULT_SECRET_KEY): string => { try { const bytes = CryptoJS.AES.decrypt(ciphertext, secretKey); return bytes.toString(CryptoJS.enc.Utf8); } catch (error) { console.error('AES 解密失败:', error); return ''; }};/** * MD5 加密(不可逆) */export const encryptMD5 = (data: string): string => { return CryptoJS.MD5(data).toString();};/** * SHA256 加密(不可逆) */export const encryptSHA256 = (data: string): string => { return CryptoJS.SHA256(data).toString();};/** * Base64 编码 */export const encodeBase64 = (data: string): string => { return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data));};/** * Base64 解码 */export const decodeBase64 = (base64String: string): string => { return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8);};/** * 加密对象(先转 JSON 再 AES 加密) */export const encryptObject = (obj: any, secretKey?: string): string => { try { const jsonString = JSON.stringify(obj); return encryptAES(jsonString, secretKey); } catch (error) { console.error('对象加密失败:', error); return ''; }};/** * 解密对象(先 AES 解密再解析 JSON) */export const decryptObject = <T = any>(ciphertext: string, secretKey?: string): T | null => { try { const jsonString = decryptAES(ciphertext, secretKey); return JSON.parse(jsonString) as T; } catch (error) { console.error('对象解密失败:', error); return null; }};
### 3、使用示例
1、基本使用
import { encryptAES, decryptAES, encryptMD5, encryptSHA256, encryptObject, decryptObject,} from '@/utils/crypto';// AES 加密/解密const password = '123456';const encrypted = encryptAES(password);console.log('加密后:', encrypted);const decrypted = decryptAES(encrypted);console.log('解密后:', decrypted);// MD5 加密(不可逆)const md5Hash = encryptMD5(password);console.log('MD5:', md5Hash);// SHA256 加密(不可逆)const sha256Hash = encryptSHA256(password);console.log('SHA256:', sha256Hash);// 对象加密/解密const userInfo = { username: 'admin', role: 'admin' };const encryptedObj = encryptObject(userInfo);console.log('加密对象:', encryptedObj);const decryptedObj = decryptObject(encryptedObj);console.log('解密对象:', decryptedObj);
2、在登录中使用
// src/pages/login/index.tsximport { encryptAES } from '@/utils/crypto';import { login } from '@/services/auth';const handleLogin = async (values: LoginForm) => { // 加密密码 const encryptedPassword = encryptAES(values.password); const res = await login({ username: values.username, password: encryptedPassword, }); // 处理登录结果...};
3、TypeScript 类型支持
// 自动类型推断const encrypted: string = encryptAES('hello');const decrypted: string = decryptAES(encrypted);// 泛型支持interface User { id: number; name: string;}const user: User = { id: 1, name: 'Admin' };const encryptedUser = encryptObject(user);const decryptedUser = decryptObject<User>(encryptedUser);// decryptedUser 的类型为 User | null
4、环境变量配置
在 `.env.development` 和 `.env.production` 中添加:
# 加密密钥(建议生产环境使用不同的密钥)VITE_CRYPTO_SECRET_KEY=your-secret-key-here
使用环境变量:
const secretKey = import.meta.env.VITE_CRYPTO_SECRET_KEY;const encrypted = encryptAES(data, secretKey);
5、常见问题
加密后的数据无法解密?
- 确保使用相同的密钥
- 检查加密数据是否被截断或修改
- 确保加密和解密使用相同的算法
## lodash-es 工具库集成
JavaScript 实用工具库 [参考文档](https://lodash.com/)
1、安装
npm install lodash-esnpm install @types/lodash-es -D
2、使用示例
import { debounce, cloneDeep, isEmpty } from 'lodash-es';// 防抖const handleSearch = debounce((value: string) => { console.log(value);}, 300);// 深拷贝const newObj = cloneDeep(originalObj);// 判空if (isEmpty(data)) { // ...}
## localforage 本地存储集成
[参考文档](https://localforage.github.io/localForage/)
异步本地存储库,支持 IndexedDB、WebSQL、localStorage
1、安装
2、使用示例
// src/utils/storage.tsimport localforage from 'localforage';localforage.config({ name: 'react19_ts', storeName: 'app_storage',});export const setItem = async (key: string, value: any) => { await localforage.setItem(key, value);};export const getItem = async (key: string) => { return await localforage.getItem(key);};export const removeItem = async (key: string) => { await localforage.removeItem(key);};
## LogicFlow 流程图引擎集成
[参考文档](https://site.logic-flow.cn/)
专注于业务流程图的前端框架
1、安装
npm install @logicflow/core @logicflow/extension
2、使用示例
import LogicFlow from '@logicflow/core';import '@logicflow/core/dist/style/index.css';import { useEffect, useRef } from 'react';functionFlowChart() { const containerRef = useRef<HTMLDivElement>(null); useEffect(() => { if(!containerRef.current) return; const lf = new LogicFlow({ container: containerRef.current, grid: true, }); lf.render({ nodes: [ { id: '1', type: 'rect', x: 100, y: 100, text: '节点1' }, { id: '2', type: 'circle', x: 300, y: 100, text: '节点2' }, ], edges: [{ sourceNodeId: '1', targetNodeId: '2' }], }); }, []); return <div ref={containerRef} style={{ width: '100%', height: '500px' }} />;}
## animate.css 动画库集成
[参考文档](https://animate.style/)
CSS 动画库
1、安装
2、使用示例
import 'animate.css';function AnimatedComponent() { return <divclassName="animate__animated animate__fadeIn">Hello World</div>;}
## vite-plugin-obfuscator 代码混淆工具集成
[参考文档](https://www.npmjs.com/package/vite-plugin-obfuscator)
生产环境代码混淆
1、安装
npm install vite-plugin-obfuscator -D
2、配置
// vite.config.tsimport obfuscator from 'vite-plugin-obfuscator';export default defineConfig(({ mode }) => ({ plugins: [ react(), mode === 'production' && obfuscator({ options: { compact: true, controlFlowFlattening: false, deadCodeInjection: false, debugProtection: false, debugProtectionInterval: 0, disableConsoleOutput: true, identifierNamesGenerator: 'hexadecimal', log: false, renameGlobals: false, rotateStringArray: true, selfDefending: true, stringArray: true, stringArrayEncoding: ['base64'], stringArrayThreshold: 0.75, unicodeEscapeSequence: false, }, }), ].filter(Boolean),}));
3、使用说明
构建生产版本
代码混淆会自动在生产构建时启用,无需手动配置。
混淆配置说明
在 `vite.config.ts` 中已配置:
- ✅ 压缩代码 (`compact: true`)
- ✅ 字符串数组化 (`stringArray: true`)
- ✅ Base64 编码 (`stringArrayEncoding: ['base64']`)
- ✅ 自我防御 (`selfDefending: true`)
- ✅ 禁用 console 输出 (`disableConsoleOutput: true`)
查看混淆效果
构建后查看 `dist/assets/js/*.js` 文件,代码已被混淆。
4、TypeScript 类型声明
在 `src/types/vite-plugin-obfuscator.d.ts` 中添加类型声明:
declare module 'vite-plugin-obfuscator' { import { Plugin } from 'vite'; interface ObfuscatorOptions { compact?: boolean; controlFlowFlattening?: boolean; deadCodeInjection?: boolean; debugProtection?: boolean; disableConsoleOutput?: boolean; identifierNamesGenerator?: 'hexadecimal' | 'mangled' | 'dictionary'; selfDefending?: boolean; stringArray?: boolean; stringArrayEncoding?: Array<'none' | 'base64' | 'rc4'>; stringArrayThreshold?: number; // ... 更多选项 } interface ObfuscatorConfig { options?: ObfuscatorOptions; } function obfuscator(config?: ObfuscatorConfig): Plugin; export default obfuscator;}
5、常见问题
代码混淆后报错?
- 检查是否有动态代码执行(如 `eval`)
- 某些第三方库可能不兼容混淆
- 可以在 `vite.config.ts` 中调整混淆选项或排除特定文件
## ESLint 代码检查集成
[参考文档](https://eslint.org/)
1、安装
npm install eslint @eslint/js typescript-eslint -Dnpm install eslint-plugin-react-hooks eslint-plugin-react-refresh -D
2、配置
// eslint.config.jsimport 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 [ js.configs.recommended, ...tseslint.configs.recommended, { plugins: { 'react-hooks': reactHooks, 'react-refresh': reactRefresh, }, rules: { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', 'react-refresh/only-export-components': 'warn', }, },];
## Prettier 代码格式化集成
- 它会帮助你保持团队代码风格的一致性 [官方文档](https://prettier.io/)
1、安装
2、配置
- 1、创建 Prettier 配置文件
在项目根目录创建 .prettierrc 文件:
// .prettierrc{ "semi": true, "trailingComma": "es5", "singleQuote": true, "printWidth": 100, "tabWidth": 2, "useTabs": false, "bracketSpacing": true, "arrowParens": "always"}
- 2、创建忽略文件
创建 .prettierignore 文件,指定不需要格式化的文件:
# 构建目录distbuild.out# 依赖目录node_modules# 缓存目录.cache# 系统文件.DS_Store# 环境配置.env.env.local.env.development.local.env.test.local.env.production.local# 其他*.min.js*.min.css
- 3、配置 package.json 脚本
// package.json [npm run format] 运行项目代码格式化命令{ "scripts": { "format": "prettier --write .", "format:check": "prettier --check ." }}
3、VS Code 配置
在 `.vscode/settings.json` 中配置:
{ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true}
4、使用示例
1、命令行使用
# 格式化所有文件npm run format# 检查格式(不修改文件)npm run format:check
2、手动格式化
- 快捷键:`Shift + Alt + F` (Windows/Linux) 或 `Shift + Option + F` (Mac)
5、常见问题
Prettier 格式化不生效?
- 安装 VS Code 插件:`Prettier - Code formatter`
- 检查 `.prettierrc` 配置文件是否存在
- 确保文件不在 `.prettierignore` 中
## vite-plugin-mock服务集成
参考文档
https://github.com/vbenjs/vite-plugin-mock/blob/main/README.zh_CN.md
- 此插件源于vite,提供本地和生产模拟服务。
- vite 的数据模拟插件,是基于 vite.js 开发的。 并同时支持本地环境和生产环境。
1、安装
`npm install mockjs vite-plugin-mock -D`
2、配置
- 1、在`vite.config.ts`中进行下方写法配置,属性值可参考github上官方文档
const env = loadEnv(mode, process.cwd()); const runMode = mode; const isMock = runMode === "mock"; return{ plugins: [ react() as PluginOption, // mock环境 viteMockServe({ mockPath: 'mock', watchFiles: true, enable: isMock, }) ], }
- 2、根目录新建mock文件夹,具体结构可参考下方,详细代码可参考同级目录的 react19_ts项目
---mock-----login--------index.ts-----index.ts
- 3、`package.json`项目mock启动配置
"scripts": {"mock": "vite --mode mock",},
## uuid生成库
[参考文档](https://www.npmjs.com/package/uuid)
1、安装
2、配置
- 新建uuid公用函数,对插件的功能进行包装使用
- 参考项目内目录:src/utils/uuid.ts
## 包管理工具推荐
npm(默认)
pnpm(推荐)
[参考文档](https://pnpm.io/zh/)
# 安装 pnpmnpm install -g pnpm# 配置镜像源(可选)pnpm config set registry https://registry.npmmirror.com# 安装依赖pnpm install# 启动项目pnpm run dev
优势:
- 节省磁盘空间(硬链接机制)
- 安装速度更快
- 更严格的依赖管理
## 可视化图表库
[参考文档](https://echarts.apache.org/handbook/zh/basics/download)
1、安装
2、配置
- 新建uuid公用函数,对插件的功能进行包装使用
- 参考项目内目录:src/utils/uuid.ts
依赖版本说明
当前项目主要依赖版本:
| 依赖 | 版本 | 说明 || ---------------- | ------- | -------------- || react | ^19.2.0 | React 核心库 || react-dom | ^19.2.0 | React DOM 渲染 || react-router-dom | ^7.12.0 | React 路由 || zustand | ^5.0.9 | 状态管理 || antd | ^6.1.4 | UI 组件库 || axios | ^1.13.2 | HTTP 客户端 || tailwindcss | ^4.1.18 | 原子化 CSS || vite | ^7.2.4 | 构建工具 || typescript | ~5.9.3 | TypeScript |
## md文档操作库
- [react-markdown](https://www.npmjs.com/package/react-markdown)
- md文档GFM 特性增强
[remark-gfm](https://www.npmjs.com/package/remark-gfm)
1、安装
`npm i react-markdown``npm i remark-gfm`
2、配置
- 建议封装为公用组件使用
3、使用示例
import ReactMarkdown from "react-markdown";import remarkGfm from "remark-gfm";<ReactMarkdownremarkPlugins={[remarkGfm]}> {docContent}</ReactMarkdown>
常见问题
1. 依赖安装失败?
# 清除缓存npm cache clean --force# 删除 node_modules 和 lock 文件rm -rf node_modules package-lock.json# 重新安装npm install
2. TypeScript 类型错误?
确保安装了对应的 `@types` 包:
npm install @types/node @types/react @types/react-dom -D
3. Vite 环境变量读取不到?
- 环境变量必须以 `VITE_` 开头
- 使用 `import.meta.env.VITE_XXX` 访问
- 在 `vite.config.ts` 中使用 `loadEnv` 加载