从零搭建浏览器端 AI 原型:React、WebGPU 与 Tailwind CSS 的一次实践

从零搭建浏览器端 AI 原型:React、WebGPU 与 Tailwind CSS 的一次实践

一、为什么关注浏览器端模型

常见的 AI 应用会调用 OpenAI、DeepSeek 等云端 API:

text 复制代码
浏览器 → 发送 prompt / 上下文 → 云端大模型 → 返回结果

这种方案接入快、模型能力强,但也有明显代价:

  • 调用会产生持续成本;
  • 网络会带来延迟;
  • prompt 和上下文需要传到服务端;
  • 离线时无法使用。

浏览器端模型则将推理放到用户设备:

text 复制代码
浏览器 → 本机 GPU → 本地模型推理 → 页面展示结果

它适合隐私敏感、离线可用、模型较小或任务明确的场景。代价是更受设备性能、浏览器兼容性和模型文件大小限制。

二、项目的技术组合

当前原型采用:

  • React:组件化构建页面;
  • TypeScript:增加类型约束;
  • Vite:提供开发服务器与构建能力;
  • Tailwind CSS:用工具类快速完成页面样式;
  • WebGPU:尝试调用用户设备 GPU,为浏览器端 AI 推理提供计算能力。

三、先做能力检测:navigator.gpu

在浏览器端使用 WebGPU 前,首先要确认浏览器是否支持:

tsx 复制代码
const isWebGpuAvailable = !!navigator.gpu

navigator.gpu 是 WebGPU API 的浏览器入口:

  • 支持 WebGPU 时,它是对象;
  • 不支持时,通常为 undefined
  • !! 可以将结果转换为明确的 truefalse

随后可以按能力渲染不同页面:

tsx 复制代码
return isWebGpuAvailable
  ? <ModelLoadingPage />
  : <p>您的浏览器不支持 WebGPU,请升级浏览器或使用其他浏览器</p>

这就是 React 的条件渲染:根据数据状态决定显示哪一段 UI。

四、React:用状态驱动页面,而不是手动操作 DOM

模型加载过程本身是一个状态变化过程,例如:

text 复制代码
未开始 → 加载中 → 已就绪
             ↓
           加载失败

React 使用 useState 保存这些状态:

tsx 复制代码
const [status, setStatus] = useState(null)
const [error, setError] = useState('')
const [loadingMessage, setLoadingMessage] = useState('')
const [progressItems, setProgressItems] = useState([])

调用 setStatussetError 等 setter 后,React 会重新执行组件函数,再根据新 JSX 更新页面。

例如只在有错误时显示错误区域:

tsx 复制代码
{error && (
  <div className="text-red-500 text-center mb-2">
    <p>unable to load model due to error:</p>
    <p>{error}</p>
  </div>
)}

这里的 && 是 JavaScript 的短路逻辑:error 有值时才渲染右侧 JSX。

注意:若初始值直接写成"出错了",错误 UI 会在页面一开始就显示。更合理的是初始化为空字符串,在捕获到真实异常后再调用 setError

五、useEffect:处理加载模型这类副作用

组件渲染 JSX 是 React 的主要职责,但下载模型、请求资源、创建定时器等事情属于"副作用"。

tsx 复制代码
useEffect(() => {
  console.log('组件挂载完成')
}, [])

空依赖数组 [] 表示:组件首次显示后执行一次。

后续模型加载逻辑通常会放在这里:

tsx 复制代码
useEffect(() => {
  // 1. 检查 WebGPU
  // 2. 下载模型文件
  // 3. 更新进度
  // 4. 加载完成后设置 ready 状态
}, [])

六、Tailwind CSS 快速完成加载页布局

当前页面使用如下布局类:

tsx 复制代码
<div className="flex flex-col h-screen items-center justify-end text-gray-800 bg-white">

对应含义:

Tailwind 类 作用
flex 开启弹性布局
flex-col 子元素纵向排列
h-screen 高度占满屏幕
items-center 横向居中
justify-end 纵向靠底部
text-gray-800 默认深灰色文字
bg-white 白色背景

关键点是:items-* 控制交叉轴,justify-* 控制主轴。由于 flex-col 让主轴变成上下方向,所以这里 items-center 是左右居中,justify-end 是靠底部。

Tailwind v4 和 Vite 集成时,使用 @tailwindcss/vite 插件扫描 JSX 的类名,并生成最终 CSS。开发时不需要为每个样式单独写 CSS 选择器。

七、当前原型的完成度与下一步

目前已经完成:

  1. 搭建 React + TypeScript + Vite 工程;
  2. 接入 Tailwind CSS;
  3. 完成 WebGPU 基础能力检测;
  4. 完成模型加载前说明 UI;
  5. 预留模型状态、错误信息和下载进度 state。

下一步需要实现:

  1. 明确状态机:idleloadingreadyerror
  2. 接入 Transformers.js 与 ONNX Runtime Web;
  3. 下载并加载 ONNX 模型;
  4. 根据真实下载事件更新进度;
  5. 实现 prompt 输入、模型推理和结果展示;
  6. 修正 mx-w-[510px]max-w-[510px]

八、总结

浏览器端 AI 并不是简单地"把模型放到网页里",而是一个前端工程问题:需要处理浏览器能力检测、资源加载、状态切换、错误提示、进度展示与 GPU 计算。

这个原型的价值在于先搭好了基础框架:用 React 管理页面状态,用 WebGPU 做能力检测,用 Tailwind 快速构建 UI。下一阶段再补齐模型加载与推理链路,就能形成一个完整的端侧 AI Demo。

相关推荐
咖啡星人k9 小时前
GitHub Copilot 加入 Agent 浏览器:验证 Web 应用进入编码闭环
前端·人工智能·github·copilot·前端开发·ai agent
matlab代码9 小时前
基于CNN卷积神经网络叶片虫害程度识别系统 (GUI界面)【源码45期】
人工智能·神经网络·cnn·叶片虫害识别·matlab识别
湘美书院--湘美谈教育9 小时前
湘美书院主理人谈武侠文学的AI时代:世运之明晦,其里在学
大数据·人工智能·深度学习·机器学习·生活
程序员X小鹿9 小时前
影像创作领域的GitHub!深度体验了这个国产AI,我卸了3个AI视频工具!
人工智能
承渊政道9 小时前
把家里的显卡变成远程AI画室:Stable Diffusion WebUI部署实战
人工智能·stable diffusion·内网穿透·cpolar·web ui·ai画室
GuWenyue9 小时前
放弃云端API!5套技术栈实战WebGPU端侧AI,前端独立跑本地大模型,省成本还保隐私
前端·数据库·人工智能
小二·11 小时前
国产大模型部署实战:DeepSeek + vLLM本地化推理,API成本降低90%
大数据·人工智能
fpcc12 小时前
AI和大模型——扩展模型
人工智能