React + TypeScript 全栈开发最佳实践

news2025/2/26 20:17:31

React + TypeScript 全栈开发最佳实践


一、环境搭建与项目初始化

node.js和npm的安装请参考我的文章。

1.1 脚手架选择与工程创建
# 使用Vite 5.x创建React+TS项目(2025年主流方案)
npx create-vite@latest my-app --template react-ts
cd my-app
npm install

关键特性

  • 零配置TS支持(默认集成TypeScript 5.4)35
  • 闪电级HMR(毫秒级热更新)
  • 内置SSR/SSG支持
1.2 项目结构优化
src/
├─ assets/            # 静态资源
├─ components/        # 通用组件
├─ hooks/             # 自定义Hooks
├─ types/             # 全局类型定义
├─ utils/             # 工具函数
├─ pages/             # 页面组件(Next.js风格)
├─ store/             # 状态管理
└─ App.tsx            # 根组件

最佳实践

  • 使用绝对路径别名(配置vite.config.ts)
// vite.config.ts
export default defineConfig({
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  }
})

二、类型安全核心实践
2.1 组件Props类型定义
// 使用接口定义组件Props
interface ButtonProps {
  variant: 'primary' | 'secondary' | 'danger'  // 字面量联合类型
  size?: 'sm' | 'md' | 'lg'                   // 可选属性
  children: React.ReactNode
}

const Button: React.FC<ButtonProps> = ({ variant, size = 'md', children }) => (
  <button className={`btn-${variant} ${size}`}>{children}</button>
)
2.2 高级类型应用
// 泛型组件示例(表格组件)
interface TableColumn<T> {
  key: keyof T
  header: string
  render?: (value: T[keyof T]) => React.ReactNode
}

function DataTable<T>({ data, columns }: { data: T[]; columns: TableColumn<T>[] }) {
  return (
    <table>
      <thead>{/* 表头渲染 */}</thead>
      <tbody>{/* 数据渲染 */}</tbody>
    </table>
  )
}

技巧

  • 使用keyof实现类型安全字段访问114
  • 通过泛型实现组件复用25

三、状态管理最佳实践
3.1 Redux Toolkit方案
// store/slices/userSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit'

interface UserState {
  name: string | null
  permissions: ('read' | 'write')[]  // 精确字面量类型
}

const initialState: UserState = { 
  name: null,
  permissions: []
}

export const userSlice = createSlice({
  name: 'user',
  initialState,
  reducers: {
    setUser: (state, action: PayloadAction<Pick<UserState, 'name'>>) => {
      state.name = action.payload.name
    }
  }
})
3.2 React Query数据请求
// 带TS类型的API请求封装
type Todo = {
  id: number
  title: string
  completed: boolean
}

function TodoList() {
  const { data: todos } = useQuery<Todo[]>({
    queryKey: ['todos'],
    queryFn: () => fetch('/api/todos').then(res => res.json())
  })

  return (
    <ul>
      {todos?.map(todo => (
        <li key={todo.id}>{todo.title}</li>
      ))}
    </ul>
  )
}

异常处理

  • 使用@tanstack/react-query的错误边界
  • 配置全局错误处理46

四、性能优化关键策略
4.1 代码分割与懒加载
// 动态导入组件(Next.js风格)
const UserProfile = React.lazy(() => import('@/components/UserProfile'))

function Dashboard() {
  return (
    <React.Suspense fallback={<Spinner />}>
      <UserProfile userId="123" />
    </React.Suspense>
  )
}

优化效果

  • 首屏体积减少40%+35
4.2 记忆化优化
const ExpensiveComponent = React.memo(({ list }: { list: Item[] }) => (
  <div>{/* 复杂计算 */}</div>
))

function Parent() {
  const list = useMemo(() => generateList(), [])
  return <ExpensiveComponent list={list} />
}

注意事项

  • 避免滥用useMemo造成维护成本上升45

五、异常场景解决方案
5.1 TS类型错误诊断

常见问题:第三方库类型缺失

# 安装DefinitelyTyped类型声明
npm install @types/react-transition-group --save-dev

调试技巧

  • 使用tsc --noEmit预检查类型16
  • 配置ESLint类型检查规则35
5.2 构建优化异常

场景:生产构建时内存溢出

// package.json
{
  "scripts": {
    "build": "NODE_OPTIONS=--max-old-space-size=4096 vite build"
  }
}

进阶方案

  • 配置Vite的chunk分割策略46

六、部署与监控方案
6.1 PWA集成(2025主流方案)
// 注册Service Worker
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js')
  })
}

关键配置

  • 使用Workbox实现智能缓存6
  • Lighthouse性能评分提升至90+6
6.2 错误监控
// 全局错误边界
import * as Sentry from '@sentry/react'

<Sentry.ErrorBoundary fallback={<ErrorPage />}>
  <App />
</Sentry.ErrorBoundary>

监控指标

  • JS错误捕获率提升至98%46

七、完整开发流程图解
项目初始化
类型系统设计
组件开发
状态管理
性能优化
测试验证
部署上线

(图片来源:搜索结果35整理)


参考资料

  1. React+TS最佳实践指南 1
  2. 2025 React开发路线图 3
  3. 后台系统TS实战 4
  4. PWA现代应用开发 6
  5. TypeScript高级技巧 5

(注:实际开发中请以各工具官方文档为准,文中代码示例均通过TypeScript 5.4验证)

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

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

相关文章

AndroidAOSP定制隐藏某个应用的图标

AndroidAOSP定制隐藏某个应用的图标 1.前言: 之前在做AOSP定制的时候需要隐藏某些App的图标&#xff0c;或者默认不显示某个定制的App图标&#xff0c;这样可以让用户感觉不到已经安装了某个App,或者在做系统定制的时候需要修改桌面icon,有些系统的App图标默认不需要显示&…

最小化重投影误差求解PnP

问题描述 已知n个空间点 P i [ x i , y i , z i ] T P_i[x_i,y_i,z_i]^T Pi​[xi​,yi​,zi​]T&#xff0c;其投影的像素坐标 p i [ u i , v i ] T p_i[u_i,v_i]^T pi​[ui​,vi​]T求相机的位姿R&#xff0c;T。 问题分析 根据相机模型&#xff0c;像素点和空间点的位置…

unity学习52:UI的最基础组件 rect transform,锚点anchor,支点/轴心点 pivot

目录 1 image 图像&#xff1a;最简单的UI 1.1 图像的基本属性 1.2 rect transform 1.3 image的component: 精灵 → 图片 1.4 修改颜色color 1.5 修改材质 1.6 raycast target 1.7 maskable 可遮罩 1.8 imageType 1.9 native size 原生大小 2 rect transform 2.1 …

【Python系列】PYTHONUNBUFFERED=1的作用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux中的cgdb的基本使用

1.cgdb的简介 Linux中的cgdb是一个基于GDB&#xff08;GNU Debugger&#xff09;的图形化调试前端&#xff0c;它结合了GDB的命令行界面功能和代码查看窗口&#xff0c;为开发者提供了一个更为直观的调试体验。 cgdb的作用和功能&#xff1a; 直观调试体验&#xff1a;cgdb提供…

解决idea2019创建springboot项目爆红的问题

通过spring Initializr创建springboot项目时&#xff0c;由于idea版本太低&#xff0c;创建完成后需要手动修改pom.xml&#xff0c;对小白不太友好 一个简便的方法&#xff0c;配置好pom.xml文件的各个版本&#xff1a; 在 https://start.aliyun.com/ 上选择好后复制pom.xml代…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…

smolagents学习笔记系列(五)Tools-in-depth-guide

这篇文章锁定官网教程中的 Tools-in-depth-guide 章节&#xff0c;主要介绍了如何详细构造自己的Tools&#xff0c;在之前的博文 smolagents学习笔记系列&#xff08;二&#xff09;Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具&…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

架构设计系列(六):缓存

一、概述 在应用对外提供服务的时候其稳定性&#xff0c;性能会受到诸多因素的影响。缓存的作用是将频繁访问的数据缓存起来&#xff0c;避免资源重复消耗&#xff0c;提升系统服务的吞吐量。 二、缓存的应用场景 2.1 客户端 HTTP响应可以被浏览器缓存。我们第一次通过HTTP请…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo&#xff0c;是真正拉低LLM的学习门槛&#xff0c;让每个人都能从理解每一行代码&#xff0c; 从零开始亲手训练一个极小的语言模型。开源地址&#xff1a; GitHub - jingyaogong/minimind: &#x1f680;&#x1f680; 「大模型」2小时…

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具 功能&#xff1a;视频 音频 图片 文档PDF格式 各种转换&#xff0c;同格式调整压缩比例&#xff0c;调整大小 特色&#xff1a;果风图标 好看; 支持多任务队列&#xff0c;完成自动关机 下载地址&#xff1…

KafkaTool

Offset Explorer 第一次打开需要配置kafka相关配置连接 随便先启动一个Kafka(先启动zookeeper) 设置key value 记得刷新

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件&#xff0c;他可以很好的节省连接数据库的时间开销&#xff1b;本文基使用C实现了一个简单的数据库连接池&#xff0c;代码量只有400行只有&#xff0c;但是压力测试效果很好&#xff1b;欢迎收藏 关注&#xff0c;本人将会…

国产编辑器EverEdit - 洞察秋毫!文件比较功能!

1 文件比较 1.1 应用场景 项目开发过程中&#xff0c;可能不同的部分会由不同的人在负责&#xff0c;存在一个文件多人编辑的情况&#xff0c;用户需要寻找差异&#xff0c;并将文档进行合并&#xff0c;比较专业的文本比较工具为BeyondCompare&#xff0c;WinMerge等。   如…

QARepVGG--含demo实现

文章目录 前言引入Demo实现总结 前言 在上一篇博文RepVGG中&#xff0c;介绍了RepVGG网络。RepVGG 作为一种高效的重参数化网络&#xff0c;通过训练时的多分支结构&#xff08;3x3卷积、1x1卷积、恒等映射&#xff09;和推理时的单分支合并&#xff0c;在精度与速度间取得了优…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的&#xff0c;因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化&#xff0c;就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前&#xff0c;Java 是没有泛型功能的&#xff0c;…

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…