如何在运行 React 的 Chrome 扩展中运行 Redux DevTools 扩展?

Posted

技术标签:

【中文标题】如何在运行 React 的 Chrome 扩展中运行 Redux DevTools 扩展?【英文标题】:How to run Redux DevTools Extension INSIDE Chrome Extension running React? 【发布时间】:2018-12-02 20:01:00 【问题描述】:

我面临的一个大问题是,当我的 React 应用在 Chrome 扩展程序中运行时,我在尝试访问我在 Redux DevTools Extension 中的 redux 商店时看到了错误 "No store found"

我在 SO 上看到了一些关于类似错误的问题,例如:

    “No store found” when using Redux chrome extension" "How to add Redux DevTools Extension to my react-redux store?"

这些问题的大部分答案都与指定正确的变量有关,例如使用 window.__REDUX_DEVTOOLS_EXTENSION__ 而不是 devToolsExtension(在扩展程序升级后),或安装 npmredux-devtools-extension

我的问题不同 - 如果我在 Chrome 扩展之外(也就是不是通过 Chrome 扩展的 options 页面)运行我的 React 应用程序(在开发模式下),我发现 Redux DevTools 扩展对我来说很好用.但是,正如我之前提到的,当我从 Chrome 扩展程序 options 页面中运行 React 应用程序时,Redux DevTools 扩展程序找不到商店。

这是我在options 页面中使用的index.js 文件:

import React from 'react';
import ReactDOM from 'react-dom';
import  Provider  from 'react-redux';
import  createStore, applyMiddleware, compose, combineReducers  from 'redux';
import thunk from 'redux-thunk';

import App from './App';
import rootReducer from './store/reducers/root';

// 
const composeEnhancers = process.env.NODE_ENV === 'development'
    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
    : null
        || compose;

const store = createStore(rootReducer, composeEnhancers(
    applyMiddleware(thunk)
));

const app = (
    <Provider store=store>
        <App />
    </Provider>
);

ReactDOM.render(app, document.getElementById('root'));

我认为该错误与我在 Chrome 扩展程序的 options 页面中运行 React 应用程序有关。我发现window.__REDUX_DEVTOOLS_EXTENSION__ 是来自Chrome 扩展程序options 页面的undefined,但window.__REDUX_DEVTOOLS_EXTENSION__ 变量在普通页面上是可见和可访问的。在 Chrome 扩展程序的 options 页面中是否有任何经过验证的方法可以使 window.__REDUX_DEVTOOLS_EXTENSION__ 可用?

【问题讨论】:

扩展程序无法在另一个扩展程序的页面上下文中运行它们的脚本,这就是 Redux 扩展程序无法在 window 上定义属性的原因。 @wOxxOm 哦,真可惜...我想这是有道理的...那么您认为可能的解决方法是让扩展来回传递消息吗?我在 chrome 扩展文档中看到了这个,但没有使用它。此外,Redux DevTools Extension 可能实际上并不支持它,但理论上它可以这样工作,对吧?? 是的,如果两个扩展都支持,跨扩展消息传递可以工作。 【参考方案1】:

在这种情况下,您可以使用Remote Redux Devtools。

将此添加到您的商店创建中 (yarn add --dev remote-redux-devtools):

import devToolsEnhancer from "remote-redux-devtools";

const store = createStore(
  popupReducer,
  devToolsEnhancer(
    hostname: "localhost",
    port: 8000,
    realtime: true
  ) 
);

你还需要一个远程开发服务器,我用的是本地的:

yarn add --dev remotedev-server
cd /node_modules/.bin/
remotedev --port=8000

现在您可以使用chrome extension 连接和监控您的商店,点击远程按钮,进入设置并点击“使用自定义(本地)服务器”,您应该可以实时看到您的商店。

【讨论】:

以上是关于如何在运行 React 的 Chrome 扩展中运行 Redux DevTools 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

React.js Chrome 扩展 - 如何将 Background.js 中的数据存储在 React 内部的变量中?

如何在 react-native iOS 应用程序中运行时读取 Info.Plist?

如何在 react-native iOS 应用程序中运行时读取 Info.Plist?

如何使用具有多个页面和入口点的 React 和 TypeScript 设置 chrome 扩展?

为使用React的网站制作Chrome扩展程序。重新渲染后如何保持更改?

你如何调试 React Native?