在使用 Signals 时,组件的变更检测策略如何与 signals 响应性协同工作?
解释 Signals 与 OnPush 变更检测的协作机制:信号写入标记依赖视图,变更检测周期执行视图刷新。澄清信号不自动更新 DOM,而是依赖框架调度,并指出 Default 策略下信号本身不触发检查,难以借此缩小扫描范围。
响应式与性能专题面试题第 1 页,显示第 1–31 题,共找到 31 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
解释 Signals 与 OnPush 变更检测的协作机制:信号写入标记依赖视图,变更检测周期执行视图刷新。澄清信号不自动更新 DOM,而是依赖框架调度,并指出 Default 策略下信号本身不触发检查,难以借此缩小扫描范围。
围绕“computed 里能否包含异步逻辑?如果不能,应如何设计以支持异步数据的响应式计算”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须明确 computed 不能包含异步操作,必须改用 resource + signal 依赖方式实现异步计算。
围绕“Signals 里的 computed 出现循环依赖时会怎样?如何通过设计规避此类问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出运行时会抛出错误,且无法通过延迟求值或惰性加载解决,只能重构依赖结构。
围绕“computed 为何能实现缓存?其缓存策略是否受外部状态影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释缓存基于依赖集合不变性,当依赖未变时返回旧值,不受非依赖变量影响。
围绕“computed 里修改可变对象(如数组或对象)是否会影响依赖追踪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明即使对象被修改,只要其引用未变,就不会触发重新计算,但外部观察者仍可能看到变化。
围绕“computed 里嵌套使用其他 computed 时,依赖图如何构建?是否会产生冗余计算”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明依赖图会合并所有子 computed 的依赖,若父 computed 依赖不变,子计算也不重新执行,无冗余。
围绕“computed 里对可能为空的信号进行操作时,如何避免运行时错误”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明应显式处理 null/undefined,如使用 ?? 或条件判断,不能假设信号始终有值。
围绕“computed 依赖的结构变化(如数组长度改变)是否一定会触发重新计算”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明只要依赖项发生变化,无论类型如何,都会触发重新计算,包括数组长度变化。
围绕“Angular Signals 里的 computed 与 JavaScript memoized 函数有何本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 computed 是基于依赖图的自动追踪,而 memo 函数依赖函数自身逻辑,无法感知外部 signal 变化。
围绕“effect 里等待异步操作完成后再执行后续逻辑,应如何实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明需使用 await 且确保 effect 内部逻辑是异步的,否则无法等待,不能依赖 signal 变化顺序。
围绕“effect 为何应避免用于简单状态更新?有何替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明应使用 signal 更新而非 effect,effect 仅用于副作用,如日志、通知、异步操作。
围绕“effect 里需要防抖时,应如何实现?是否可以用 setTimeout 代替”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明可使用 setTimeout + 取消机制,但需注意信号变化期间可能堆积任务,应使用 takeUntil 防止累积。
围绕“effect 在组件销毁后是否仍会执行?如何防止”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明若未显式取消,会在销毁后继续执行,必须使用 takeUntil(componentDestroyed) 或 onDestroy。
围绕“effect 中引用了外部变量但未显式依赖信号,是否会触发变更检测”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须强调除非变量是 signal,否则不会被追踪,即使变量变化也不会触发 effect,需显式依赖。
本题解释 effect 能否访问注入器及生命周期一致性。结论:在注入上下文创建 effect 后,回调内可安全用 inject();生命周期自动绑定创建环境。本文详解机制、工程场景、失败边界与误区。
围绕“effect 里记录日志时,如何避免因频繁触发导致性能下降”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明应使用防抖或仅在特定条件下输出,不能在每次触发都写入 console,需控制输出频率。
围绕“effect 如何与 RxJS Observable 集成?如何避免多次订阅”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明应使用 takeUntil 从 destroy$ 消费,或使用 async pipe 间接绑定,不能直接订阅而不清理。
围绕“effect 在响应式数据流中为何不能用于返回值?其副作用如何影响变更检测流程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须强调 effect 仅用于副作用,返回值无效且可能干扰依赖追踪。
围绕“effect 是否总是同步执行?在什么情况下会延迟执行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 effect 在 signal 变化时立即执行,但若在变更检测阶段内多次修改,会合并执行一次,非延迟。
围绕“resource 用于加载异步数据时,如何处理请求失败或网络中断”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 resource 支持异常捕获并返回错误状态,可通过 error 属性判断,不依赖外部 try/catch。
围绕“resource 缓存的数据在什么条件下会被清除?是否支持手动清除”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明缓存由依赖变化触发,无主动清除接口,需通过重新调用资源或使用 new 资源实例实现。
围绕“resource 何时应按条件加载?如何确保条件改变时触发新请求”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明条件必须作为参数传入,且参数变化会触发资源重建,否则不会重新请求。
围绕“resource 如何实现延迟加载?是否支持懒加载”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 resource 本身不支持延迟,需通过条件调用或 useResource + defer 实现懒加载行为。
围绕“resource 抛出错误后,如何在视图中安全显示错误信息而不崩溃”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 resource.error 判断并展示错误内容,不能直接读取 result.value,避免未定义访问。
围绕“resource 的相同参数多次调用是否返回同一实例?其身份如何判定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明只要参数值相等,且无副作用,即返回同一实例,依赖于参数的严格相等性。
围绕“Signals 里的资源(resource)如何管理生命周期?它与 effect 有何本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须强调 resource 有内置清理逻辑和自动释放机制,而 effect 不具备,适用于可复用资源。
围绕“resource 能否支持乐观更新模式?如何实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 resource 本身不支持乐观更新,需结合 signal 存储临时状态并在成功后覆盖,不能直接修改 resource。
围绕“resource 为何比 effect + async pipe 组合更高效?关键性能差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 resource 无需手动取消订阅、自动处理重复请求,并在依赖不变时复用结果,减少内存开销。
围绕“多个 resource 同时发起请求时,它们是否并行执行?如何控制并发数”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出默认并行执行,若需串行需手动通过 await or Promise.all 序列化调用,resource 本身不提供控制。
围绕“resource 为何适合跨组件复用?其内部如何保证不同调用间状态隔离”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出每个 resource 调用生成独立实例,状态不共享,依赖于参数唯一性而非全局注册。
围绕“resource 的不同变体(如 withCache, withErrorHandling)如何影响其行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明这些变体是配置选项,不影响核心逻辑,只改变缓存策略或错误处理方式,不引入新机制。