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

2023-09-18 14:18:09

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

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

npm init -y 

2、输入以下命令安装React

npm i create-react-app

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

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

create-react-app 项目文件夹名称 --template typescript

//如果不想用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加上下面的代码片段

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import {resolve} from "path";
export default defineConfig({
  plugins: [react()],
  resolve:{
    alias:{
      "@":resolve(__dirname,'src')
    }
  }
})

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

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

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


export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': resolve(__dirname,'src')
    }
  },
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true,
      }
    }
  }
3、不同环境打包后端接口地址不同相关配置
(1 在你的项目根目录中创建 .env.development 和 .env.production 文件,分别用于开发环境和生产环境的配置。
// .env.development

VITE_API_URL=http://localhost:3000/api

 

// .env.production

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

关于路由

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

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

/src/router/index.tsx

import type { RouteObject,} from 'react-router-dom';
import { Navigate } from "react-router-dom";
import { lazy } from 'react';

const Home = lazy(() => import('@/pages/Home'));
const NotFound = lazy(() => import('@/pages/NotFound'));//使用路由懒加载优化提升

const routes: RouteObject[] = [
  {
    path: "/",
    element: <Navigate to="/home" />,
  },
  {
    path: '/404',
    element: <NotFound />,
  },
  {
    path: '/home',
    element: <Home />,

    // children: [
    //     {
    //         index : true,
    //         element: <Home />
    //     },
    //     {
    //         path: "/about",
    //         element: <About />,
    //         children: [
    //             { index : true, element: <AboutIndex />},
    //             { path : "/about/:id", element :<AboutList />}
    //         ]
    //     },
    //     {
    //         path: "/bussiness",
    //         element: <Bussiness />,
    //     }
    // ]
  },
];

export default routes;
(2 在scr/App.tsx文件中加入

import React from 'react';
import './App.css';
import { useRoutes } from 'react-router';
import routes from './route';

function App() {
  return (
    <div className="App">
      {useRoutes(routes)}
    </div>
  );
}

export default App;
(3 在scr/main.tsx文件中配置路由模式
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';
import { BrowserRouter } from 'react-router-dom';
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
  <BrowserRouter>
      <App />
      </BrowserRouter>
  </React.StrictMode>
);

关于网络请求封装

1、先安装Axios库
npm install axios @types/axios
(1 在src目录下创建apis文件夹接着创建api.tsx文件夹 用于封装网络请求逻辑
import axios from 'axios';
import {baseInfo} from "../common/config";
import {getToken,removeToken,} from "../common/storage";
export function requestAdmin(config){
  let Token = getToken();
  if(Token){
    config.headers={
      ...config.headers,
      'Token' : `${Token}`,
      'Authorization' : `token`,
    }
  }

  const instance = axios.create({
    baseURL:"",
    headers:{...config.headers},
    timeout:100000
  });
  // axios请求拦截器 请求
  instance.interceptors.request.use(config=>{return config;},err=>{console.log(err);})
  // axios响应拦截器 数据返回
  instance.interceptors.response.use(res=>{
    let {code,message} = res.data;
    //判断用户登录的token是否过期做某些操作
    if(code === ...){
     
    }
  
    return res;
  },err=>{
    console.log(err);
  })
  return instance(config);
}
(2 接口统一封装
//引用axios封装函数
import {requestAdmin} from "@/network/request";

/**
 * 登录
 * @param data
 */
export function doLogin(data:any){
    return requestAdmin({
        url:"",
        data,
        method:"post"
    })
}

 (3 使用

//引入network的网络请求接口
import { requestLogin } from "@/network/v1/login/index"
interface InitProps{}
const Login:FC<InitProps> = (props:InitProps)=>{
const onLogin = (values: any) => {
        let data = {};
        requestLogin(data).then((res: resInterface) => {
            let { code, data,message } = res.data;
            if (code === 200) {
                showSuccess('登录成功');
                setToken(data.token);
                setTimeout(_ =>{
                    setLoading(false)
                },1000)
            } else {
                showError(`${message}`);
                setLoading(false)
            }
        }).catch((err:any) => {
            console.log(err);
        })
    };
	return (
        <React.Fragment>
		<Button onClick={onLogin}>去登录</Button>
		</React.Fragment>
        )
}

export default Login;

关于UI框架配置

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

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

(1 先安装框架
npm install @mui/material @emotion/react @emotion/styled
(2 引入框架与使用(按需引入)
import { useState } from 'react';
import { Button } from '@mui/material';

import Container from '@mui/material/Container';
import { styled } from '@mui/material/styles';
import Box from '@mui/material/Box';
import Paper from '@mui/material/Paper';
import Grid from '@mui/material/Grid';

function Home() {
  const [count, setCount] = useState(0);

  const Item = styled(Paper)(({ theme }) => ({
    backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff',
    ...theme.typography.body2,
    padding: theme.spacing(1),
    textAlign: 'center',
    color: theme.palette.text.secondary,
  }));

  return (
    <Container fixed>
      <Box sx={{ flexGrow: 1 }}>
        <Grid container spacing={2}>
          <Grid item xs={12}>
            <Item>banner区域</Item>
          </Grid>
          <Grid item xs={12}>
            <Item>广告区域</Item>
          </Grid>
          <Grid item xs={4}>
            <Item>xs=4</Item>
          </Grid>
          <Grid item xs={8}>
            <Item>xs=8</Item>
          </Grid>
        </Grid>
      </Box>
    </Container>
  );
}

export default Home;

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

更多推荐

JMeter 常见函数讲解

当使用JMeter进行性能测试或负载测试时,函数是一个非常有用的工具,可以帮助生成动态的测试数据或处理测试结果。下面是一些常用的JMeter函数的详细讲解和并列示例:1、__threadNum:返回当前线程的编号。可以在测试过程中用于生成唯一的标识符或动态数据。生成唯一的用户名:${__threadNum}-user动

MySQL

数据库分两大类:关系型数据SQL非关系型数据库NoSQL关系型数据库典型代表:MySQLMariaDBPostgreSQL(pgsql)OracleSQLServerDB2国产数据库:阿里云RDB华为高斯阿里Oceanbase腾讯TDBA1.SQLSQL(StructuredQueryLanguage)是具有数据操纵和

Spring-动态代理深入了解

😀前言本篇的Spring-AOP系类文章第二篇扩展了Spring-动态代理然后开发了简易的AOP类🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓

Nginx服务优化措施、网页安全与配置防盗链

目录一.优化Nginx二.隐藏/查看版本号隐藏版本号方法一:修改配置文件,关闭版本号隐藏版本号方法二:修改源码文件中的版本号,重新编译安装三.修改用户与组四.设置缓存时间五.日志切割脚本六.设置连接超时控制连接访问时间七.开启多进程八.配置网页压缩九.配置防盗链9.1.配置web源主机(192.168.47.103)9

【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )

文章目录一、RDD#map方法1、RDD#map方法引入2、RDD#map语法3、RDD#map用法4、代码示例-RDD#map数值计算(传入普通函数)5、代码示例-RDD#map数值计算(传入lambda匿名函数)6、代码示例-RDD#map数值计算(链式调用)一、RDD#map方法1、RDD#map方法引入在PyS

API网关是如何提升API接口安全管控能力的

API安全的重要性近几年,越来越多的企业开始数字化转型之路。数字化转型的核心是将企业的服务、资产和能力打包成服务(服务的形式通常为API,API又称接口,下文中提到的API和接口意思相同),从而让资源之间形成更强的连接和互动关系,释放原有资产的价值,提升企业的服务能力。企业数字化转型使得基于API的业务系统剧增,随之而

RK3568笔记分享之“如何挂载SPI FRAM铁电存储芯片”——飞凌嵌入式

对于做快速存储采集数据类产品的用户来说,在处理突发掉电情况时需要保存现有数据并避免数据丢失,这种情况下有很多种解决方案,铁电存储器(FRAM)就是个很好的选择。FRAM是一种具有快速写入速度的非易失性存储器,既可以进行非易失性数据存储,又可以像RAM一样操作。本文将借助飞凌嵌入式OK3568-C开发板来为大家介绍一种采

周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来,周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用,通过AI智能检测与视频智能分析技术,现代化的周界安防系统可以做到全天候快速、准确地发现入侵等异常事件,并及时报警遏制。今天我们来介绍下旭帆科技安全生产周界警戒AI算法的具

[2023.09.18]: Rust中类型转换在错误处理中的应用解析

随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。Rust抽象出来了Result<T,E>,T是返回值的类型,E是错误类型。只要函数的返回值的类型被定义为Resut<T,E>,那么作为开发人员就有责任来处理调用这个函数可能发生的错误。通过Res

CIIS 2023丨聚焦文档图像处理前沿领域,合合信息AI助力图像处理与内容安全保障

近日,2023第十二届中国智能产业高峰论坛(CIIS2023)在江西南昌顺利举行。大会由中国人工智能学会、江西省科学技术厅、南昌市人民政府主办,南昌市科学技术局、中国工程科技发展战略江西研究院承办。本次大会重点关注AI大模型、生成式AI、无人系统、智能制造、数字安全等领域,汇集了来自中国工程院、国际欧亚科学院、国际核能

聚观早报|高德发布安全出行大模型;小鹏G9焕新上市

【聚观365】9月21日消息高德发布安全出行大模型小鹏G9焕新上市妙鸭相机上线免费版RedmiNote13Pro+支持IP68Neuralink将进行首次人体临床试验高德发布安全出行大模型高德发布了安全出行大模型。据介绍,安全出行大模型基于高德的地图大数据、位置大数据、导航大数据、智能决策系统等能力,从风险识别、风险预

热文推荐