μ€μν λ―Έλ€μ¨μ΄ ν¨ν΄μ΄ μμλμμ΅λλ€. 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 κΉμ§ μΌνμ΅λλ€.
λ―Έλ€μ¨μ΄ μ΄κΈ°ν νλ‘μΈμ€λ λ§ν¬ν 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
μ΄λ²€νΈλ‘ λ±λ‘ν μ μλ μΌμ’
μ μ½λ°±μΌ μ μμ΅λλ€. κ·Έλ¬λ©΄ λͺ¨λ κ²μ΄ μ μ©λκ³ μμλλ‘ μ μ©λ ν μ νν μκ°μ λ°μ‘ν μ μμ΅λλ€. μκ°ν΄ 보면 ν₯λ―Έλ‘μΈ κ²μ
λλ€.
κ°μ₯ μ μ©ν λκΈ
@markerikson μ, κ·Έ λ¬Έμ λ₯Ό 보μμ΅λλ€. μλ‘μ΄ λμμΈμ΄ "ν΄κ²°νλ" ν΅μ¬ λ¬Έμ λ λ€μκ³Ό κ°μ΅λλ€.
μ΄κ²μ _λλΆλΆμ λ―Έλ€μ¨μ΄κ° μλνλ λ°©μμ κΉ¨λ¨λ¦¬λ_ κ²μ΄ μλλΌ μ ν리μΌμ΄μ κ°λ°μκ° μ²λ¦¬ν΄μΌ νλ ꡬν μΈλΆ μ¬νμΈ IMOμ λλ€. μ€λ₯λ₯Ό λ°μμν€λ λμ κ²½κ³ λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ κ°λ°μλ λ¬Έμ λ₯Ό μλ³νκ³ μ체 λ―Έλ€μ¨μ΄λ₯Ό 리ν©ν λ§νμ¬ ν΄κ²°ν μ μμ΅λλ€.
νμ¬ μνμμλ μ΄ λ΄λΆ λμ€ν¨μΉ ν¨ν΄(κΈ°λ³Έμ μΌλ‘ 무μμ΄λ 리μ€λλ₯Ό μΈμ€ν΄μ€νν΄μΌ νλ λͺ¨λ κ²)μ μ¬μ©νλ νμ¬ λ―Έλ€μ¨μ΄λ₯Ό ν¬ν¨νμ¬ κΈ°μ‘΄μ λͺ¨λ λ―Έλ€μ¨μ΄κ° μμλμμ΅λλ€.
Typescriptλ₯Ό μ¬μ©νκ³ 4.xμλ§ μ¬λ°λ₯Έ μ λ ₯μ΄ μμΌλ―λ‘ 3.xλ₯Ό μ μ§νλ κ²μ λΆννλ μ ν μ¬νμ΄ μλλ©° μΌλ°μ μΌλ‘ ν΅μ¬ λΆλΆμ λ κ±°μ λ²μ μ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. νμ΄νμ΄ λ¬Έμ κ° μλλλΌλ μ ν리μΌμ΄μ λ‘μ§.
κ·Έλ¦¬κ³ μ μκ°μλ μ€λ₯ λ©μμ§ μ체λ κ·Έκ²μ΄ μ€μ λ‘ μΌλ§λ μ€μνμ§ μμμ§λ₯Ό μμν©λλ€. "λ¬Έμ "λ μ€μ λ‘ λ§€μ° λλ¬Όκ² μνλ
Other middleware would not be applied to this dispatch
. λΆμ λ―Έλ€μ¨μ΄κ° λΌμ°ν°μμ μ λ¬λ μμ μ μμ‘΄νλ μ¬μ© μ¬λ‘.reduxμ "μμ "μ νμ¬ μμ νλ €κ³ νλ μ½λλ₯Ό μμ μν¨λ€λ μ μ μ μνλ κ²μ΄ μ€μν©λλ€. λΌμ°ν° λ―Έλ€μ¨μ΄λ₯Ό κΉ¨λ¨λ¦½λλ€. μ΄μ ν΄λΉ λ―Έλ€μ¨μ΄(λ° κΈ°ν λͺ¨λ μ μ¬ν λ―Έλ€μ¨μ΄)μ μμ±μλ 4.x νΈν λ²μ μ λΌμ΄λΈλ¬λ¦¬λ₯Ό 릴리μ€ν΄μΌ νλ©°, μ΄μ μλΉμκ° κ΅¬νν΄μΌ νλ μλμΌλ‘ μ λ¬λ "μ μ₯ μ€λΉ" μμ μ ꡬν μΈλΆ μ 보λ₯Ό λ ΈμΆν΄μΌ ν©λλ€.
λ―Έλ€μ¨μ΄ λΌμ΄λΈλ¬λ¦¬μ μ¬μ©μ λ¨μν ν¨ν€μ§λ₯Ό κ°μ Έμ€κ³ λ―Έλ€μ¨μ΄ λ°°μ΄μ μ½μ νλ κ²μμ λ³κ²½λμ΄ μ΄μ μ± μμ±μκ° μ€ν μ΄ μμ±μ΄ μλ£λ ν μ΄λ μ λ μκ°μ΄ μ§λλ©΄ μμμ "μ€ν μ΄ μ€λΉ" μμ μ μ λ¬νλ ν΄νΉ λ°©λ²μ μ°ΎμμΌ ν©λλ€. μ¬μ©λκΈ° μ μ. μ΄μ λͺ¨λ λ―Έλ€μ¨μ΄λ λμΌν μμ μ νμ μ€μν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ± μμ±μλ λ―Έλ€μ¨μ΄ μμ±μκ° κ΅¬νν APIμ μΌμΉνλ λ€λ₯Έ μ νμ μ¬μ©νμ¬ μ¬λ¬ "μ μ₯ μ€λΉ" μμ μ μ λ¬ν΄μΌ ν©λλ€.
μ΄κ²μ μ§μ§ μλ§μ΄κ³ "μΉλ£"κ° μ΄ κ²½μ° "μ§λ³"λ³΄λ€ ν¨μ¬ λ λμ©λλ€.