第 1 篇:我为什么选择用React做一个充电桩管理系统?------聊聊技术选择的思考过程 | 从零到一搭建“绿能充电”管理平台,那些深夜纠结过的技术选型

0 阅读6分钟

前言

大家好,我是一名前端开发者。最近接到一个有意思的项目------"绿能充电",一个电动汽车充电站的管理平台。老板的需求很直接:三个月内上线一个能实时监控充电桩状态、处理用户订单、展示数据报表的 Web 系统。

听起来不复杂?但作为技术负责人,我得为未来两到三年的可维护性、扩展性负责。从技术选型到架构设计,每个决定都像在下一盘棋。

今天想和大家聊聊,我是如何为"绿能充电"做技术选型的。可能不是最完美的答案,但一定是经过真实场景毒打后的思考。

为什么是 React 19,而不是Vue?

坦白说,Vue 3 的 Composition API 我也很喜欢,但最终选择 React 19 有四个现实原因:

1.生态的"工具箱"厚度

React 的第三方库生态就像瑞士军刀。我们需要地图选点(React-Leaflet)、实时图表(Chart.js)、状态管理(Zustand),这些在 React 生态里都有成熟且维护活跃的解决方案。Vue 对应的库不少,但在某些细分领域(比如地图可视化)的社区活跃度稍弱。

2.团队的技术惯性

团队四位前端,三位过去两年都在用 React 18。React 19 带来的 React Compiler(自动 memo 化)和 Actions(表单操作简化)能直接提升我们的开发效率。如果强行切 Vue,光是内部培训就要消耗两周,这笔账不划算。

3.类型系统的亲和力

充电桩管理涉及大量数据结构:桩的状态(空闲/占用/故障)、订单金额、用户余额。TypeScript + React 的配合可以用"丝滑"形容。虽然 Vue 也支持 TS,但在复杂泛型和组件 props 推导上,React 19 依然更顺手。

4.跨平台的可能性

老板画过饼:"以后可能要做运维 App"。React Native 比 Vue 的跨平台方案(Weex、Taro)成熟太多。虽然现在不做,但选 React 相当于给未来留了后门。

Vite 8 vs Web pack:开发体验的革命

如果用 Web pack 5 搭项目,配置 web pack.config.js 的时候我可能已经想辞职了。

速度是第一要义

Vite 8 基于原生 ESM 的冷启动,在"绿能充电"这个项目上,npm run dev 后300ms就能看到页面。同样规模的项目用 Web pack,至少 3-5 秒。开发过程中修改代码,Vite 的 HMR(热模块替换)几乎是瞬间更新,而 Web pack 在大项目里每次保存都要等 1-2 秒。

配置简单到"几乎没有"

我们需要配置路径别名、代理 API 请求(避开跨域)、环境变量。Vite 的配置文件就十几行:

export default defineConfig({
    resolve:{alias:{'@':path.resolve(_dirname,'./src')}},
    server:{proxy:{'/api':'http://localhost:3001'}}
})

换成 Web pack?你可能需要 web pack-merge、web pack-dev-server、html-web pack-plugin... 光是依赖就要装七八个。

构建产物的优化

Vite 8 底层用 Rollup 打包,生产环境产物做了 Tree Shaking 和代码分割。我们的首屏加载从 Webpack 时代的 1.2MB 降到了 850KB,对移动端运维人员很友好。

Tailwind CSS v4:为什么放弃 CSS Modules?

项目初期我试过半天的 CSS Modules,然后果断切到了 Tailwind CSS v4。原因很简单:

维护成本的天壤之别

写充电桩管理后台,你需要大量的布局类(flex、grid、padding、margin)。用传统 CSS,你要么起一堆 .charging-card-container 这种语义化类名,要么用 CSS Modules 的 styles.card 语法。Tailwind 直接写 flex p-4 rounded-lg shadow-sm,不用离开 HTML 结构,心智负担降低 70%。

v4 的新特性真香

Tailwind CSS v4 的引擎用 Rust 重写了,构建速度比 v3 快 5 倍。新增的@theme 指令让自定义设计系统变得非常优雅。例如我们的品牌色是"充电绿"(#00C48C),只需要在 app.css 里声明:

@theme{
    --color-brand:#00c48c;
}

全站直接用 bg-brand 或 text-brand,不用折腾 tailwind.config.js。

还有个实际痛点

我们的 UI 组件需要支持动态主题(白天/夜晚模式)。Tailwind 的暗黑模式方案 dark: 前缀比 CSS Variables 的维护成本低太多。团队成员不用学习新的变量命名规范,直接写 dark:bg-gray-800 就行。

SQLite 不是玩具,是恰好的选择

很多人看到 SQLite 会觉得"这能用在生产环境?"我一开始也犹豫过,但分析完"绿能充电"的真实需求后,发现它反而最合适。

数据量没你想象的那么大

一个中型充电站有 20 个桩,每天每桩充电 30 次,一天 600 条订单记录,一年约 22 万条数据。SQLite 轻松应对千万级数据,何况我们的初期规模。

运维成本降为零

如果用 MySQL,你需要单独部署数据库服务、配置用户权限、做定期备份、处理连接池。SQLite 就是一个文件(charging.db),Express 通过 better-sqlite3 直接读写,备份就是复制文件。对于五人小团队,少一个数据库运维的负担就是救命稻草。

性能反而更好

我们的业务逻辑在 Node.js 层(Express)完成,SQLite 嵌入进程内,省去了网络 IO 和连接池开销。查询订单列表、统计每日收益,响应时间都在 20ms 以内。

什么时候才需要 MySQL?

等到日活突破 1 万、数据量过千万、需要主从复制读写分离的时候再迁移。SQLite 到 MySQL 的迁移脚本一天就能写完,没必要提前过度设计。

整体架构:前后端分离 + 实时推送

最后说说"绿能充电"的整体架构设计:

HTTP / Web Socket

前端

(React 19 + Vite)

Leaflet 地图展示充电站位置

Chart.j s展示充电量/收益趋势

Socket.IO 客户端接收实时状态

后端

(Express.js + Socket.IO)

REST ful API(订单、用户、桩管理) Web Socket 推送桩状态变化

SQLite

(better-sqlite3)

charging_stations(充电站表)

piles(充电桩表)

orders(订单表)

│ • users(用户表)

SQL

核心设计原则:

前后端分离:前端独立部署(Vercel/Netlify),后端用 Express 提供 API,方便未来拆分微服务

实时推送:充电桩状态变化(如从"空闲"变"充电中")通过 Socket.IO 广播给所有在线管理员,避免前端轮询

轻量化数据库:SQLite 做持久化,Redis 可选(初期不加,等需要缓存热点数据时再引入)

地图可视化:React-Leaflet 展示充电站分布,点击 Marker 查看详细信息(充电桩数量、空闲率)

结语

技术选型没有绝对的对错,只有是否适合当下的团队和业务。

"绿能充电"从开工到现在一个月,我们已经完成了桩状态监控和订单管理两个核心模块。开发过程中几乎没有因为技术选型踩过深坑------Vite 够快,React 19 的编译器省去了手动 memo,Tailwind 让样式维护变得轻松,SQLite 帮我们省下了 DBA 的人力。

如果你的项目也是中小规模、团队 3-5 人、需要快速迭代,这套技术栈完全可以复制。

下一篇我会聊聊 "如何用 React 19 的新特性优化充电桩列表的性能",敬请期待。