Coder Social home page Coder Social logo

redux-devtools-extension's Introduction

⚠️⚠️⚠️🚨🚨🚨⚠️⚠️⚠️

This repo is no longer the home of the redux-devtools-extension. The new home is https://github.com/reduxjs/redux-devtools. Please file your issues and PRs there.

⚠️⚠️⚠️🚨🚨🚨⚠️⚠️⚠️

Redux DevTools Extension

Join the chat at https://gitter.im/zalmoxisus/redux-devtools-extension PRs Welcome OpenCollective OpenCollective

Demo

Installation

1. For Chrome

2. For Firefox

3. For Electron

4. For other browsers and non-browser environment

Usage

Note that starting from v2.7, window.devToolsExtension was renamed to window.__REDUX_DEVTOOLS_EXTENSION__ / window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__.

1. With Redux

1.1 Basic store

For a basic Redux store simply add:

 const store = createStore(
   reducer, /* preloadedState, */
+  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
 );

Note that preloadedState argument is optional in Redux's createStore.

For universal ("isomorphic") apps, prefix it with typeof window !== 'undefined' &&.

const composeEnhancers = (typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;

For TypeScript use redux-devtools-extension npm package, which contains all the definitions, or just use (window as any) (see Recipes for an example).

const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

In case ESLint is configured to not allow using the underscore dangle, wrap it like so:

+ /* eslint-disable no-underscore-dangle */
  const store = createStore(
   reducer, /* preloadedState, */
   window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
  );
+ /* eslint-enable */

Note: Passing enhancer as last argument requires redux@>=3.1.0. For older versions apply it like here or here. Don't mix the old Redux API with the new one.

You don't need to npm install redux-devtools when using the extension (that's a different lib).

1.2 Advanced store setup

If you setup your store with middleware and enhancers, change:

  import { createStore, applyMiddleware, compose } from 'redux';

+ const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
+ const store = createStore(reducer, /* preloadedState, */ composeEnhancers(
- const store = createStore(reducer, /* preloadedState, */ compose(
    applyMiddleware(...middleware)
  ));

Note that when the extension is not installed, we’re using Redux compose here.

To specify extension’s options, use it like so:

const composeEnhancers =
  typeof window === 'object' &&
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?   
    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
      // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
    }) : compose;

const enhancer = composeEnhancers(
  applyMiddleware(...middleware),
  // other store enhancers if any
);
const store = createStore(reducer, enhancer);

See the post for more details.

1.3 Use redux-devtools-extension package from npm

To make things easier, there's an npm package to install:

npm install --save redux-devtools-extension

and to use like so:

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';

const store = createStore(reducer, composeWithDevTools(
  applyMiddleware(...middleware),
  // other store enhancers if any
));

To specify extension’s options:

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';

const composeEnhancers = composeWithDevTools({
  // Specify name here, actionsBlacklist, actionsCreators and other options if needed
});
const store = createStore(reducer, /* preloadedState, */ composeEnhancers(
  applyMiddleware(...middleware),
  // other store enhancers if any
));

There’re just few lines of code added to your bundle.

In case you don't include other enhancers and middlewares, just use devToolsEnhancer:

import { createStore } from 'redux';
import { devToolsEnhancer } from 'redux-devtools-extension';

const store = createStore(reducer, /* preloadedState, */ devToolsEnhancer(
  // Specify name here, actionsBlacklist, actionsCreators and other options if needed
));

1.4 Using in production

It's useful to include the extension in production as well. Usually you can use it for development.

If you want to restrict it there, use redux-devtools-extension/logOnlyInProduction:

import { createStore } from 'redux';
import { devToolsEnhancer } from 'redux-devtools-extension/logOnlyInProduction';

const store = createStore(reducer, /* preloadedState, */ devToolsEnhancer(
  // options like actionSanitizer, stateSanitizer
));

or with middlewares and enhancers:

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension/logOnlyInProduction';

const composeEnhancers = composeWithDevTools({
  // options like actionSanitizer, stateSanitizer
});
const store = createStore(reducer, /* preloadedState, */ composeEnhancers(
  applyMiddleware(...middleware),
  // other store enhancers if any
));

You'll have to add 'process.env.NODE_ENV': JSON.stringify('production') in your Webpack config for the production bundle (to envify). If you use create-react-app, it already does it for you.

If you're already checking process.env.NODE_ENV when creating the store, include redux-devtools-extension/logOnly for production environment.

If you don’t want to allow the extension in production, just use redux-devtools-extension/developmentOnly.

See the article for more details.

1.5 For React Native, hybrid, desktop and server side Redux apps

For React Native we can use react-native-debugger, which already included the same API with Redux DevTools Extension.

For most platforms, include Remote Redux DevTools's store enhancer, and from the extension's context menu choose 'Open Remote DevTools' for remote monitoring.

2. Without Redux

See integrations and the blog post for more details on how to use the extension with any architecture.

Docs

Demo

Live demos to use the extension with:

Also see ./examples folder.

Backers

Support us with a monthly donation and help us continue our activities. [Become a backer]

Sponsors

Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]

License

MIT

Created By

If you like this, follow @mdiordiev on twitter.

redux-devtools-extension's People

Contributors

alexkuz avatar ambientlight avatar bossbossk20 avatar clarkbw avatar evgenykochetkov avatar ganmor avatar gitter-badger avatar grrowl avatar iamakulov avatar jhen0409 avatar minedeljkovic avatar nocoolnametom avatar patrickjs avatar peletiah avatar peteruithoven avatar philraj avatar piamancini avatar pranjal0819 avatar readmecritic avatar scally avatar scottsword avatar timdeschryver avatar tomchentw avatar toranb avatar trevordmiller avatar tyleriguchi avatar zaaack avatar zacacollier avatar zalmoxisus avatar zewa666 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

redux-devtools-extension's Issues

Add iframe support

We have a Redux application that needs to run inside an iframe, but the window.devToolsExtension is not being populated in its context. Apparently that is only available at the main window.

App failing to load-- VM135:1 Uncaught DataCloneError:

The full error: VM135:1 Uncaught DataCloneError: Failed to execute 'postMessage' on 'Window': An object could not be cloned.

Clicking the search/url bar icon, I see that it has the correct initial state of the app in the redux-devtools-extension-window, though the route change actions I expect are not there.

This happens on my actual in-development app, running in a Windows 8 VM, if that's relevant. When I get this error, I have state serialization disabled; however, if I enable state serialization, my site the app seems to hang, and often the whole page will crash. Nothing meaningful shows up in the console. The React Devtools never connect.

I don't have any problem when visiting the example apps.

I'd love to use this, since it's exactly the solution to my current problem with the basic devtools.

Firefox extension

We're supporting firefox with all the features except running from Firefox DevTools panel (which will come as soon as it will be implemented). Minimal required version is Firefox 48, which should be released soon. For now use Firefox Nightly or Developer Edition.

To build the extension run npm i && npm run build:firefox and load the extension's folder ./build/firefox. It is also available on AMO.

Not supported Electron

The #12 is great work, but It still is not work in Electron. :\

Maybe related to this doc.
"Currently Electron doesn't support the background pages feature in Chrome extensions"

Lots of actions makes browser to freeze

Hi in my project we are dispatching action after every key stroke in text field which generates tens of actions.

It is impossible to work, because you need to commit changes after few second of using, when you commit them application works as expected.

I had same problem with Redux devtools which was show on page.

When I hide redux devtools panel it was working perfectly fine. But With your extension it seems that you are rendering all content in popup every time action is dispatched. This is no problem, but can you do that only if popup is shown?

Use `pageAction` instead of `browserAction`?

@zalmoxisus Do you think it would be nicer it the extension is registered as pageAction instead of browserAction. Since we only use it in particular pages instead of every one.

Before the extension can recognize the redux store, we can use it as a permanent page action(displayed on every page)?

crashes about once a day

I absolutely love your extension, it is amazing. I rated it 5 stars. Thanks so much for making it!

I don't know much about chrome plugin development. How can I give you a helpful bug report?

What happens is I'll be using it fine, then about once a day the chrome developer tools window I have docked next to the extension will shrink to the window size I had the extension running at, and the extension window will close.

When this happens the icon in the main chrome window's address bar is no longer present. Sometimes reloading the page fixes it, sometimes disabling and re-enabling the extension then reloading fixes it.

I am using the extension docked to the right of my application window.

Let me know how I can provide more useful info, thanks!

Option for width/height

I'd love to make the devtools popup larger. Will Chrome allow for that? I haven't worked in extension-land in a while.

If you can provide some pointers, I could maybe get some time for a PR.

Thanks!

Saving serialized state?

I'm playing with the idea of saving state and using that to create screenshots of the app in phantomcss.

That way you could make tests of your app by setting up the correct state, saving it and automatically creating screenshots, which then get diffed when your app changes.

To be able to do that, it would be great if the devtools allowed storing the state in a file (and possibly even restoring it from the file). If this functionality is already there, apologies, I missed it.

Scroll Window to the bottom

Whenever I open up the action list, either in the pop up in the url bar, or in my dev tools tray, it defaults to showing the first action. When I open it, usually I am interested in the latest action, not the first. Can I get an option to auto scroll to the bottom?

Question: Patterns for connecting to a store in a WebWorker

Hello,
first of all, thank you for your work. This is a perfect solution for us, who are using redux, but do not run a React based application :)

I still do have a problem though, which is related to the special setup I have: I´m running the complete Redux stack in a WebWorker, including the vDOM diffing part. so the only information my WebWorker is sending back to the main thread are the vDOM patches.
As there is no access the the window object in a WebWorker, Ißm not able to connect my store to the extension. Therefor my question(s) - Did someone managed to connect the extension to a store in a WebWorker? Or did someone manage to assign the extension to the self global of a WebWorker yet (don't know if that´s even possible)?

Any hints or help would be appreciated. Thank you. :)

White popup. Add example?

I've followed the instructions from the readme, but when I visit my project and open the extension it shows a white popup. Probably a javascript error. But I've never made a Chrome extension and I don't know how to debug it.
It would be great if there was a live example (todo?) website that I could visit to check if it was something in my project (not using window.devToolsExtension correctly).

Extend persistState

  • Mange sessions:
    • show all stored sessions,
    • add,
    • delete,
    • select from the DevTools.
  • Share sessions with your team:
    • Generate a special url to be copied and sent to another user.
    • When opened, store the values in localStore.

In Angular2 often the UI does not get refreshed

When using this plugin with ng2, often the UI does update,,,
The underline store gets updated, but I have to manually click on a button to force a change detection for the UI to re-render... it happens about 70% of the time...

regards

Sean

Add hint on how to open as window?

I was having problems finding how to open the extension as a separate window (instead of a automatically closing popup).
It was possible by right clicking on the extension icon and selecting the second Redux DevTools.
Is there a way we can make this easier to find? Maybe add it to the Readme?

State always appears to have initial values

I've been using (and enjoying!) the extension successfully on our app for a while.
After a recent (big) change I discovered that it displays the app state as if it is always in the initial state.

I tried both redux-logger and redux-devtools-log-monitor. Both show the correct state, which leads me to believe it's an issue with the devtools chrome extension and something in the latest changes made on the app.

The app is too big for me to share it here but I will answer questions about it's structure as best I can.

I Would love to hear any suggestions as well as if someone has seen this behavior.

Extension causing reducer dispatch errors

With 0.4.14, I eventually start getting several Unhandled promise rejection Error: Reducers may not dispatch actions. when the extension is enabled. For example, I'll be typing in a form field and suddenly everything stops and the errors appear on every action thereafter. Everything is fine without the extension and I'm definitely not dispatching actions in my own reducers.

Window onMessage is throwing errors in the console

Hi,

I have found an issue that is annoying. I see that redux-devtools-extension is using messages to interact with the page:

// Resend messages from the page to the background script
    window.addEventListener('message', function (event) {
      if (!event || event.source !== window || typeof event.data !== 'string') return;
      var message = JSON.parse(event.data);
      if (message.source !== 'redux-page') return;
      payload = message.payload;
      chrome.runtime.sendMessage(message);
    });

It assumes that, if the event.data is a string, it will by a stringified JSON object. But sometimes it isn't and an exception is thrown.

Freezer is using also messages to implement the nextTick function, and its message data is just the string "nextTick", so the console is full of these errors. You can see it here:

http://freezer-redux-devtools.divshot.io/

Use with freezer-js

Hi @zalmoxisus

Thanks for this great extension, will it be in the extension store soon?

I have created a binding to use redux-devtools with a freezer-js app and I think this extension would be much better for freezer developers than including all redux libraries needed in order to make the devtools work.

So I am trying to build a binding to your extension, but it is not working so far. Currently I am creating the redux store like:

       Redux.compose(
        FreezerMiddleware( State ),
        window.devToolsExtension || function(f){ return f }
    )(Redux.createStore)( function( state ){ return state } );

Inside FreezerStoreEnhancer I get the main app store like:

store = next( reducer )

For standard devTools I have a store that have the devToolsStore attribute inside that I hijack to make the communication between the devtools and freezer.

For the extension I find I have the liftedStore attribute, that I expected to be the same, but it never dispatches the @@INIT action, so the extension is not playing well with the binder.

Do you see something I am doing wrong? Can you explain the differences between standard devToolsStore and yours liftedStore? Is there a way of loading your extension in a dev mode to see the code unminified and makes debug easier?

Cheers

ImmutableJS compatability

Hey,

I first would like to say that I really like your extension, especially the ignore option. I would like to comment on something though.
You decided to nuke the serialize option in release v0.4.9 (https://github.com/zalmoxisus/redux-devtools-extension/releases/tag/v0.4.9). This may work great in many cases, but ImmutableJS by Facebook doesn't throw an error when you try to use unserializable data. This means I cannot see what my data is except for some cryptic ImmutableJS objects.

My suggestion would be to re-enable the option to force serialize, but keep it disabled by default. I could make a PR for this if you agree.

Does action filter accept regex?

It seems using action name as-is works. But regex does not work.

For example I want to filter out all redux-form actions. What I've tried:

  • redux-form/.*
  • redux-form/*
  • redux-form\/.*

Prevents Hot Loader from Refreshing Page

Found another issue. I'm using react-transform-hmr and this extension prevents the page from refreshing if a full refresh is required. For example, if I change code in my action creators. Instead of refreshing, I get a JavaScript TypeError saying e is not a function. Then I have to refresh the page manually.

Any ideas? Thanks!

Uncaught TypeError. Cannot read property 'split' of undefined

When using the extension I get sometimes (not always) an error while initializing my redux/react app.

When disabling the redux-devtools-extension the error does not appear, so it seems to be related.

image

As you can see, the exception is thrown in the isAllowed() function, which is part of the extension.

So my guess, is that here the localOptions.urls are not yet initialized.

Extension's script is injected after the store is created

Due to the version 0.4.1 changes, extension's script is injected after we get options from the chrome storage. Sometimes this operation is too slow (>100ms), and, as a result, our store enhancer is not present when store is created. Probably related to a Chrome bug.

Tried to get the options from the background instead of reading from the store, but it's also delayed.

We should inject script without options, and when the options come, send them to the injected script via messaging. So:

  • the script will be injected even if the page's url is present in the options, but it will not be executed in this case.
  • actions dispatched before we get the options (usually only the first "@@init" action) will act as for default options.

Log monitor does not update when hot reloading a reducer

Steps to reproduce:

  1. trigger some actions
  2. replace a reducer function

Expected: All actions are replayed, putting the app in the right state and replacing the intermediate states in the log.

Actual: All actions are replayed and the app is in the right state, but the log monitor is not updated.

Note that this only happens in the extension, but not when I include LogMonitor in the app myself.

Extension error: Uncaught TypeError

Whenever I try load this extension, I get a notification error with:

Uncaught TypeError: Cannot read property 'initialScrollTop' of undefined.

It seems to cause the window to fail sizing correctly, this is all I'm able to see:

untitled

Option page

We need an option page to configure the extension. At least, it would be possible to enable the extension only for the specific urls. So it would be easy to enable/disable DevTools in production.

If you want something more to be configurable, leave your suggestions here.

Uncaught TypeError: Cannot read property 'state' of undefined

Stacktrace:

Uncaught TypeError: Cannot read property 'state' of undefined
unliftState @ instrument.js?1fd6:307
getState @ instrument.js?1fd6:327
getLocationState @ index.js?efd0:103
middleware.listenForReplays @ index.js?efd0:105
configureStore @ createReduxStore.js?0024:51
(anonymous function) @ index.jsx?2e9e:10
(anonymous function) @ bundle.js:2758__webpack_require__ @ bundle.js:521
fn @ bundle.js:76
(anonymous function) @ bundle.js:555__webpack_require__ @ bundle.js:521
(anonymous function) @ bundle.js:544(anonymous function) @ bundle.js:547

Web Inspector Screenshot

Redux Store Source Code Screenshot

It seem to clash with DevTools.instrument() middleware, maybe a warning should be raised?

Support for Cordova apps

I'm currently developing a Cordova app which I have to run the app in an emulator/phone all the time, due to database dependencies etc. I would then like to attach the developer tool (from chrome://inspect on my desktop) to the phone and see the Redux Devtools from there.

Obviously this doesn't work as of now since the Chrome extension injects properties to the window variable. However, wouldn't it be possible to do this manually in the Cordova app and get it to work? If so, which part of the source do I need to run?

"Failed to retrieve persisted state from storage" or "Uncaught DataCloneError: Failed to execute 'postMessage' on 'Window': An object could not be cloned."

Having trouble getting this to work. Here is my setup:

const combinedReducers = compose(
    mergePersistedState()
)(combineReducers({
    router: routerStateReducer,
    ...reducers
}));


const storage = compose(
    filter('user')
)(adapter(window.sessionStorage));

export default compose(
    applyMiddleware(promiseMiddleware),
    persistState(storage, 'workflow'),
    reduxReactRouter({
        createHistory
    }),
    window.devToolsExtension || (f => f)
)(createStore)(combinedReducers);

This gives me:

Uncaught DataCloneError: Failed to execute 'postMessage' on 'Window': An object could not be cloned.

If I insert the DevTools.instrument() in compose (do we need this?) like so:

export default compose(
    applyMiddleware(promiseMiddleware),
    persistState(storage, 'workflow'),
    reduxReactRouter({
        createHistory
    }),
    DevTools.instrument(),
    window.devToolsExtension || (f => f)
)(createStore)(combinedReducers);

I get:

Failed to retrieve persisted state from storage: TypeError: Cannot read property 'state' of undefined

and

Uncaught TypeError: Cannot read property 'state' of undefined

I can get rid of the first error by removing my persistState (redux-localstorage) plugin. But the second error persists.

Force a zone refresh on Angular2 when time traveling...

In reference to closed: #43 (comment)

so with Angular 2 when using the extension, doing time travel will change the underline store but WILL NOT re-render the view.

The solution:
force zone.run() to push updates on the UI:

 constructor(private appStore:AppStore, private _filmActions:FilmActions, private zone:NgZone) {
        var self = this;
        this.appStore.subscribe((state) => {
            this.zone.run(() => {}); // <!-----------

        });
        this.appStore.dispatch(_filmActions.fetchFilms());
    }

maybe something like this can be added to devtool when in dev mode only, so we can use it with ng2
tx

Sean

Latest version crashes our app

JS error
Uncaught DataCloneError: Failed to execute 'postMessage' on 'Window': An object could not be cloned.
Somewhere around window.postMessage({payload:o.serialize?a"default"

We have to uninstall the extension until this is fixed.

Umbrella 1.0

  • Support for multiple tabs. Before we were detecting when the tab is reactivated, and relayed the whole history tree. It worked pretty well, except the cases when the app has background actions.
  • Use different monitors (wrapped into FilterMonitor). Except the standard monitor, for now we'll add:
  • Ability to have multiple monitors at once (left, right and bottom).
  • Add buttons for opening options and devtools windows from the popup.
  • Support React Native, hybrid, desktop and server side apps.

Usage with redux router spikes CPU to 100%

I've narrowed my issue down to this triggering it:

const finalCreateStoreArgs = [
  applyMiddleware(...middleware),
  //reduxReactRouter({ createHistory }), // <-- runs find when commented
  //devTools(),
  global.devToolsExtension ? global.devToolsExtension() : f => f,
];

// vs

const finalCreateStoreArgs = [
  applyMiddleware(...middleware),
  reduxReactRouter({ createHistory }), // <--- CPU spikes to 100%
  //devTools(),
  global.devToolsExtension ? global.devToolsExtension() : f => f,
];

DevTools' persist state

Implemented DevTools' persistState in f99e203.

Not in WebStore so far. To test it, clone the repository, run npm i & npm run build:extension and load the extension's folder ./build/extension.

As usually, add ?debug_session=<session_name> to the url.

It would be better to create sessions directly from the dev panel, and also to select from the existent sessions.

Duplicate actions when starting up

I have a couple of actions that fire when my app starts (via redux-simple-router and redux-responsive) and the Chrome extension version of devtools shows two copies of each action, if my developer tools window is already open when I refresh the app. Only one copy shows up (as expected) on the regular, in-window version of devtools, or if I open developer tools after refreshing the app. Furthermore, the two phantom actions don't respond to being reverted. If you revert the first copy, the phantoms disappear. They also disappear if I switch tabs and come back.

Chrome 47.0.2526.106 (64-bit)
OS X 10.11.2 (15C50)
Redux DevTools 0.4.12

Extension injects window.devToolsExtension on all pages irregardless of config

Chrome: Version 47.0.2526.80 m

In config the "Inject in all pages" is not checked

The list of regexes contains these 2 expressions:

^https?://localhost|0\.0\.0\.0:\d+
^http://192\.168\..*

but still the window.devToolsExtension is injected to literally every page.

Additionally to that the address bar icon only appears on first page load: that is, only the very first page ever opened in a browser has it till the first page reload. After that the address bar icon never appears again.

The chrome dev tools "Redux" tab works fine though.

Reverse Order of Actions

When I open up the DevTools, I'm only really interested in the current state, not the first one.

Would be nice if the actions were reversed, so the latest one was up top.

If I get some time, I'll do a PR, but this should be super quick to do if ya'll agree :)

(BTW, this tool is freakin' awesome!!)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.