JSON

JSON Schema

如果需要对于 JSON 数据做进一步的 类型约束描述,可以使用 JSON Schema。
它不仅适用于进行 JSON 的约束,也可用于 类 JSON 语义结构 的约束描述。
image.png
典型的如表单控件。其实就是对象描述,但与不受约束的对象不同,JSON Schema 需要遵循一定的规则,这些规则,让它拥有了一种描述性语义,可被共享到其他需要这些语义描述内容的地方。因为是 JSON,所以更通用。

JSON 是用来传递信息的,JSON Schema 则是用来约束所传递信息的规则(类比类型)。类型系统是与语言强相关的(类型系统只在当前语言scope内生效),无法独立出来,JSON Schema 则可以实现在多语言间进行类型信息的共享。
https://json-schema.org/learn/getting-started-step-by-step.html

所以这类具有 通用性 描述语义 的工具,很容易在使用时让人感觉到啰嗦。但通用与简洁不可兼得。可以在高度定制的场景进行使用。或先隐藏使用的入口(配合 Facade Pattern 使用)。

所以 具有JSON结构特性 的数据,都可以用类似的方式来描述约束,典型的如 配置类(各种 config,webpack的一些配置属性名,借鉴了 JSON Schema,如 oneOf,not 等。所以配置的 validation,可以用 JSON Schema 来实现),结构化dom(表单,表格),语法树(所有的AST)。

React

displayName

除了 components 可以添加 displayName,context 也可以,这样利于 devtools 获取更多的信息用于展示:
image.png

  1. export const FieldContext = createContext<Formily.Core.Types.GeneralField>(null)
  2. FieldContext.displayName = 'FieldContext'

redux-saga & dva

redux-sage 提供了 middleware 机制,可以添加中间逻辑,dva 获取了 redux-sage 的 error 后添加了额外的 preventDefault 方法,用于将错误标记为静默处理(不再 throw)
dva-core 中额外添加的内容。
image.png
另可见这个 issure 的讨论:
https://github.com/dvajs/dva/issues/1222#issuecomment-329769388
image.png

redux-saga & error

redux-saga 中的错误栈是不可读的,原因是错误的发生地确实不是 effect 中的源函数,而是调度器,又加上是异步,所以无法还原错误地点。
在1.x 中得以修复:
https://github.com/redux-saga/redux-saga/releases/tag/v1.0.0-beta.1
image.png
可惜 dva 至今未进行更新到 1.x 的 redux-saga。
redux-saga 文档地址:https://redux-saga.js.org/docs/Troubleshooting/#error-stack-for-errors-bubbling-to-root-saga-is-unreadable

dva error

介于 dva 的 error 在抛出时无法记录错误栈信息,目前只能通过babel插件进行信息提取并注入,但必然会导致一些性能损耗,可能最好的方式还是 更新 redux-saga。