96SEO 2026-06-15 12:37 3
先聊聊为什么要把 AI 流程丢进 React + TypeScript 的锅里
说实话,AI 接口一旦涉及付费,光是安全和计费就Neng把你逼疯。
我之前玩儿个小项目,直接在前端硬写 fetch,结果 Key 全裸露,瞬间被爬虫刷爆。

于是乎,我决定把整个「请求‑流式‑扣费」链路搬到 React 前端,用 TypeScript 把每一步的参数dou给砍死。
哈哈,这种感觉像是给老房子装了防盗门,安心多了。
项目骨架:Vite 一键搞定,目录分层别乱搞npm create vite@latest ai-app -- --template react-ts
目录结构我保持超简洁:
src/
api/ // 所有网络请求
components/ // UI 组件
hooks/ // 自定义 hook,核心业务逻辑
pages/ // 路由页面
store/ // zustand 状态管理
types/ // TS 类型定义
这样以后加支付、加配额,douNeng在对应层里改,不会把代码弄得七零八落。
用 TypeScript 把 AI 消息模型硬核化先把对话的每条信息敲出类型:
export interface ChatMessage {
role: 'user' | 'assistant' | 'system';
content: string;
}
export interface ChatRequest {
messages: ChatMessage;
}
不对不对,这里应该再加点可选字段,比如 temperature、max_tokens,后面会在后端统一管控。
自定义 Hook:useChatCompletion这个 Hook 把「获取 token」‑「发起流式请求」‑「逐块geng新 UI」全包起来。
export function useChatCompletion {
const = useState;
const = useState;
const abortRef = useRef;
const sendMessage = useCallback(async (
msgs: ChatMessage,
onChunk: => void,
onDone: => void,
retry = 0
) => {
if return;
setIsLoading;
setError;
const controller = new AbortController;
abortRef.current = controller;
try {
for await ) {
onChunk;
}
onDone;
} catch {
if {
setError;
// 自动重试一次Zui多两次
if ) {
sendMessage;
}
}
} finally {
setIsLoading;
abortRef.current = null;
}
}, );
const stop = useCallback => abortRef.current?.abort, );
return { sendMessage, stop, isLoading, error };
}
流式请求到底怎么写?fetch + ReadableStream 才是王道
别傻傻用 EventSource,那玩意只Neng GET,还得把 token 暴露在 URL 上。
async function* streamChatCompletion(
msgs: ChatMessage,
signal?: AbortSignal
): AsyncGenerator {
const res = await fetch('/api/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${await getAccessToken}`
},
body: JSON.stringify,
signal,
});
if {
const err = await res.json.catch => );
throw new Error;
}
const reader = res.body?.getReader;
if throw new Error;
const dec = new TextDecoder;
let buf = '';
while {
const { done, value } = await reader.read;
if break;
buf += dec.decode;
const lines = buf.split;
buf = lines.pop || '';
for {
if ) yield line;
}
}
if ) yield buf;
}
计费与配额:前端先乐观扣,再让后端收回
用户点击「生成」前,我先检查 quota:
if {
setShowPurchase;
return;
}
decrementQuota; // 乐观扣一次
sendMessage;
Ru果请求Zui终失败,我再调用 incrementQuota 把额度补回来。后端则在真正完成一次完整生成后才正式扣费,并返回Zui新的剩余次数。
为什么百度不收录?——来聊聊 SEO 小坑说实话,我的这套 SPA 用 Vite 打包后默认是 hash 路由,搜索引擎爬虫抓不到真实内容。
解决办法就是加上 SSR 或者 prerender,让关键页面在服务器渲染出 HTML。还有一点别忘了在每个页面的 加上 和合适的
普通用户一分钟Zui多发起三次生成请求:
const windowMs = 60 * 1000;
const maxReq = 3;
const timestamps = useRef;
function checkRate {
const now = Date.now;
timestamps.current = timestamps.current.filter;
if {
const wait = Math.ceil/1000);
throw new Error;
}
timestamps.current.push;
}
UI 小技巧:打字机效果+错误边界
打字机效果直接在 onChunk 回调里累加字符串,然后让组件用 {currentReply} 渲染即可。
setCurrentReply;
别忘了给Zui外层包一个 ErrorBoundary,免得某个未捕获异常把整站白屏。
ErrorBoundary 示例class ErrorBoundary extends React.Component{
state={hasError:false,error:null};
static getDerivedStateFromError{return{hasError:true,error:err};}
componentDidCatch{log;}
render{
if{
return 哎呀,好像出错了!
{this.state.error.message};
}
return this.props.children;
}
}
部署小贴士:Vercel + 环境变量安全上线
构建命令就一行:npm run build。产物放到 Vercel 的静态托管即可。
P.S. 别把 VITE_ 开头的 env 全部暴露,你只需要公开 API_BASE_URL 那几个,其它dou保留在服务器侧。
一下——React+TS 重构 AI 流程到底好在哪?
类型安全:TSC 把消息结构、响应体全给敲死,跑时基本不会出现 undefined 错误。
SWR/React Query 替代手写缓存:`useQuery` Neng自动处理 loading、error、revalidate,让 UI geng干净。
SSE vs Fetch Stream:`fetch`+ReadableStream geng灵活,也Neng随时 abort,不会卡死页面。
E2E 测试必不可少:
#SEO#:
Zui后啊,Ru果你刚好也想玩 AI 收费产品,就跟着我上面的步骤走一遍吧。遇到坑记得笑笑,毕竟代码dou是自己写的,摔跤也是成长的一部分——咱就是说一次踩坑算两次经验值!哈哈,加油~ 🚀
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback