Episode ini membahas integrasi Redux DevTools lewat middleware devtools dengan time-travel dan tracing action, konfigurasi nama store, serta middleware redux untuk memakai pola reducer ala Redux di dalam Zustand.

Melihat state berubah dalam waktu nyata adalah kunci debugging. Episode 10 menghubungkan Zustand dengan Redux DevTools, extension browser yang memberi kalian time-travel dan tracing action. Kita juga membahas middleware redux untuk tim yang ingin memakai mental model reducer ala Redux tanpa meninggalkan Zustand.
Dua middleware ini menjembatani Zustand ke ekosistem debugging dan pola lama yang sudah akrab bagi banyak tim.
Pasang extension Redux DevTools di browser, lalu bungkus store dengan devtools:
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
interface CounterState {
count: number
increment: () => void
}
export const useCounter = create<CounterState>()(
devtools(
(set) => ({
count: 0,
increment: () => set((s) => ({ count: s.count + 1 })),
}),
{ name: 'CounterStore' },
),
)devtools(initializer, { name: 'CounterStore' }) mengirim setiap set sebagai action ke extension. Di panel Redux DevTools, kalian melihat daftar action berlabel nama store, state sebelum dan sesudah, serta diff perubahan.
Opsi name memisahkan beberapa store di panel yang sama:
devtools(initializer, { name: 'AuthStore' })
devtools(initializer, { name: 'CartStore' }){ name: 'AuthStore' } memberi label unik di devtools. Zustand juga mengirim metadata fungsi pembuat state, sehingga action bisa dilacak ke sumbernya di kode — ini kemudahan debugging yang tidak dimiliki Redux klasik tanpa setup tambahan.
Dengan devtools aktif, tombol jump di extension memundurkan state ke titik mana pun dalam histori. Zustand mendukung time-travel ini secara built-in lewat middleware devtools — kalian bisa memutar kembali serangkaian action untuk memahami bagaimana bug muncul.
Info
Redux DevTools berjalan sinkron dan tetap aktif di production jika middleware terpasang. Pertimbangkan untuk mengaktifkan devtools hanya di development agar performa production tidak terganggu.
Untuk tim yang nyaman dengan reducer, Zustand menyediakan middleware redux:
import { create } from 'zustand'
import { redux } from 'zustand/middleware'
type Action = { type: 'inc'; payload?: number } | { type: 'dec' }
function reducer(state: CounterState, action: Action) {
switch (action.type) {
case 'inc':
return { count: state.count + (action.payload ?? 1) }
case 'dec':
return { count: state.count - 1 }
default:
return state
}
}
const initialState: CounterState = { count: 0 }
export const useCounter = create(redux(reducer, initialState))create(redux(reducer, initialState)) menerima reducer murni dan initial state. Dispatch action lewat dispatch yang disediakan store:
const dispatch = useCounter((s) => s.dispatch)
dispatch({ type: 'inc', payload: 2 })dispatch({ type: 'inc', payload: 2 }) mengikuti pola Redux klasik: satu state source of truth, reducer murni yang bisa diuji, dan action ber-typed. Perhatikan tidak ada Provider atau store configuration terpisah.
Middleware redux menjawab kebutuhan tim tertentu:
Jika tidak ada kebutuhan itu, tetap pakai set/get biasa — lebih ringkas dan idiomatis. redux adalah alat jembatan, bukan pengganti default.
Keduanya bisa dikombinasikan: bungkus redux dengan devtools agar pola reducer tetap bisa di-debug:
export const useCounter = create<CounterState>()(
devtools(redux(reducer, initialState), { name: 'CounterRedux' }),
)devtools(redux(reducer, initialState), ...) memberi kalian reducer murni plus time-travel sekaligus. Urutan middleware menentukan bentuk store — bungkus luar terlebih dahulu diproses terakhir saat update.
Episode 10 menghubungkan Zustand ke ekosistem Redux: middleware devtools untuk time-travel dan tracing action di extension browser, serta middleware redux untuk memakai reducer ala Redux dalam satu store tanpa Provider.
Inti yang harus dibawa pulang:
Di episode 11 selanjutnya kita akan membahas persistence dan rehydration lanjutan — custom storage dengan createJSONStorage untuk sessionStorage dan AsyncStorage, serialization, versioning plus migrate untuk state lama, serta penanganan state yang gagal ter-rehydrate.