当前位置: 首页 > news >正文

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

方式一:使用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.developmentVITE_API_URL=http://localhost:3000/api

 

// .env.productionVITE_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;

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

相关文章:

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

方式一&#xff1a;使用create-react-app命令创建项目 1、使用以下命令初始化一个空的npm 项目 npm init -y 2、输入以下命令安装React npm i create-react-app ps:如果失败的话尝试&#xff08;1&#xff1a;使用管理员身份执行命令&#xff08;2&#xff1a;切换镜像重…...

HTTP状态码301(永久重定向)不同Web服务器的配置方法

文章目录 301状态码通常在那些情况下使用301永久重定向配置Nginx配置301永久重定向Windows配置IIS301永久重定向PHP下的301重定向Apache服务器实现301重定向 301重定向是否违反相关法规&#xff1f;推荐阅读 当用户或搜索引擎向服务器发出浏览请求时&#xff0c;服务器返回的HT…...

vue-element-admin项目部署 nginx动态代理 含Docker部署、 Jenkins构建

介绍三种方式&#xff1a; 1.直接部署到nginx中 2.用nginx docker镜像部署 3.使用Jenkins构建 1.直接用nginx部署 vue-element-admin项目下有两个.env文件&#xff0c;.env.production是生产环境的&#xff0c;.env.developpment是开发环境的 vue-element-admin默认用的是mock数…...

使用Python来写模拟Xshell实现远程命令执行与交互

一、模块 这里使用的是 paramiko带三方库 pip install paramiko二、效果图 三、代码实现&#xff08;这里的IP&#xff0c;用户名&#xff0c;密码修改为自己对应服务器的&#xff09; import paramiko import timeclass Linux(object):# 参数初始化def __init__(self, ip, us…...

mybatis 数据库字段为空or为空串 忽略条件过滤, 不为空且不为空串时才需nameParam过滤条件

name未配置视为不考虑name条件 select * from user where (( (ISNULL(name)) OR (name) ) OR name #{user.nameParam} ) 三个or语句 推荐这个 select * from user where ISNULL(name) OR name OR name #{user.nameParam} select * from user where ISNULL(name) OR …...

【玩玩Vue】通过vue-store实现枚举管理,用于下拉选项和中英文翻译等

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、store基础用法1.在src下新建store文件夹&#xff0c;在store下新建module文件夹2.在module下新建enums.js文件3.在store下新建getters.js…...

ISCSI:后端卷以LVM 的方式配置 ISCSI 目标启动器

写在前面 准备考试整理相关笔记博文内容涉及使用 LVM 做ISCSI 目标后端块存储 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#…...

八公山豆腐发展现状与销售对策研究

1.引言 八公山豆腐作为中国传统特色食品之一&#xff0c;一直以来备受人们的喜爱。然而&#xff0c;在现代社会中&#xff0c;由于消费者对于营养健康的追求以及市场竞争的加剧&#xff0c;八公山豆腐的市场份额逐渐缩小。因此&#xff0c;为了更好地推广和发展八公山豆腐&…...

排序算法-插入排序

属性 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时用array[i]的排序码与array[i1],array[i-2],…的排序码顺序进行比较&#xff0c;找到插入位置即将array[i]插入&#xff0c;原来位置上的元素顺序后移 直接插入排序…...

多位数按键操作(闪烁)数码管显示

/*----------------------------------------------- 内容&#xff1a;按键加减数字&#xff0c;多个数码管显示 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含特殊功能寄存…...

MyEclipse项目导入与导出

一、项目导出 1、右键选择项目名称&#xff0c;弹出菜单中选择“export”&#xff0c;如下图所示 2、选择“恶心“export”&#xff0c;弹出菜单如下&#xff1b;在“General“选项中&#xff0c;选择“File System”选项 3、点击“next”&#xff0c;进入保存位置选择界面&am…...

ArrayList和LinkedList

最近在刷回溯算法时&#xff0c;遇见了List<Integer> A new ArrayList<>(); LinkedList<Integer> B new LinkedList<>();这类型的表达方式 很好奇的问题是&#xff1a; 1、List<Integer> A new ArrayList<>();为什么是正确的写法 2…...

Linux 配置 Nginx 服务完整详细版

目录 前言 配置Nginx监听端口和服务器块 # 防DDoS配置 # 日志配置 # 设置服务器块 监听端口 网站根目录 默认文件 静态文件目录 图像文件目录 # 自定义错误页面 # 反向代理配置 # 配置SSL/TLS 1、获取SSL/TLS证书 2、安装证书 3、配置SSL/TLS # 配置SSL协议版本…...

Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…...

无涯教程-JavaScript - ODD函数

描述 ODD函数返回四舍五入到最接近的奇数整数的数字。 ODD函数是Excel中的15个舍入函数之一。 语法 ODD (number)争论 Argument描述Required/OptionalNumberThe value to round.Required Notes 无论数字的符号如何,值都将从零舍入到下一个奇数。如果number是一个奇数整数…...

Easyui里的datagrid嵌入select下拉框

问题&#xff1a; 想使用datagird里嵌入select下拉框&#xff0c;并在提交form表单时获取datagrid选中的每行数据里的每个下拉框选中的值。 解决方案&#xff1a; 其中economicIssuesSelect使用下拉框&#xff0c;重点关注 initEconomicIssues(row)方法。这里的方法需要传递ro…...

计算机专业毕业设计项目推荐03-Wiki系统设计与实现(JavaSpring+Vue+Mysql)

Wiki系统设计与实现&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设…...

微服务的艺术:构建可扩展和弹性的分布式应用

文章目录 什么是微服务架构&#xff1f;微服务的设计原则1. 基于业务边界划分服务2. 松耦合和强内聚3. 自动化测试和部署4. 监控和日志5. 弹性设计 微服务的实施细节1. 服务发现示例代码&#xff1a;使用Consul进行服务发现 2. 负载均衡示例代码&#xff1a;Nginx配置负载均衡 …...

在PHP8中对数组进行排序-PHP8知识详解

在php8中&#xff0c;提供了丰富的排序函数&#xff0c;可以对数组进行排序操作。常见的排序函数如下几个&#xff1a;sort() 函数、rsort() 函数、asort() 函数、arsort() 函数、ksort() 函数、krsort() 函数、natsort()函数和natcascsort()函数。 1、sort() 函数&#xff1a;…...

Redis混合模式持久化原理

前言 前面文章中我们也介绍过Redis的持久化方式有两种&#xff1a;rdb持久化和aof持久化&#xff0c;具体详情可查看之前文章redis持久化。rdb持久化还是aof持久化它们都有各自的缺点。 rdb和aof缺点 rdb持久化&#xff1a;由于是定期对内存数据快照进行持久化&#xff0c;因此…...

利用JT808/JT1078协议快速构建车辆监控系统:从协议解析到第三方平台集成

1. 理解JT808/JT1078协议的核心价值 车辆监控系统的开发离不开行业标准协议的支持。JT808和JT1078就是交通部颁布的两项关键协议&#xff0c;它们定义了车载终端与监控平台之间的通信规范。简单来说&#xff0c;JT808主要负责车辆定位数据的传输&#xff0c;比如位置、速度、方…...

从零开始掌握SIL验算实战——基于HAZOPkit的完整流程解析

1. 什么是SIL验算&#xff1f;为什么需要HAZOPkit&#xff1f; 第一次接触SIL验算的朋友可能会被这个专业术语吓到。其实简单来说&#xff0c;SIL&#xff08;安全完整性等级&#xff09;验算就像给工厂的安全系统做"体检报告"。想象一下&#xff0c;工厂里那些负责紧…...

【GAN】深入解析Mode Collapse与Mode Dropping:成因与应对策略

1. 什么是Mode Collapse与Mode Dropping 我第一次用GAN生成人脸图片时&#xff0c;遇到了一个奇怪现象&#xff1a;不管怎么调整参数&#xff0c;生成器总是输出几乎相同的几张脸。这就是典型的Mode Collapse&#xff08;模式崩溃&#xff09;。后来在另一个项目中&#xff0c;…...

Youtu-Parsing快速上手:上传图片即得结构化文本,RAG预处理神器

Youtu-Parsing快速上手&#xff1a;上传图片即得结构化文本&#xff0c;RAG预处理神器 1. 为什么需要文档智能解析&#xff1f; 在日常工作中&#xff0c;我们经常遇到这样的场景&#xff1a; 收到一份扫描的合同PDF&#xff0c;需要提取关键条款拿到手写的会议记录&#xf…...

SiameseUIE完整指南:test.py可扩展性设计——支持批量文本处理改造

SiameseUIE完整指南&#xff1a;test.py可扩展性设计——支持批量文本处理改造 1. 为什么需要改造test.py&#xff1f; SiameseUIE镜像开箱即用&#xff0c;但原始test.py只面向单次验证场景&#xff1a;它内置5个固定测试样例&#xff0c;逐条运行、逐条打印结果&#xff0c…...

CODESYS开发实战:字符串处理在工业自动化中的高效应用

1. 工业自动化中的字符串处理挑战 在工业自动化项目中&#xff0c;字符串处理就像设备间的"普通话"——HMI界面上的报警信息、设备间的通信协议、生产数据的记录报表&#xff0c;都离不开字符串的拼接、解析和转换。我经历过一个典型的坑&#xff1a;某次设备联调时&…...

【毕设】java-springboot+vue的漫画信息管理网站

&#x1f49f;博主&#xff1a;程序员俊星&#xff1a;CSDN作者、博客专家、全栈领域优质创作者 &#x1f49f;专注于计算机毕业设计&#xff0c;大数据、深度学习、Java、小程序、python、安卓等技术领域 &#x1f4f2;文章末尾获取源码数据库 &#x1f308;还有大家在毕设选题…...

ESP32-C3智能插座:支持Matter协议的嵌入式电能计量方案

1. 项目概述计量版智能插座&#xff08;主控ESP32-C3&#xff0c;支持Matter&#xff09;是一个面向家庭自动化场景的高集成度嵌入式电力监控终端。其核心目标是将传统墙壁插座升级为具备实时电参数测量、远程控制、语音交互与跨平台生态兼容能力的智能节点。本项目并非概念验证…...

架构不是套娃:为什么简单的代码胜过无脑的层次

在软件开发中&#xff0c;我们常常被教导要“优化架构”、“抽象层次”、“面向未来”。于是&#xff0c;很多人养成了一个习惯&#xff1a;无论功能多简单&#xff0c;先搭几层抽象再说——接口、实现类、工厂、策略、服务层……文件夹层层嵌套&#xff0c;类名整整齐齐&#…...

专业提供角膜塑形镜的企业

直接回答无锡际马眼视光是一家专业提供角膜塑形镜的公司&#xff0c;致力于为用户提供高质量的眼科解决方案。角膜塑形镜是一种夜间佩戴的硬性透气隐形眼镜&#xff0c;通过改变角膜形态来暂时矫正视力。深度解析&#xff1a;角膜塑形镜深度解析&#xff1a;搞懂这些&#xff0…...