AI项目改用服务端组件实现对话?包体积减小50%!

背景

现在ai正是火的时候,作为前端开发不接个ai好像就被开除前端籍了似的(bushi)。得了,写呗。用什么技术栈呢?都接ai了,那肯定nextjs啊?所以你三下五除二,引个第三方Markdown渲染库,又去学SSE接了流式的请求,再用Textdecoder去把一个个event:data里的文本拿出来,用setState不断去更新------这不就成了吗?上线!

得,打包完成,恭喜您得到了体积巨大的next客户端包哈哈哈。虽然不得不承认,做的效果确实不错。但是Markdown渲染器和highlight.js代码高亮的包体积实在是太大,甚至能够占到我们客户端包大小的40%以上!我们平时在写next的时候都是尽可能的写服务端组件,这能够使得第三方库不必被打包到客户端,再加上next的server action支持发送组件,因为返回的都是RSC payload的格式,基于这个思路,下面给出我的探索实现。

服务端打字机Markdown渲染器

这里使用的渲染库是react-markdown,引用了巨多的插件以及highlight.js这个巨型库,下面我们来用一些魔法给他放到服务端,让这个'use server'真的在server上!

这个getChatStream实现类似下面这种,很常见的前端接取SSE流式数据的方式。

javascript 复制代码
const res=fetch("/api/chat");//直接使用
const reader = res.body.getReader();//获取ReadableStream
const decoder = new TextDecoder(); //将Uint8Array解码

let done = false;
let data = '';
while (!done) {
  const { value, done: doneReading } = await reader.read();
  done = doneReading;
  if (value) {
    data += decoder.decode(value, { stream: true });
  }
}

使用的时候用这个组件就好了

设计思路

首先,要打字机式的动态的更新页面,那么除了props就只有state,这边我们用state,但是使用了useState就肯定是客户端组件,所以Markdown渲染器就不能放在客户端组件里。我们通过天然适合服务端组件的async function*这种异步生成器,搭配server action支持返回组件的特性,再加上for await语法,再上面各种技术的神奇组合下,我们将传有不同长度文本的Markdown组件在服务端渲染好,一个个yield到客户端组件,客户端组件接到这个有前一个状态文本的Markdown组件后更新state,然后我们再将这个state在客户端组件中显示。就这样,我们巨大的Markdown渲染器成功被我们留在了服务端!

灵感来源于 vercel的ai sdk实验阶段的RSC包。

希望大家阅读本文能有所收获!笔者目前还是大二的小白,见识短浅,若有错误还请评论区指出 想要讨论前端react技术站相关技术或者单纯想交个朋友的可以加笔者的联系方式:

VX:hutianyv869170

QQ:1394139263

相关推荐
FungLeo15 分钟前
node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
前端·非对称加密·rsa 加密·node 后端
不灭锦鲤26 分钟前
xss-labs靶场第11-14关基础详解
前端·xss
不是吧这都有重名1 小时前
利用systemd启动部署在服务器上的web应用
运维·服务器·前端
霸王蟹1 小时前
React中巧妙使用异步组件Suspense优化页面性能。
前端·笔记·学习·react.js·前端框架
Coding的叶子1 小时前
React Flow 节点属性详解:类型、样式与自定义技巧
react.js·node·节点·fgai·react agent
Maỿbe1 小时前
利用html制作简历网页和求职信息网页
前端·html
森叶1 小时前
Electron 主进程中使用Worker来创建不同间隔的定时器实现过程
前端·javascript·electron
霸王蟹1 小时前
React 19 中的useRef得到了进一步加强。
前端·javascript·笔记·学习·react.js·ts
霸王蟹2 小时前
React 19版本refs也支持清理函数了。
前端·javascript·笔记·react.js·前端框架·ts
繁依Fanyi2 小时前
ColorAid —— 一个面向设计师的色盲模拟工具开发记
开发语言·前端·vue.js·编辑器·codebuddy首席试玩官