Bolt.new:先在页面上试改,再把整批意图交给 AI
Bolt.new 是浏览器里的 AI 应用构建工具,能将需求变成可运行的网站和应用。Visual Edits 让用户在预览上调整文字与样式,检查一组修改后再保存到代码。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
界面实现进阶
撤销历史和最终修改,怎样同时保持正确?
练习场景
为自己的视觉编辑器设计一个只在本地运行的草稿状态模块。用户可以反复改属性、撤销、重做和放弃单个属性的修改;最终导出相对初始页面的差异。目标是让“操作历史”与“真正需要提交的修改”各自正确。本题不处理网络、模型回调、DOM定位、页面切换、CSS继承或简写属性。
输入与术语
- 初始页面是有序数组,最多100,000个元素。每项是非null对象,含唯一非空字符串id,以及固定三项属性:text为字符串(允许空),fontSize为8到96的整数,color为小写六位HEX字符串,例如
#336699。其他字段忽略。基线在本次会话内只读;三个属性相互独立。 - 最多100,000个事件按到达顺序处理。事件只有四种:set(id, property, value);discard(id, property),把一个属性恢复基线;undo;redo。set与discard只影响一个属性。缺少字段、未知ID或属性、非法类型/值都返回定位明确的错误,当前状态、两个历史栈及差异集合不变;后续合法事件仍可继续。
- 每次真正改变当前值的set或discard构成一个历史步骤,并清空可重做分支。值没有变化的合法事件是无效果事件:不入历史,也不清空重做分支。undo撤销最后一个有效步骤;redo重做最后撤销的步骤;对应栈为空时也是无效果事件。
- 当前值与基线不同的属性才属于待提交差异。一项属性可以经历很多历史步骤,但导出最多一条记录,含id、property、before和after。导出按初始元素顺序,再按text、fontSize、color顺序排列;原值与当前值相等时不得输出。
- 初始化任一元素错误则整次初始化失败,不提供部分可用状态。初始化成功后各事件独立原子处理。字符串已由上游规范化,不要求颜色等价转换或文字长度限制;分析复杂度时明确字符串读取/比较成本的假设。
从这个例子开始
初始只有元素A:text=报名,fontSize=24,color=#888888。依次:①字号设为32;②字号设为28;③颜色设为 #336699;④undo;⑤字号再次设为28(无变化);⑥redo;⑦discard字号;⑧undo;⑨undo;⑩文字设为 立即报名;⑪redo。
请写出③、⑤、⑥、⑦、⑧、⑩、⑪后的当前属性、差异和重做是否可用。特别解释:⑤为什么不能破坏③的重做,⑩为什么必须让⑪没有可重做动作。另在任一中间位置插入非法字号0,说明它不能破坏历史。
交付物
给出基线、当前值、历史与差异索引的职责;手推例子,提出至少五条不变量及测试。要求单次有效set/discard/undo/redo不必遍历整个页面或全部历史;说明n个元素、m个事件、k条最终差异的时间和空间成本。可以用JS的Map等结构说明设计,只给思路,不写完整实现或逐行伪代码。
查看思路
- 把历史和差异分别保存。 基线提供before,当前值提供after;差异索引只保留与基线不相等的属性。历史步骤记录一次真实改变的属性及其前后值,因此连续改字号仍可逐步撤销,不因导出合并而丢失中间值。
- 先验证,再判断是否改变。 非法事件不能修改任一结构。合法但同值的set,以及本来就是基线值的discard,都不动历史与重做分支。只有新发生的真实改变才让旧重做分支失效。
- 恢复历史时只更新一个属性。 undo与redo在两个栈间移动同一步骤,使用该步骤已记录的值,同时重算这一属性是否仍属于差异。不把undo当新编辑压回历史,也不为每一步复制整张页面。
- 核对分支例子。 ③为28和蓝色,两条差异;⑤为28和灰色,仅字号差异,重做仍可用;⑥回到③且无重做。⑦为24和蓝色,仅颜色差异;⑧为28和蓝色且可重做discard;⑨为28和灰色。⑩保留字号28,文字变为立即报名,颜色仍灰色,差异为文字与字号;⑩的新编辑清空旧重做,⑪无变化。各处text在⑩前均为报名。
- 检查成本与不变量。 原基线不变;差异键不重复;差异恰好对应不等于基线的属性;undo/redo能往返一个有效步骤;非法与无效果事件保留重做分支。用ID索引和双栈,使单事件在Map平均访问模型下为O(1),初始化O(n),总历史空间O(m)。导出k条差异按原元素序号与固定属性序排序为O(k log k),输出O(k)空间;另有O(n+k)当前值和索引。若字符串复制或相等比较需要扫描内容,还要计入其实际字符成本,不把任意长text当作无成本操作。