Redux: 미듀웨어가 κ³ μž₯λ‚¬μŠ΅λ‹ˆλ‹€

에 λ§Œλ“  2018λ…„ 06μ›” 06일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: reduxjs/redux

벌레

μ€‘μš”ν•œ 미듀웨어 νŒ¨ν„΄μ΄ μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. IMO λŒ€λΆ€λΆ„μ˜ 미듀웨어 μ†”λ£¨μ…˜μ€ 자체 문제λ₯Ό μΊ‘μŠν™”ν•˜κ³  λ‹€λ₯Έ λ―Έλ“€μ›¨μ–΄μ˜ μ‘΄μž¬μ™€ λ¬΄κ΄€ν•©λ‹ˆλ‹€. applyMiddleware μ΄ˆκΈ°ν™” 경둜 λ™μ•ˆ λ‹€λ₯Έ 미듀웨어와 μƒν˜Έ μž‘μš©ν•  λ•Œ λ‹€λ₯Έ λ™μž‘μ„ λ‚˜νƒ€λ‚΄λŠ” λ―Έλ“€μ›¨μ–΄μ˜ νŠΉμ • ν•˜μœ„ 집합에 λŒ€ν•΄ μ‚¬μ†Œν•œ 문제만 λ°œμƒμ‹œν‚€λŠ” νŒ¨ν„΄μ„ κΉ¨κΈ° μœ„ν•΄ μ΅œκ·Όμ— 변경이 μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

μ—¬κΈ° λͺ‡ 가지 μ˜ˆκ°€ μžˆμ–΄μš”.

// Make state aware of browser media queries
const mediaQueries = (mediaQueries = defaultMediaQueries): Middleware => store => {
  if (typeof window !== 'undefined') {
    const reverseMap = createReverseMap(mediaQueries)

    const handleMediaChange = ({media, matches}: MediaChangedActionPayload) =>
      store.dispatch(mediaChanged(reverseMap[media], matches))

    const addMatchListener = (media: string) => {
      const match = window.matchMedia(media)
      match.addListener(handleMediaChange)
      return match.matches
    }

    values(mediaQueries).forEach(media => 
      handleMediaChange({media, matches: addMatchListener(media)}))
  }

  return next => (action: any) => next(action)
}

또 λ‹€λ₯Έ 예:

// Make state aware of user adblockers
const adBlockDetection: Middleware = store => {
  if (typeof document !== 'undefined' && !document.getElementById('XMpADSwgbPUC')) {
    store.dispatch({type: AD_BLOCKER_DETECTED, payload: true})
  }
  return next => (action: any) => next(action)
}

또 λ‹€λ₯Έ 예:

// Make state aware of socket connectivity and allow synchronisation of actions
const socketMiddleware = ({actionCreator, url, dataSync}) => store => {
  const socket = new WebSocket(url.replace(/(http|https)/, 'ws'))

  socket.addEventListener('message', ({data}) => {
    store.dispatch(JSON.parse(data))
  })

  socket.addEventListener('open', () => {
    socket.send(syncCreator(CONNECT_TO_DOMAIN, store.getState(), null, socket))
    store.dispatch(actionCreator({connected: true}))
  })

  socket.addEventListener('close', reason => {
    store.dispatch(actionCreator({connected: false}))
  })

  return next => action => {
    if (dataSync.hasOwnProperty(action.type)) {
      socket.send(syncCreator(action.type, store.getState(), action.payload, socket))
    }
    return next(action)
  }
}

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

applyMiddleware ν•˜λŠ” λ™μ•ˆ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ 본질적으둜 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€.

Uncaught Error: Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch

next => ν•¨μˆ˜μ— μ˜ν•΄ λ‹«νžˆλ„λ‘ μœ„μ˜ 미듀웨어λ₯Ό λ¦¬νŒ©ν† λ§ν•˜λ©΄(μ•„λž˜μ™€ 같이) 차이가 μ—†μŠ΅λ‹ˆλ‹€(κ·ΈλŸ¬λ‚˜ λΆ„λͺ…νžˆ μ‹€ν–‰ κ°€λŠ₯ν•œ μ†”λ£¨μ…˜λ„ μ•„λ‹™λ‹ˆλ‹€).

// Still broken:
const mediaQueries = (mediaQueries = defaultMediaQueries): Middleware => store => next => {
  // ...middlewareCodeGoesHere...
  return (action: any) => next(action)
}

μ˜ˆμƒλ˜λŠ” λ™μž‘μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

앱을 μ†μƒμ‹œν‚€μ§€ λ§ˆμ‹­μ‹œμ˜€. λ‚΄κ°€ μ›ν•˜λŠ” 경우 κ²½κ³ λ₯Ό κΈ°λ‘ν•˜λ©΄ λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 제 μ‚¬μš© μ‚¬λ‘€μ˜ 100%μ—μ„œ _λ‹€λ₯Έ 미듀웨어가 ν•΄λ‹Ή λ””μŠ€νŒ¨μΉ˜λ₯Ό β€‹β€‹μ²˜λ¦¬ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λŠ” μ‹ κ²½ 쓰지 μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‚˜λŠ” 미듀웨어 μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ λ””μŠ€νŒ¨μΉ˜κ°€ μŠ€νƒμ˜ λ‹€λ₯Έ 미듀웨어와 μƒν˜Έ μž‘μš©ν•΄μ•Ό ν•˜λŠ” 합법적인 μ΄μœ κ°€ 거의 μ—†λ‹€κ³ (λ˜λŠ” κ·Έλž˜μ•Όλ§Œ) κ°•λ ₯히 μ˜μ‹¬ν•©λ‹ˆλ‹€. μ΅œμ†Œν•œ 미듀웨어에 λŒ€ν•œ μ•”μ‹œμ  μˆœμ„œ 쒅속성).

μ–΄λ–€ λ²„μ „μ˜ Redux와 μ–΄λ–€ λΈŒλΌμš°μ €μ™€ OSκ°€ 이 문제의 영ν–₯을 λ°›μŠ΅λ‹ˆκΉŒ?

이 PR κΉŒμ§€ μΌν–ˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@markerikson 예, κ·Έ 문제λ₯Ό λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ””μžμΈμ΄ "ν•΄κ²°ν•˜λŠ”" 핡심 λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ—¬κΈ° λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 미듀웨어λ₯Ό μ μš©ν•  λ•Œ ν•΄λ‹Ή λ¦¬μŠ€λ„ˆκ°€ μ‹€ν–‰λ˜λ―€λ‘œ store.dispatchλ₯Ό ν˜ΈμΆœν•˜λ©΄ 미듀웨어가 μ•„λ‹Œ λ””μŠ€νŒ¨μΉ˜κ°€ 호좜되고 뢄석 λ―Έλ“€μ›¨μ–΄λŠ” 이벀트λ₯Ό λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€ .

이것은 _λŒ€λΆ€λΆ„μ˜ 미듀웨어가 μž‘λ™ν•˜λŠ” 방식을 κΉ¨λœ¨λ¦¬λŠ”_ 것이 μ•„λ‹ˆλΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžκ°€ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ΅¬ν˜„ μ„ΈλΆ€ 사항인 IMOμž…λ‹ˆλ‹€. 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” λŒ€μ‹  κ²½κ³ λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžλŠ” 문제λ₯Ό μ‹λ³„ν•˜κ³  자체 미듀웨어λ₯Ό λ¦¬νŒ©ν† λ§ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ μƒνƒœμ—μ„œλŠ” 이 λ‚΄λΆ€ λ””μŠ€νŒ¨μΉ˜ νŒ¨ν„΄(기본적으둜 무엇이든 λ¦¬μŠ€λ„ˆλ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•΄μ•Ό ν•˜λŠ” λͺ¨λ“  것)을 μ‚¬μš©ν•˜λŠ” 타사 미듀웨어λ₯Ό ν¬ν•¨ν•˜μ—¬ 기쑴의 λͺ¨λ“  미듀웨어가 μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Typescriptλ₯Ό μ‚¬μš©ν•˜κ³  4.xμ—λ§Œ μ˜¬λ°”λ₯Έ μž…λ ₯이 μžˆμœΌλ―€λ‘œ 3.xλ₯Ό μœ μ§€ν•˜λŠ” 것은 λΆˆν–‰νžˆλ„ 선택 사항이 μ•„λ‹ˆλ©° 일반적으둜 핡심 λΆ€λΆ„μ˜ λ ˆκ±°μ‹œ 버전을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 타이핑이 λ¬Έμ œκ°€ μ•„λ‹ˆλ”λΌλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직.

그리고 제 μƒκ°μ—λŠ” 였λ₯˜ λ©”μ‹œμ§€ μžμ²΄λ„ 그것이 μ‹€μ œλ‘œ μ–Όλ§ˆλ‚˜ μ€‘μš”ν•˜μ§€ μ•Šμ€μ§€λ₯Ό μ•”μ‹œν•©λ‹ˆλ‹€. "문제"λŠ” μ‹€μ œλ‘œ 맀우 λ“œλ¬Όκ²Œ μ›ν•˜λŠ” Other middleware would not be applied to this dispatch . 뢄석 미듀웨어가 λΌμš°ν„°μ—μ„œ μ „λ‹¬λœ μž‘μ—…μ— μ˜μ‘΄ν•˜λŠ” μ‚¬μš© 사둀.

redux의 "μˆ˜μ •"은 ν˜„μž¬ μˆ˜μ •ν•˜λ €κ³  ν–ˆλ˜ μ½”λ“œλ₯Ό 손상 μ‹œν‚¨λ‹€λŠ” 점에 μœ μ˜ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λΌμš°ν„° 미듀웨어λ₯Ό κΉ¨λœ¨λ¦½λ‹ˆλ‹€. 이제 ν•΄λ‹Ή 미듀웨어(및 기타 λͺ¨λ“  μœ μ‚¬ν•œ 미듀웨어)의 μž‘μ„±μžλŠ” 4.x ν˜Έν™˜ λ²„μ „μ˜ 라이브러리λ₯Ό λ¦΄λ¦¬μŠ€ν•΄μ•Ό ν•˜λ©°, 이제 μ†ŒλΉ„μžκ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μˆ˜λ™μœΌλ‘œ μ „λ‹¬λœ "μ €μž₯ μ€€λΉ„" μž‘μ—…μ˜ κ΅¬ν˜„ μ„ΈλΆ€ 정보λ₯Ό λ…ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

미듀웨어 라이브러리의 μ‚¬μš©μ€ λ‹¨μˆœνžˆ νŒ¨ν‚€μ§€λ₯Ό κ°€μ Έμ˜€κ³  미듀웨어 배열에 μ‚½μž…ν•˜λŠ” κ²ƒμ—μ„œ λ³€κ²½λ˜μ–΄ 이제 μ•± μž‘μ„±μžκ°€ μŠ€ν† μ–΄ 생성이 μ™„λ£Œλœ ν›„ μ–΄λŠ 정도 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μž„μ˜μ˜ "μŠ€ν† μ–΄ μ€€λΉ„" μž‘μ—…μ„ μ „λ‹¬ν•˜λŠ” ν•΄ν‚Ή 방법을 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€. μ‚¬μš©λ˜κΈ° 전에. 이제 λͺ¨λ“  λ―Έλ“€μ›¨μ–΄λŠ” λ™μΌν•œ μž‘μ—… μœ ν˜•μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ•± μž‘μ„±μžλŠ” 미듀웨어 μž‘μ„±μžκ°€ κ΅¬ν˜„ν•œ API와 μΌμΉ˜ν•˜λŠ” λ‹€λ₯Έ μœ ν˜•μ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ "μ €μž₯ μ€€λΉ„" μž‘μ—…μ„ 전달해야 ν•©λ‹ˆλ‹€.

이것은 μ§„μ§œ 엉망이고 "치료"κ°€ 이 경우 "μ§ˆλ³‘"보닀 훨씬 더 λ‚˜μ©λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

미듀웨어 μ΄ˆκΈ°ν™” ν”„λ‘œμ„ΈμŠ€λŠ” λ§ν¬ν•œ PRμ—μ„œ 4.0μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이것은 μ˜λ„μ μΈ 섀계 결정이며 #1240을 ν•΄κ²°ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

λ―Έλ“€μ›¨μ–΄μ˜ 논리λ₯Ό μˆ˜λ™μœΌλ‘œ λ””μŠ€νŒ¨μΉ˜λœ "μŠ€ν† μ–΄ 쀀비됨" μž‘μ—…μ„ 기닀리도둝 λ³€κ²½ν•˜λŠ” 것 μ™Έμ—λŠ” μ‚¬μš© 사둀에 λŒ€ν•œ 즉각적인 μ œμ•ˆμ΄ μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. λŒ€μ‹  3.xλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

@markerikson 예, κ·Έ 문제λ₯Ό λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ””μžμΈμ΄ "ν•΄κ²°ν•˜λŠ”" 핡심 λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ—¬κΈ° λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 미듀웨어λ₯Ό μ μš©ν•  λ•Œ ν•΄λ‹Ή λ¦¬μŠ€λ„ˆκ°€ μ‹€ν–‰λ˜λ―€λ‘œ store.dispatchλ₯Ό ν˜ΈμΆœν•˜λ©΄ 미듀웨어가 μ•„λ‹Œ λ””μŠ€νŒ¨μΉ˜κ°€ 호좜되고 뢄석 λ―Έλ“€μ›¨μ–΄λŠ” 이벀트λ₯Ό λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€ .

이것은 _λŒ€λΆ€λΆ„μ˜ 미듀웨어가 μž‘λ™ν•˜λŠ” 방식을 κΉ¨λœ¨λ¦¬λŠ”_ 것이 μ•„λ‹ˆλΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžκ°€ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ΅¬ν˜„ μ„ΈλΆ€ 사항인 IMOμž…λ‹ˆλ‹€. 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” λŒ€μ‹  κ²½κ³ λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžλŠ” 문제λ₯Ό μ‹λ³„ν•˜κ³  자체 미듀웨어λ₯Ό λ¦¬νŒ©ν† λ§ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ μƒνƒœμ—μ„œλŠ” 이 λ‚΄λΆ€ λ””μŠ€νŒ¨μΉ˜ νŒ¨ν„΄(기본적으둜 무엇이든 λ¦¬μŠ€λ„ˆλ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•΄μ•Ό ν•˜λŠ” λͺ¨λ“  것)을 μ‚¬μš©ν•˜λŠ” 타사 미듀웨어λ₯Ό ν¬ν•¨ν•˜μ—¬ 기쑴의 λͺ¨λ“  미듀웨어가 μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Typescriptλ₯Ό μ‚¬μš©ν•˜κ³  4.xμ—λ§Œ μ˜¬λ°”λ₯Έ μž…λ ₯이 μžˆμœΌλ―€λ‘œ 3.xλ₯Ό μœ μ§€ν•˜λŠ” 것은 λΆˆν–‰νžˆλ„ 선택 사항이 μ•„λ‹ˆλ©° 일반적으둜 핡심 λΆ€λΆ„μ˜ λ ˆκ±°μ‹œ 버전을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 타이핑이 λ¬Έμ œκ°€ μ•„λ‹ˆλ”λΌλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직.

그리고 제 μƒκ°μ—λŠ” 였λ₯˜ λ©”μ‹œμ§€ μžμ²΄λ„ 그것이 μ‹€μ œλ‘œ μ–Όλ§ˆλ‚˜ μ€‘μš”ν•˜μ§€ μ•Šμ€μ§€λ₯Ό μ•”μ‹œν•©λ‹ˆλ‹€. "문제"λŠ” μ‹€μ œλ‘œ 맀우 λ“œλ¬Όκ²Œ μ›ν•˜λŠ” Other middleware would not be applied to this dispatch . 뢄석 미듀웨어가 λΌμš°ν„°μ—μ„œ μ „λ‹¬λœ μž‘μ—…μ— μ˜μ‘΄ν•˜λŠ” μ‚¬μš© 사둀.

redux의 "μˆ˜μ •"은 ν˜„μž¬ μˆ˜μ •ν•˜λ €κ³  ν–ˆλ˜ μ½”λ“œλ₯Ό 손상 μ‹œν‚¨λ‹€λŠ” 점에 μœ μ˜ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λΌμš°ν„° 미듀웨어λ₯Ό κΉ¨λœ¨λ¦½λ‹ˆλ‹€. 이제 ν•΄λ‹Ή 미듀웨어(및 기타 λͺ¨λ“  μœ μ‚¬ν•œ 미듀웨어)의 μž‘μ„±μžλŠ” 4.x ν˜Έν™˜ λ²„μ „μ˜ 라이브러리λ₯Ό λ¦΄λ¦¬μŠ€ν•΄μ•Ό ν•˜λ©°, 이제 μ†ŒλΉ„μžκ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μˆ˜λ™μœΌλ‘œ μ „λ‹¬λœ "μ €μž₯ μ€€λΉ„" μž‘μ—…μ˜ κ΅¬ν˜„ μ„ΈλΆ€ 정보λ₯Ό λ…ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

미듀웨어 라이브러리의 μ‚¬μš©μ€ λ‹¨μˆœνžˆ νŒ¨ν‚€μ§€λ₯Ό κ°€μ Έμ˜€κ³  미듀웨어 배열에 μ‚½μž…ν•˜λŠ” κ²ƒμ—μ„œ λ³€κ²½λ˜μ–΄ 이제 μ•± μž‘μ„±μžκ°€ μŠ€ν† μ–΄ 생성이 μ™„λ£Œλœ ν›„ μ–΄λŠ 정도 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μž„μ˜μ˜ "μŠ€ν† μ–΄ μ€€λΉ„" μž‘μ—…μ„ μ „λ‹¬ν•˜λŠ” ν•΄ν‚Ή 방법을 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€. μ‚¬μš©λ˜κΈ° 전에. 이제 λͺ¨λ“  λ―Έλ“€μ›¨μ–΄λŠ” λ™μΌν•œ μž‘μ—… μœ ν˜•μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ•± μž‘μ„±μžλŠ” 미듀웨어 μž‘μ„±μžκ°€ κ΅¬ν˜„ν•œ API와 μΌμΉ˜ν•˜λŠ” λ‹€λ₯Έ μœ ν˜•μ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ "μ €μž₯ μ€€λΉ„" μž‘μ—…μ„ 전달해야 ν•©λ‹ˆλ‹€.

이것은 μ§„μ§œ 엉망이고 "치료"κ°€ 이 경우 "μ§ˆλ³‘"보닀 훨씬 더 λ‚˜μ©λ‹ˆλ‹€.

κ·€ν•˜μ˜ λͺ¨λ“  μ˜ˆμ œκ°€ μž‘λ™ν•˜λ„λ‘ λ§Œλ“œλŠ” 것은 μ—¬μ „νžˆ ​​가λŠ₯ν•©λ‹ˆλ‹€. applyMiddleware 이후에 λ””μŠ€νŒ¨μΉ˜ν•˜λ©΄ λ©λ‹ˆλ‹€. μ•„λ§ˆλ„ μΌμ’…μ˜ setupMiddleware(store) κΈ°λŠ₯μ΄λ‚˜ μŠ€ν† μ–΄ μΈν•Έμ„œμΌ κ²ƒμž…λ‹ˆλ‹€.

였λ₯˜λŠ” λŒ€μ•ˆμœΌλ‘œ μ˜λ„μ μœΌλ‘œ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 원인이 맀우 λΆˆλΆ„λͺ…ν•œ 경우λ₯Ό ν—ˆμš©ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€( applyMiddleware 의 내뢀에 μ΅μˆ™ν•˜μ§€ μ•Šμ€ 경우). ReduxλŠ” κ°€λŠ₯ν•  λ•Œλ§ˆλ‹€ μ‚¬μš©μž 였λ₯˜λ₯Ό λ°©μ§€ν•˜λŠ” μž…μž₯을 μ·¨ν•˜λ―€λ‘œ 이것이 사라지지 μ•ŠμŠ΅λ‹ˆλ‹€.

ν•œ 가지 λŒ€μ•ˆμ€ 미듀웨어가 μΌμ’…μ˜ afterApply 이벀트둜 등둝할 수 μžˆλŠ” μΌμ’…μ˜ 콜백일 수 μžˆμŠ΅λ‹ˆλ‹€. 그러면 λͺ¨λ“  것이 적용되고 μˆœμ„œλŒ€λ‘œ 적용된 ν›„ μ •ν™•ν•œ μ‹œκ°„μ— λ°œμ†‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 생각해 보면 ν₯미둜울 κ²ƒμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰