从0搭建react+ts+redux+axios+antd项目

news2025/1/31 3:10:30

文章目录

  • 一、安装及初始化
  • 二、TypeScript配置
  • 三、Webpack配置
  • 四、Prettier统一编码风格
  • 五、使用less
  • 六、Antd 安装及使用
  • 七、添加Router及配置
  • 八、安装axios
  • 九、添加redux及使用

本文介绍了如何用creat-react-app脚手架搭建一个react项目的基本结构,同时配置webpack、typescript、antd、axios、redux等常用的库,比较适合小白入门。

本文项目代码下载:https://download.csdn.net/download/ganyingxie123456/88800965

(如果要跟着实现的话,建议下载哦参考哦~)

一、安装及初始化

1、create-react-app脚手架版本查看:create-react-app -V
在这里插入图片描述
如果没有安装create-react-app脚手架,可执行安装命令:npm install -g create-react-app
2、新建一个新项目:npx create-react-app react-test-2 --template typescript
在这里插入图片描述
在这里插入图片描述
3、运行项目:cd react-test-1 > npm start
在这里插入图片描述

二、TypeScript配置

写给 React 开发者的 TypeScript 指南:https://www.freecodecamp.org/chinese/news/typescript-for-react-developers/

通过create-react-app脚手架生成的项目,会自动生成 tsconfig.json ,并且默认带有一些最基本的配置,更多配置可查阅 TypeScript 中文手册,配置适合自己的tsconfig,本文配置如下:

{
  "compilerOptions": {
    "target": "es5", // 指定 ECMAScript 版本
    "lib": [ // 要包含在编译中的依赖库文件列表
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true, // 允许编译 JavaScript 文件
    "skipLibCheck": true, // 跳过所有声明文件的类型检查
    "esModuleInterop": true, // 禁用命名空间引用(import * as fs from "fs"),启用CJS/AMD/UMD风格引用(import fs from "fs")
    "allowSyntheticDefaultImports": true, // 允许从没有默认导出的模块进行默认导入
    "strict": true, // 启用所有严格类型检查选项
    "forceConsistentCasingInFileNames": true, // 禁止对同一个文件的不一致的引用
    "noFallthroughCasesInSwitch": true, // 报告switch语句的fallthrough错误。(即不允许switch的case语句贯穿)
    "module": "esnext", // 指定模块代码生成
    "moduleResolution": "node", // 使用 Node.js 风格解析模块
    "resolveJsonModule": true, // 允许使用 .json 扩展名导入的模块
    "isolatedModules": false, // 将每个文件作为单独的模块
    "noEmit": true, // 不输出(意思是不编译代码,只执行类型检查)
    "jsx": "react-jsx",
    "noUnusedLocals": true, // 报告未使用的本地变量的错误
    "noUnusedParameters": false // 报告未使用参数的错
  },
  "include": [ // 应该进行类型检查的文件
    "src"
  ],
  "exclude": ["node_modules"] // 不进行类型检查的文件
}

三、Webpack配置

webpack中文文档地址:https://www.webpackjs.com/concepts/

通过create-react-app脚手架搭建的项目其中的webpack配置文件都是被封装起来的,要修改webpack配置,一般有以下3种方法:

1)通过 CRA 官方支持的 --scripts-version 参数,创建项目时使用自己重写过的 react-scripts 包;
2) 使用 react-app-rewired + customize-cra 组合覆盖配置;
-3)使用 craco 覆盖配置。

本文中我们通过craco 来修改。
1、引入craco:npm i @craco/craco
2、在项目目录下新增craco.config.ts文件

// craco.config.ts

const path = require("path");

const pathResolve = (pathUrl: string) => path.join(__dirname, pathUrl);

module.exports = {
  reactScriptsVersion: "react-scripts",
  // babel配置
  babel: {
    // babel插件
    plugins: [],
    // babel-loader选项
    loaderOptions: {},
  },
  // 插件配置
  plugins: [],
  // webpack配置
  webpack: {
    // 别名配置
    alias: {
      "@": pathResolve("src"),
    },
    // 修改webpack配置
    configure: (webpackConfig: any, { env }: any) => {
      // 在此处修改
      return webpackConfig;
    },
  },
  // 本地服务器配置
  devServer: {
    port: 3005, // 本地服务的端口号,如果package.json中配置了端口号,会覆盖package.json
    proxy: {
      "/api": {
        target: "http://localhost:3005",
        changeOrigin: true,
        secure: false,
        xfwd: false,
      },
    },
  },
};

caro更多配置可查看官网:https://github.com/dilanx/craco/blob/main/packages/craco/README.md

2、修改package.json文件

{
 "scripts": {
    "start": "set PORT=4000 & craco start",
    "build": "set GENERATE_SOURCEMAP=false & craco build",
    "test": "craco test",
    "eject": "craco eject"
  },
}

变量说明:

  • PORT 启动端口
  • GENERATE_SOURCEMAP 打包时是否生成 sourceMap

4、特别说明
react-scripts@2.1.0 开始,推荐使用其内置的配置覆盖机制(即 craco 或者直接编辑 react-scripts/config 中的文件)。但对于旧版本或者某些特定需求,react-app-rewired 仍然是一个实用的选择,具体使用步骤是:先执行安装命令 npm i react-app-rewired customize-cra -D,然后在项目目录下新增一个config-overrides.ts文件即可。

四、Prettier统一编码风格

  • 安装:npm i prettier -D

  • 在项目目录下新增:.prettierignore.prettierrc.ts

.prettierignore

# Ignore artifacts:
node_modules
dist
.prettierignore

.prettierrc.ts

module.exports = {
  // 一行代码的最大字符数,默认是80
  printWidth: 120,
  // tab宽度为2空格
  tabWidth: 2,
  // 是否使用tab来缩进,我们使用空格
  useTabs: false,
  // 结尾是否添加分号,false的情况下只会在一些导致ASI错误的其工况下在开头加分号,我选择无分号结尾的风格
  semi: true,
  // 使用单引号
  singleQuote: true,
  // 对象中key值是否加引号:as-needed在需要的情况下加引号,consistent是有一个需要引号就统一加,preserve是保留用户输入的引号
  quoteProps: "as-needed",
  // 在jsx文件中的引号需要单独设置
  jsxSingleQuote: false,
  // 尾部逗号设置,es5是尾部逗号兼容es5,none就是没有尾部逗号,all是指所有可能的情况,需要node8和es2017以上的环境
  trailingComma: "es5",
  // object对象里面的key和value值和括号间的空格
  bracketSpacing: true,
  // jsx标签多行属性写法时,尖括号是否另起一行
  jsxBracketSameLine: false,
  // 箭头函数单个参数的情况是否省略括号,默认always是总是带括号
  arrowParens: "avoid",
  // range是format执行的范围,可以选执行一个文件的一部分,默认的设置是整个文件
  rangeStart: 0,
  rangeEnd: Infinity,
  // vue script和style标签中是否缩进,开启可能会破坏编辑器的代码折叠
  vueIndentScriptAndStyle: false,
  // 行尾换行符,默认是lf,
  endOfLine: "auto",
  // 默认是auto,控制被引号包裹的代码是否进行格式化
  embeddedLanguageFormatting: "off",
};

五、使用less

  • 安装依赖:npm i less less-loader craco-less
  • craco.config.ts中新增plugins配置:
const CracoLess = require('craco-less');

module.exports = {
	 plugins: [
	   {
	     plugin: CracoLess,
	     options: {
	       lessLoaderOptions: {
	         lessOptions: {
	           javascriptEnabled: true,
	           modifyVars: {
	             "@primary-color": "#1890ff",
	           },
	         },
	       },
	     },
	   },
	 ],
}
  • 在项目目录下react-app-env.d.ts新增:
declare module "*.less" {
  const classes: { readonly [key: string]: string };
  export default classes;
}
declare module "*.module.less" {
  const classes: { readonly [key: string]: string };
  export default classes;
}

六、Antd 安装及使用

1、安装:npm i antd
2、在项目目录index.ts文件引入antd样式文件
在这里插入图片描述
3、使用antd,在页面引入组件即可

// APP.tsx
import "./App.less";
import { Button } from "antd";

function App() {
  return (
    <div className="App">
      <h1>Home Page</h1>
      <div className="content">
        <Button type="primary" danger>
          Antd Button
        </Button>
      </div>
    </div>
  );
}

export default App;
// App.less
.App {
  margin: 50px;
  .content {
    border: 1px solid pink;
  }
}

在这里插入图片描述

七、添加Router及配置

官网:https://baimingxuan.github.io/react-router6-doc/start/overview

React Router 是专为 React 设计的路由解决方案。它利用HTML5 的history API,来操作浏览器的 session history (会话历史)。

react-router包含3个库,react-routerreact-router-domreact-router-native

react-router提供最基本的路由功能,实际使用的时候我们不会直接安装react-router,而是根据应用运行的环境选择安装react-router-dom(在浏览器中使用)或react-router-native(在rn中使用)。

react-router-dom和react-router-native都依赖react-router,所以在安装时,react-router也会自动安装,创建web应用。

react-router中奉行一切皆组件的思想,路由器-Router、链接-Link、路由-Route、独占-Switch、重定向-Redirect 都以组件形式存在。

Route渲染优先级:children > component > render 。

  • 安装:npm i react-router-dom
    在这里插入图片描述
  • 使用示例
  1. 新建一个目录及文件:router/index.tsx
import React, { Component } from "react";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";

import App from "../views/App";
import Home from "../views/home";
import About from "../views/about";

const routeConfig = [
  {
    path: "/",
    component: <App />,
  },
  {
    path: "/home",
    component: <Home />,
  },
  {
    path: "/about",
    component: <About />,
  },
];

class RoutesConfig extends Component {
  render() {
    return (
      <Router>
        <Routes>
          {routeConfig.map((route) => (
            <Route
              path={route.path}
              element={route.component}
              key={route.path}
            />
          ))}
        </Routes>
      </Router>
    );
  }
}

export default RoutesConfig;
  1. 在项目入口文件引入路由配置文件
    在这里插入图片描述

八、安装axios

中文文档:https://www.axios-http.cn/docs/intro
安装:npm i axios -s
在这里插入图片描述

九、添加redux及使用

中文管网:https://cn.redux.js.org/tutorials/essentials/part-1-overview-concepts

redux不是项目必需的,如果你不确定是否需要,那就是不需要,在react无法实现时,再考虑。

  • 安装:npm i redux react-redux
    在这里插入图片描述
  • 使用
    新增以下文件
    在这里插入图片描述

redux/index.ts

import { createStore } from "redux";
import reducer from "./reducers";

const store = createStore(reducer);

export default store;

reducers.ts

import { ModifyAction } from "./actions";
import { ADD, LESSEN } from "./const";

// 对action进行限制,必须是在ModifyAction定义的
export default (state = 0, action: ModifyAction): number => {
  switch (action.type) {
    case ADD:
      return state + 1;
    case LESSEN:
      return state - 1;
    default:
      return state;
  }
};

action.ts

import { ADD, ADD_TYPE, LESSEN, LESSEN_TYPE } from "./const";

export interface ADDAction {
  type: ADD_TYPE;
}
export interface LESSENAction {
  type: LESSEN_TYPE;
}

export type ModifyAction = ADDAction | LESSENAction;

export const Add = () => ({
  type: ADD,
});

export const Lessen = () => ({
  type: LESSEN,
});

const.ts常量文件

// 定义state增加的
export const ADD = "ADD";
export type ADD_TYPE = typeof ADD;

// 定义state减少
export const LESSEN = "LESSEN";
export type LESSEN_TYPE = typeof LESSEN;

修改入口文件index.tsx
在这里插入图片描述
页面调用

import React, { Component } from "react";
import { connect } from "react-redux";
import { Dispatch } from "redux";

import { Add, Lessen } from "../../redux/actions";

import { Button } from "antd";

interface IProps {
  value?: number;
  handleAdd: () => void;
  handleMinus: () => void;
}

class Home extends Component<IProps> {
  public render() {
    const { value, handleAdd, handleMinus } = this.props;
    return (
      <div>
        <Button type="primary" onClick={handleAdd}>
          {value} + {" "}
        </Button>
        <Button type="primary" onClick={handleMinus}>
          {value} -{" "}
        </Button>
      </div>
    );
  }
}

// 将 reducer 中的状态插入到组件的 props 中
const mapStateToProps = (state: number): { value: number } => ({
  value: state,
});

// 将 对应action 插入到组件的 props 中
const mapDispatchToProps = (dispatch: Dispatch) => ({
  handleAdd: () => dispatch(Add()),
  handleMinus: () => dispatch(Lessen()),
});

// 使用 connect 高阶组件对 Counter 进行包裹
export default connect(mapStateToProps, mapDispatchToProps)(Home);

本文涉及内容散多较零散,建议可以对着demo代码看看~

代码下载:https://download.csdn.net/download/ganyingxie123456/88800965

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书客、米家、柏曼大路灯哪款好?多维度实测对比推荐!

每到寒暑假&#xff0c;各个论坛上出现“大路灯怎么选”的类似话题非常频繁&#xff0c;因为现在的孩子出来上学期间需要读写之外&#xff0c;在寒暑假时也在不断的学习&#xff0c;许多家长关注到孩子学习时的光线问题&#xff0c;担心影响到孩子的视力状况&#xff0c;都纷纷…

Java的Mysql使用

Java的Mysql使用 说明 通过Java的方式连接Mysql中的数据库&#xff0c;并对数据库中的数据进行增加 查询操作 ​ 使用Mysql所提供的第三方库中的类(Mysql的API) 对其进行操作 ​ 将Mysql Jar包添加到lib目录后&#xff0c;就可以使用其中的类对其Mysql数据库进行操作 Mysq…

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水 下一个更大元素II 503.下一个更大元素II 文章讲解&#xff1a;https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II.html 题目链接&#xff1a;https://…

2024年美赛 (C题MCM)| 温网积分 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的C题&#xff01; 完整内容可以在文章末尾领…

2024美赛数学建模F题思路分析 - 减少非法野生动物贸易

1 赛题 问题F&#xff1a;减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c;…

服务器C盘突然满了,是什么问题

随着时代的发展、互联网的普及&#xff0c;加上近几年云计算服务的诞生以及大规模普及&#xff0c;对于服务器的使用目前是非常普遍的&#xff0c;用户运维的主要对象一般也主要是服务器方面。在日常使用服务器的过程中&#xff0c;我们也会遇到各式各样的问题。最近就有遇到用…

SpringBoot RestTemplate 设置挡板

项目结构 代码 BaffleConfig /*** Description 记录配置信息* Author wjx* Date 2024/2/1 14:47**/ public interface BaffleConfig {// 是否开启挡板的开关public static boolean SWITCH true;// 文件根目录public static String ROOT_PATH "D:\\TIS\\mock";// …

Attack Lab:Phase1~Phase5【缓冲区溢出实验】

注&#xff1a;本实验所用文件不是csapp官网给出的&#xff0c;是学校下发的。可以参考我的思路。 phase 1 本阶段目标是使getbuf调用结束后&#xff0c;控制权交给touch1函数。 则我们要知道两件事&#xff1a;一是缓冲区大小&#xff0c;二是touch1在虚拟内存中的位置。 用…

如何取消隐藏Excel中的行?这里提供详细步骤

取消隐藏Microsoft Excel电子表格中的所有行就像按下键盘快捷键或使用功能区上的按钮一样简单。我们将向你展示如何操作。 如何使用快捷方式取消隐藏Excel中的所有行 若要在电子表格中显示隐藏行&#xff0c;请使用Microsoft Excel启动电子表格。然后&#xff0c;访问包含隐藏…

P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间&#xff0c;经常需要租借教室。大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。 面对海…

【项目日记(七)】第三层: 页缓存的具体实现(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

Armv8-M的TrustZone技术之在安全状态和非安全状态之间切换

Armv8-M安全扩展允许在安全和非安全软件之间直接调用。 Armv8-M处理器提供了几条指令来处理状态转换: 下图显示了安全状态转换。 如果入口点的第一条指令是SG且位于非安全可调用内存位置中,则允许从非安全到安全软件的直接API函数调用。 当非安全程序调用安全API时,API通过…

Linux系统管理和Shell脚本笔试题

1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1a;AAA11111BBB #写入内…

JavaWeb前端——HTML/CSS

HTML/CSS概述 HTML&#xff1a;学习标签&#xff0c;CSS&#xff1a;学习样式 HTML 1. 不区分大小写。 2. 属性可以使用单引号/双引号 3. 在记事本/编辑器中编写html语言&#xff0c;通过浏览器解析渲染语言 4. 语法结构松散&#xff08;编写时要尽量严谨&#xff09; VSc…

github请求超时解决方法

github请求超时解决办法 我使用windows执行如下git命令,提示超时 git clone xxxxx命令行提示如下&#xff1a; Failed to connect to github.com port 443: Timed out问题排查 可我Chrome可以正常访问github甚至ChatGPT&#xff0c;但是为什么在命令行里面却无法访问&#…

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

『C++成长记』string使用指南

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 &#x1f4d2;2.1string类对象的常…

线下店铺的商品如何查价

品牌渠道主要分为线上和线下&#xff0c;线上的价格查价方式可以通过系统完成&#xff0c;系统筛选不同平台的数据&#xff0c;然后做价格的比较&#xff0c;输出是否破价的监测报表&#xff0c;这个过程多依赖系统去操作&#xff0c;但线下店铺的产品价格查价方式则没有固定的…

Windows下Cloudreve WebDAV挂载失败解决方法

如果你正在使用Windows的资源管理器挂载WebDAV&#xff0c;并且发现挂载失败&#xff0c;无论你如何去配置他 首先&#xff0c;Cloudreve 中可以为每个用户组单独设置“是否允许使用WebDAV访问”的开关&#xff0c;但是这玩意儿默认是开启的&#xff0c;所以如果不小心手残关掉…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…