1. Solid 的细粒度响应式原理(信号+派生+effect),与 React 重新渲染的差异?
Solid 的细粒度响应式原理(信号、派生、effect)是什么?与 React 的重新渲染模型有何差异?
- createSignal/createMemo/createEffect 的依赖追踪机制
- JSX 编译为表达式级 effect 的细粒度更新
- 与 React 组件重渲染模型的核心差异
Solid 以信号为响应式基石:createSignal 创建"读-写"对,读取时在当前执行上下文(观察者)中注册依赖,写入时通知所有依赖该信号的观察者;createMemo 派生并缓存计算值,仅在依赖变化时重算;createEffect 执行副作用并自动追踪其读取的信号。JSX 在编译期被分解为表达式级 effect——每个模板插值都是一个独立更新单元,组件函数只在首次创建时执行一次,此后信号变化直接更新对应 DOM 表达式,更新粒度精确到表达式。
与 React 的差异是范式级的:React 中状态变化导致组件函数重新执行、生成新虚拟 DOM 树并 diff;Solid 没有虚拟 DOM、没有"重新渲染组件"的概念,组件是"构建响应式订阅图"的一次性函数,更新成本与组件大小无关、与表达式数量相关。React 需要 memo/useMemo 手工优化避免多余重渲染,Solid 的细粒度追踪天然避免无关更新,但要求开发者把"每次渲染要重算的逻辑"放进 memo/effect 而非组件体内。
本题考察 Solid 响应式模型的核心。回答要点是"读收集、写通知"的追踪机制与 JSX 编译为表达式 effect 的产物,再与 React 重渲染对比,突出"无重渲染"与"表达式级更新"两个关键差异。
const [count, setCount] = createSignal(0);
const doubled = createMemo(() => count() * 2);
createEffect(() => console.log(count(), doubled()));
// 模板中 {doubled()} 只更新该表达式节点