• 用Vite从零到一创建React+ts项目


    方式一:使用create-react-app命令创建项目

    1、使用以下命令初始化一个空的npm 项目

    npm init -y 

    2、输入以下命令安装React

    npm i create-react-app

    ps:如果失败的话尝试(1:使用管理员身份执行命令(2:切换镜像重试

    3、输入以下命令创建项目

    1. create-react-app 项目文件夹名称 --template typescript
    2. //如果不想用ts --template typescript 可以不加

    4、然后根据终端界面上的提示命令就可以打开项目了

    接下来就是一些配置、路由、网络封装什么的。

    方法二:使用vite创建项目(简单快捷)

    1、执行以下命令

    npm create vite 项目文件夹名称

    选择自己想要的一些框架和配置

    2、根据提示执行对应命令就可以打开项目了

    接下来就是一些配置、路由、网络封装什么的。

    关于配置

    1、打开vite官网进行vite的相关一些配置 配置 Vite | Vite 官方中文文档
    (1 配置路径别名 需要安装path
    npm i @types/node --save-dev

     在vite.config.ts 引入path加上下面的代码片段

    1. import { defineConfig } from 'vite';
    2. import react from '@vitejs/plugin-react';
    3. import {resolve} from "path";
    4. export default defineConfig({
    5. plugins: [react()],
    6. resolve:{
    7. alias:{
    8. "@":resolve(__dirname,'src')
    9. }
    10. }
    11. })

    同时在tsconfig.json 让IDE能识别这个别名

    1. "compilerOptions": {
    2. "paths": {
    3. "@/*":["./src/*"]
    4. }
    5. },
    2、执行下列命令安装less 
    npm install less

    然后在vite.config.ts中进行相关配置

    1. export default defineConfig({
    2. plugins: [react()],
    3. resolve: {
    4. alias: {
    5. '@': resolve(__dirname,'src')
    6. }
    7. },
    8. css: {
    9. preprocessorOptions: {
    10. less: {
    11. javascriptEnabled: true,
    12. }
    13. }
    14. }
    3、不同环境打包后端接口地址不同相关配置
    (1 在你的项目根目录中创建 .env.development 和 .env.production 文件,分别用于开发环境和生产环境的配置。
    1. // .env.development
    2. VITE_API_URL=http://localhost:3000/api

     

    1. // .env.production
    2. VITE_API_URL=https://example.com/api
    (2 修改网络封装请求中的baseUrl改成
    const apiUrl = import.meta.env.VITE_API_URL as string;
     (3 在 package.json 的 scripts 中添加如下命令
    1. {
    2. "scripts": {
    3. "dev": "vite --mode development",
    4. "build": "vite --mode production"
    5. }
    6. }

    关于路由

    1、执行下列命令安装router
    npm i react-router-dom@6
    (1 在src文件目录下创建router文件夹 

    然后在router文件夹下创建index.tsx文件

    /src/router/index.tsx

    1. import type { RouteObject,} from 'react-router-dom';
    2. import { Navigate } from "react-router-dom";
    3. import { lazy } from 'react';
    4. const Home = lazy(() => import('@/pages/Home'));
    5. const NotFound = lazy(() => import('@/pages/NotFound'));//使用路由懒加载优化提升
    6. const routes: RouteObject[] = [
    7. {
    8. path: "/",
    9. element: <Navigate to="/home" />,
    10. },
    11. {
    12. path: '/404',
    13. element: <NotFound />,
    14. },
    15. {
    16. path: '/home',
    17. element: <Home />,
    18. // children: [
    19. // {
    20. // index : true,
    21. // element:
    22. // },
    23. // {
    24. // path: "/about",
    25. // element: ,
    26. // children: [
    27. // { index : true, element: },
    28. // { path : "/about/:id", element :}
    29. // ]
    30. // },
    31. // {
    32. // path: "/bussiness",
    33. // element: ,
    34. // }
    35. // ]
    36. },
    37. ];
    38. export default routes;
    (2 在scr/App.tsx文件中加入
    1. import React from 'react';
    2. import './App.css';
    3. import { useRoutes } from 'react-router';
    4. import routes from './route';
    5. function App() {
    6. return (
    7. <div className="App">
    8. {useRoutes(routes)}
    9. div>
    10. );
    11. }
    12. export default App;
    (3 在scr/main.tsx文件中配置路由模式
    1. import React from 'react';
    2. import ReactDOM from 'react-dom/client';
    3. import App from './App';
    4. import './index.css';
    5. import { BrowserRouter } from 'react-router-dom';
    6. ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
    7. <React.StrictMode>
    8. <BrowserRouter>
    9. <App />
    10. BrowserRouter>
    11. React.StrictMode>
    12. );

    关于网络请求封装

    1、先安装Axios库
    npm install axios @types/axios
    (1 在src目录下创建apis文件夹接着创建api.tsx文件夹 用于封装网络请求逻辑
    1. import axios from 'axios';
    2. import {baseInfo} from "../common/config";
    3. import {getToken,removeToken,} from "../common/storage";
    4. export function requestAdmin(config){
    5. let Token = getToken();
    6. if(Token){
    7. config.headers={
    8. ...config.headers,
    9. 'Token' : `${Token}`,
    10. 'Authorization' : `token`,
    11. }
    12. }
    13. const instance = axios.create({
    14. baseURL:"",
    15. headers:{...config.headers},
    16. timeout:100000
    17. });
    18. // axios请求拦截器 请求
    19. instance.interceptors.request.use(config=>{return config;},err=>{console.log(err);})
    20. // axios响应拦截器 数据返回
    21. instance.interceptors.response.use(res=>{
    22. let {code,message} = res.data;
    23. //判断用户登录的token是否过期做某些操作
    24. if(code === ...){
    25. }
    26. return res;
    27. },err=>{
    28. console.log(err);
    29. })
    30. return instance(config);
    31. }
    (2 接口统一封装
    1. //引用axios封装函数
    2. import {requestAdmin} from "@/network/request";
    3. /**
    4. * 登录
    5. * @param data
    6. */
    7. export function doLogin(data:any){
    8. return requestAdmin({
    9. url:"",
    10. data,
    11. method:"post"
    12. })
    13. }

     (3 使用

    1. //引入network的网络请求接口
    2. import { requestLogin } from "@/network/v1/login/index"
    3. interface InitProps{}
    4. const Login:FC<InitProps> = (props:InitProps)=>{
    5. const onLogin = (values: any) => {
    6. let data = {};
    7. requestLogin(data).then((res: resInterface) => {
    8. let { code, data,message } = res.data;
    9. if (code === 200) {
    10. showSuccess('登录成功');
    11. setToken(data.token);
    12. setTimeout(_ =>{
    13. setLoading(false)
    14. },1000)
    15. } else {
    16. showError(`${message}`);
    17. setLoading(false)
    18. }
    19. }).catch((err:any) => {
    20. console.log(err);
    21. })
    22. };
    23. return (
    24. <React.Fragment>
    25. <Button onClick={onLogin}>去登录Button>
    26. React.Fragment>
    27. )
    28. }
    29. export default Login;

    关于UI框架配置

    这里可以自行选择适合自己的框架类似于antd、Material UI...等

    这里我选的是移动端Material UI 官方文档 Installation - Material UI

    (1 先安装框架
    npm install @mui/material @emotion/react @emotion/styled
    (2 引入框架与使用(按需引入)
    1. import { useState } from 'react';
    2. import { Button } from '@mui/material';
    3. import Container from '@mui/material/Container';
    4. import { styled } from '@mui/material/styles';
    5. import Box from '@mui/material/Box';
    6. import Paper from '@mui/material/Paper';
    7. import Grid from '@mui/material/Grid';
    8. function Home() {
    9. const [count, setCount] = useState(0);
    10. const Item = styled(Paper)(({ theme }) => ({
    11. backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff',
    12. ...theme.typography.body2,
    13. padding: theme.spacing(1),
    14. textAlign: 'center',
    15. color: theme.palette.text.secondary,
    16. }));
    17. return (
    18. <Container fixed>
    19. <Box sx={{ flexGrow: 1 }}>
    20. <Grid container spacing={2}>
    21. <Grid item xs={12}>
    22. <Item>banner区域Item>
    23. Grid>
    24. <Grid item xs={12}>
    25. <Item>广告区域Item>
    26. Grid>
    27. <Grid item xs={4}>
    28. <Item>xs=4Item>
    29. Grid>
    30. <Grid item xs={8}>
    31. <Item>xs=8Item>
    32. Grid>
    33. Grid>
    34. Box>
    35. Container>
    36. );
    37. }
    38. export default Home;

    以上就是所有内容,感谢阅读。

  • 相关阅读:
    说说你对单例模式的理解?如何实现?
    C# 结构体介绍
    接口请求合并的 3 种技巧,性能直接爆表
    给使用docker安装的ES和Kibana设置账号密码
    可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享
    C 语言 break和continue语句
    Mysql之存储引擎
    Springboot列车调度信息系统的设计与实现4guf9计算机毕业设计-课程设计-期末作业-毕设程序代做
    软考高项-质量大师的观点
    JUC并发编程——Volatile详解(基于狂神说的学习笔记)
  • 原文地址:https://blog.csdn.net/weixin_45822952/article/details/132964043