如何访问 Safari 中的 redux 商店?

Posted

技术标签:

【中文标题】如何访问 Safari 中的 redux 商店?【英文标题】:How do I access the redux store in Safari? 【发布时间】:2020-04-22 09:09:06 【问题描述】:

上下文

我正在尝试调试 React 应用程序,但无法修改源代码以记录 redux 变量。在 chrome 中,我可以通过关联的 extension 访问 redux 商店,但对于 safari,似乎不存在这样的等价物。

问题

如何在 Safari 中访问 redux 商店?我可以使用控制台执行此操作吗?

【问题讨论】:

使用将 redux 状态记录到 console.debug() 的中间件 未修改源代码的问题具体说明 检查您的本地存储。它可能使用redux-persist 之类的东西在刷新之间保持状态。 好电话,但在我的情况下没有这样的运气 我只是想在您的recently deleted question 上指出,您可以根据指定的原点和指定的路线以编程方式控制 CORS。请参阅 corsOptions here 中的 origin 函数。很抱歉劫持了这个问题,但你删除了我正在输入评论的那个。仍然认为我可以提供帮助,但没有任何其他交流方式。 【参考方案1】:

不幸的是,最简单的解决方案是修改源代码,为 Redux 存储设置一个全局变量。 (为了让 Safari 更易于调试,您可能需要预先修改任何您可以控制的应用程序。)

不修改源代码应该是可以的,虽然很别扭。以下说明适用于 React 16.12.0。

    在 Safari 的 Web Inspector(开发工具)中,转到 Elements 选项卡并找到您的 React 根元素(<div id="root"> 或您传递给 ReactDOM.render 的类似元素)。 点击它。 Web Inspector 旁边应显示一个 = $0,表示您现在可以在 Web Inspector 控制台中将该 DOM 节点引用为 $0。 在 Web Inspector 的控制台选项卡中,键入 Object.keys($0) 并按 Enter 以查看 React 添加到 DOM 节点的内部属性。对于我的应用,我看到 ["__reactContainere$8yexuoe6iiv", "_reactRootContainer"]。 通过键入 $0["__reactContainere$8yexuoe6iiv"](替换您的内部属性名称)并按 Enter,将内部 React 对象转储到控制台。 检查对象属性以找到 Redux 存储:在我的应用程序中,它位于 childmemoizedPropsstore 下,但这可能取决于您的 React 组件层次结构的具体情况以及您在何处以及如何使用挂载 Redux 的 <Provider>。 使用您刚刚找到的store 引用调用Redux 的getState。对于我的应用,这意味着输入 $0["__reactContainere$8yexuoe6iiv"].child.memoizedProps.store.getState() 并按 Enter。

上面的一个更简单的单行替代方案:

document.getElementById('root')['_reactRootContainer']._internalRoot.current.child.memoizedProps.store.getState()

【讨论】:

document.getElementById('root')['_reactRootContainer']._internalRoot.current.child.memoizedProps.children.props.store.getState()【参考方案2】:

如果您使用Nextjs 框架,您可以通过在 safari 中打开控制台来实现。在其中输入window。展开它。现在只需检查窗口对象属性。你会发现一个类似'__REDUX'或类似的键。就我而言,它是__NEXT_REDUX_STORE__

现在找到它后,只需在控制台中输入以下内容。:

__NEXT_REDUX_STORE__.getState();

您现在可以检查应用程序当前的 redux 状态。

【讨论】:

我相信__NEXT_REDUX_STORE__是Next.js提供的。如果您使用的是更普通的 Redux 应用程序,您可能会不走运。 是的,它适用于 nextjs。但通常在使用 redux 的 s-s-r 应用程序中,服务器会在 html 标记中发送存储,并从那里创建一个全局变量来存储它。【参考方案3】:

我不知道用于 redux 调试的 safari 扩展(欢迎更正)。该线程表明这是由于缺少开发工具 API:https://github.com/zalmoxisus/redux-devtools-extension/issues/435

Redux 状态不在全局范围内,因此如果不修改源代码,您将无法通过控制台访问它。

【讨论】:

【参考方案4】:

您可以使用connect 函数提取状态。然后把它串起来?

<pre>JSON.stringify(this.props.store, null, 2)</pre>

然后你可以直观地看到它。

【讨论】:

问题说明源代码没有被修改【参考方案5】:

添加到@josh-kelley 的答案...

在 2021 年,使用 Safari 版本 12.1 (14607.1.40.1.4) 进行测试,以下行对我有用:

document.getElementById('root')['_reactRootContainer']
    ._internalRoot.current.child.memoizedProps
    .children.props.store.getState()

注意children.props 与@josh 提到的区别。

【讨论】:

【参考方案6】:

根据其GitHub repository对于其他浏览器使用remote-redux-devtools。

【讨论】:

以上是关于如何访问 Safari 中的 redux 商店?的主要内容,如果未能解决你的问题,请参考以下文章

提供商无法访问redux商店

Reactjs:直接 Firebase 连接与 Firebase Redux 商店

如何访问之前在 Safari 应用程序中设置的 SFSafariViewController 中的值

如何使用react-redux将redux商店中封装的ui状态映射到道具?

如何在类组件中使用 react-redux useSelector?

Redux商店中的巨大物件