排查谁在修改对象【热度: 500】

这是一个话题性值得问题:

例如:redux 申请了一份数据 store , 整个应用有特别多的地方在修改这个 store , 现在数据出现异常, 如何排查是哪儿场景修改的这份 store 导致的异常;

不仅仅是针对 redux , 我们面临可能是全局对象等场景,对被多个调用方修改的现象。

这个没有一个标准答案, 可以咨询去探索。

作者给几个意见:

  1. 首先不允许直接修改对象, 必须要经过一个封装函数去修改, 修改的时候, 必须要传递 actionUser 信息, 这个 actionUser 表示调用方是谁;

  2. 怎么约束这个事儿呢?就比如我封装了一个函数去修改全局对象,但是就是有人要手动去改这个全局对象。 那么处理方式就是将这个全局对象冻结, 或者 proxy 劫持。 例如 formily 表单里面的 value 就是 proxy 劫持的, 只能允许用户去通过 onChange 修改。

  3. 那如何保证调用方就一定会传递 actionUser 信息呢;因为是一个函数, 所以要是调用方不传递这个会咋样; 解决办法最强硬的就是, 如果不传递 actionUser 就直接不执行, 同时 throw error;稍微温和一点儿就是写一个 eslint 插件, 给予 error 提示;最温和的方式, 就是用 TS interface 去约束入参;