题目
一个 DApp 的连接按钮在扩展尚未注入时点击就会报错;另一个 DApp 在服务端渲染的首帧就访问 window。请说明为什么要在连接前判断 provider 是否可用,以及判断方式应该怎样设计。
考察目标
- provider 就绪判断的时机与手段。
- 未就绪、未安装与不支持三类状态的处理。
- SSR 与模块顶层访问浏览器 API 的边界。
在客户端用异步方式获取 provider,再据此决定按钮状态,并避开 SSR 首帧的浏览器对象依赖。
一个 DApp 的连接按钮在扩展尚未注入时点击就会报错;另一个 DApp 在服务端渲染的首帧就访问 window。请说明为什么要在连接前判断 provider 是否可用,以及判断方式应该怎样设计。
wagmi 连接钱包指南给出的做法是在 effect 中异步调用 connector.getProvider(),用返回值决定按钮是否可用;injected connector 还提供 unstable_shimAsyncInject 监听 ethereum#initialized 事件,用来处理扩展延迟注入。这表明「按钮可点」需要以 provider 就绪为前提,而不是点击后再暴露失败。服务端渲染的首帧与模块顶层应当避免访问 window 这类浏览器对象。实现差异与工程取舍见深入回答。
发现这道题有问题? 反馈此题