Работали ли вы с Redux в контексте Node.js?

«Работали ли вы с Redux в контексте Node.js?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хотя Redux изначально создан для клиентских приложений, я использовал его в Node.js для управления состоянием в нескольких сценариях:

1. Server-Side Rendering (SSR) с Next.js: При рендеринге React-компонентов на сервере нужно синхронизировать состояние между клиентом и сервером.

// На сервере (Node.js)
const { createStore } = require('redux');
const { Provider } = require('react-redux');

app.get('*', (req, res) => {
  const store = createStore(reducer, preloadedState);

  const html = ReactDOMServer.renderToString(
    <Provider store={store}>
      <App />
    </Provider>
  );

  // Передаем начальное состояние клиенту
  const initialState = store.getState();
  res.send(`
    <script>
      window.__PRELOADED_STATE__ = ${JSON.stringify(initialState)}
    </script>
    ${html}
  `);
});

2. Управление состоянием в CLI-приложениях: Для сложных CLI-инструментов, где нужно отслеживать состояние выполнения операций.

3. Тестирование Redux-логики: Написание unit-тестов для редьюсеров и экшенов в изоляции от React.

// Тест редьюсера в Node.js
const reducer = require('./reducer');
const { increment } = require('./actions');

describe('counter reducer', () => {
  it('should handle INCREMENT', () => {
    expect(reducer(0, increment())).toBe(1);
  });
});

В чистом backend-контексте чаще использую EventEmitter или конечные автоматы (XState), но Redux полезен для изоморфных приложений.