顾名思义,开发工具应该只在开发过程中可见或可访问,而不是在生产环境中。我不希望我的最终用户玩弄状态和调度器,或者看到底层的情况。
有没有办法在生产构建中隐藏Redux Devtools或断开与之的连接?
我正在寻找Vanilla Redux的答案。不是Redux Saga、Redux Thunk或Rematch。
顾名思义,开发工具应该只在开发过程中可见或可访问,而不是在生产环境中。我不希望我的最终用户玩弄状态和调度器,或者看到底层的情况。
有没有办法在生产构建中隐藏Redux Devtools或断开与之的连接?
我正在寻找Vanilla Redux的答案。不是Redux Saga、Redux Thunk或Rematch。
隐藏Redux不受开发工具控制,请注意以下代码:
import { createStore, applyMiddleware, compose } from 'redux';
import createSagaMiddleware from 'redux-saga';
import reducer from '~/redux/reducers';
import mySaga from '~/redux/sagas';
import { nodeEnv } from '~/utils/config';
const composeEnhancers =
(nodeEnv !== 'production' &&
typeof window !== 'undefined' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
compose;
const sagaMiddleware = createSagaMiddleware();
export default createStore(
reducer,
composeEnhancers(applyMiddleware(sagaMiddleware))
);
sagaMiddleware.run(mySaga);
这是Redux和Redux-Saga之间的集成,重点不在于它的重要性,而是:
const composeEnhancers =
(nodeEnv !== 'production' &&
typeof window !== 'undefined' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
compose;
composeEnhancers
是针对客户端和开发模式进行调整的,只需使用__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
即可。否则,代码将使用compose
,这意味着它将从浏览器的开发工具中隐藏。
nodeEnv
是做什么用的? - Chris Paul这些人并没有给出所需的答案,但我在原版redux的文档中自己找到了答案,
如果您在store.js中传递devTools:true
,则它将在生产和开发中均可正常工作,但您可以通过以下方式禁用它:
import { configureStore } from '@reduxjs/toolkit';
import userReducer from '../features/userSlice';
import chatReducer from '../features/chatSlice';
export default configureStore({
reducer: {
user: userReducer,
chat: chatReducer,
},
devTools: false,
});
上述代码是store.js的代码。
这个对我有用,因为我也在使用vanilla redux。当你进行开发时,只需将devTools:true
,然后运行你的应用程序,它就会工作。
注意:如@JamesPlayer在评论中所说(链接到评论),如果你正在使用@reduxjs/toolkit
,这种解决方案将起作用。
devTools: process.env.NODE_ENV === 'development'
- Marcel Mateman对于使用redux-toolkit的人
import { configureStore } from '@reduxjs/toolkit';
const store = configureStore({
reducer: {
//your reducers
},
devTools: process.env.NODE_ENV !== 'production',
});
如果你使用 redux-devtools-extension
,你可以通过以下方式轻松配置你的 store:
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly';
const composeEnhancers = composeWithDevTools({
// options like actionSanitizer, stateSanitizer
});
const store = createStore(reducer, /* preloadedState, */ composeEnhancers(
applyMiddleware(...middleware),
// other store enhancers if any
));
在生产环境中,开发工具中的记录器将被禁用。您可以添加 logOnlyInProduction
以在生产环境中查看日志,而不是使用 developmentOnly
。
尽管后来发现这个问题已经不再适用于新版本的Redux,但一些读者不知道这一点,因为没有人指出,而所有人都在谈论在Redux Saga设置期间从组合增强器中排除__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
。
我发现有几种不同的Redux Devtools
这个来自Dan Abramov的官方仓库。
reduxjs/redux-devtools
是你想要在增强器中添加的NPM软件包,以便在项目中使用Redux Devtools。
有关手动集成和在生产中排除,请查看此页面。
从之前的答案和评论到我的旧样板代码中,这是所有人都使用过的工具。
你可以通过在增强器中添加__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
来添加这些devtools。
const store = createStore(
reducer, /* preloadedState, */
development() &&
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
在生产环境中,应将其移除。
Reactotron是一个基于Electron构建的macOS、Windows和Linux应用程序,用于检查React JS和React Native应用程序。这个工具很棒。它是一个跨平台的Electron应用程序,可用于检查React和React Native应用程序,包括应用程序状态、API请求、性能、错误、sagas和操作分发。
只需将其作为开发依赖项插入即可,因此不会添加任何内容到生产版本中。
对于那些使用Redux和Rematch的人来说,情况则有所不同。
Rematch可以直接与Redux Devtools一起使用,无需进行配置。
init() // initialized with devtools
对于手动集成:
init({
redux: {
devtoolOptions: {
disabled: production(),
},
},
})
redux-devtools-extension
或reactotron
。查看此页面获取更多信息。import {composeWithDevTools} from "redux-devtools-extension/developmentOnly";
index.js
文件中。 process.env.NODE_ENV === "development"
? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
: null || compose;
有一种简单的方法可以禁用生产日志,
let middleware = process.env.NODE_ENV !== 'production' ? [sagaMiddleware, logger] : [sagaMiddleware];
完成了!
createStore
调用中没有添加__REDUX_DEVTOOLS_EXTENSION__
增强器吗?如果有的话,你可以将其添加条件化。 - Jacob