#Vue

Andy Stewart
1个月前
给你们讲一个懒猫相册开发者的故事吧 时间拉到2022年,那时候公司入职了一个小伙子 擅长写Vue和玩Linux,小伙子平时不太喜欢说话,所以第一个月就没有怎么管。那时候我们正在测试硬件模具,看了小伙子写代码能力还可以,我说开发相册App吧,然后我就去深圳了。 过了半个月回来的时候,问进度,同事说小伙子骑自行车摔了一跤,把手臂摔断了。哎呀,怎么这么不小心啊 等小伙子手好了,就继续开始写相册,第一版懒猫相册写出来的时候被我狠狠的喷了。我说用户有可能有30万张图片,你们怎么用传统的Web控件就开始写了?浏览器的原理,如果超过2000个DOM元素,像Vue和React这种响应式前端框架,光首次layout计算都需要很长时间,而且你们为了上传去重,居然每个相册都用md5计算?你们知道万一用户手里是一个红米那样的渣渣手机呢?图片还没有上传,手机的电都被你们暴力算md5算没电了 那天我这个商务真的对研发的同学好一顿教育啊,哎,教育是教育,等消了气,我又给全体前端开发做了一次前端技术培训。 培训的内容主要讲解动画的原理,怎么通过自绘、逐帧曲线变化,来欺骗用户的视觉,形成流畅的自绘控件。自绘控件的原理就是通过画布绘制,把相册这种几十万的对象的场景,从传统的DOM指数性能消耗,减少为单屏的常量绘制。因为像相册这样,你是不可能把几十万的对象都弄成DOM的,而且Vue/React这种动态属性绑定的设计,尤其耗费性能,几十万对象一上去,layout非常耗时(白屏),任何操作都会让浏览器性能榨干,甚至内存过爆卡死。而自绘控件永远都只用绘制可视范围内的对象,现代计算机绘制任何一个屏幕的内容都是非常非常快的,只用做好动画帧分解就好了。 讲完自绘后,我又讲了为了动画流畅,我们可以适当的实现双缓冲,简而言之,就是你的绘制对象要超过用户的屏幕,这样当用户滚动的时候,屏幕外的内容已经准备好了,就不用每次滚动都需要重新绘制,减少因现绘制导致的屏幕反复闪烁。 为了让同学们听懂,我在白板上用画静态图片的方式一帧一帧的讲解,画了整整两白板,甚至还表演起来了动画的变化。 当时下课的时候,我问同学们听懂了没?大家似懂非懂的点点头。我讲完又去深圳整硬件了,因为快过年了,要赶进度,出差路上我还在想,虽然自绘控件可以解决任何超多对象的图形App性能问题,但是真的要做到极限性能,需要对图形绘制的原理、坐标的计算还有数据结构的设计都要想的非常清晰才行,要不很容易写出意大利面条的代码,无法维护。当时我还在整硬件,就那么想了想,没有对小伙子能够实现自绘抱有希望。 春节后上班第一天,相册1.0就写出来了,我当时听了非常震惊,我说怎么做到的?同事说,相册的小伙子春节一天都没回家,就在武汉吃泡面,吃了20天,一个人从零写了相册的自绘控件。 我靠,他居然没回家啊? 我用了一下新版相册,非常惊喜,看来小伙子完全懂了。新版的相册利用了自绘和双缓冲,实现30万张照片任意拖拽,0.5秒内把家中照片全部绘制到用户的手机上,使用体验非常棒,我们应该是5G云相册里面缩略图显示最快的厂商了,这完全归功于懒猫相册的开发者,从零撸的自绘控件。 你们看,一个应届毕业生,只要又决心,用心学习,死磕就可以快速成长为技术大牛! 好了,今天的故事就讲到这里了,喜欢我们创业故事的朋友,欢迎点赞、收藏、转发 喜欢我们产品的老板,欢迎购买懒猫微服,评论区打1有优惠!
idoubi
10个月前
AI 生成代码,实时预览的几种方案👇 一、 html + srcdoc + iframe 1. AI 生成可以通过浏览器直接打开的 html 文件(单文件,html/css/js 写到一起) 2. 通过 iframe 的 srcdoc 传入 html 源码预览 3. 通过 importmap 指定依赖包的 CDN 资源。 这种方案实现起来简单,预览效率高。 二、react/vue + blob + iframe 1. AI 生成 react / vue 组件代码(单文件组件,无本地 import 依赖) 2. 通过 Babel.transform 转换 react 组件/通过 VueCompiler 编译 vue 组件 3. 使用转换/编译后的组件,构建一个 html 文件 4. 使用 blob 构建预览 url,传入 iframe.src 预览 const blob = new Blob([html], { type: 'text/html' }); iframe.src = URL.createObjectURL(blob); 这种方案稍微复杂一些,适合 react / vue 单文件组件预览。 3. webcontainer 1. AI 生成组件代码(可以返回多个组件文件,组件可以互相 import) 2. 构建一个最小可运行的 vite 项目骨架,把 vite 骨架包含的文件和 AI 生成的组件打包在一起,构建一个文件树 3. 启动 webcontainer 容器,挂载文件树 4. 通过 webcontainer 执行终端命令,安装项目依赖 5. 通过 webcontainer 启动预览服务,得到预览地址 6. 把预览地址传入 webcontainer 容器外的 iframe.src 实现项目预览 这种方案依赖 webcontainer,可以实现多组件预览,灵活性更高,但是涉及到文件挂载,命令行安装依赖等步骤,预览速度会慢一些。 ----- 总结 ----- 方案一适合用户不关心代码,只想快点看到效果的场景,比如用 Pagen 一句话生成 landing page,页面内容都在一个 html 文件里面。 方案二适合辅助前端写组件场景。比如用 CopyWeb 截图复刻设计,生成单个 react 组件,在线预览效果,导出到本地项目使用。 方案三适合一句话生成完整项目场景,比如用 bolt/v0 一句话生成 nextjs 项目骨架,可在线预览,可导出 zip 到本地修改。