Middleware রিডাক্সের একটি গুরুত্বপূর্ণ কনসেপ্ট, যা অ্যাকশনের প্রক্রিয়া পরিচালনার মাঝে অবস্থিত। এটি একশন ডিসপ্যাচ করার আগে, পরে অথবা সেগুলোর সাথে কিছু অতিরিক্ত লজিক বা আচরণ যোগ করতে সক্ষম। সহজভাবে, middleware হলো একটি ফাংশনাল মডিউল যা অ্যাকশনগুলোকে প্রক্রিয়াজাত করতে এবং স্টোরে তাদের পৌঁছানোর আগে কিছু কার্য সম্পাদন করতে ব্যবহৃত হয়।
Redux-এ মিডলওয়্যার ব্যবহৃত হয় অ্যাসিনক্রোনাস কাজ, লোগিং, একশন ফিল্টারিং, অথবা স্টেট পরিবর্তনের আগে কিছু লজিক প্রয়োগের জন্য। এটি স্টেট ম্যানেজমেন্ট ফ্লোতে এক্সটেনশন বা কাস্টমাইজেশন যোগ করতে সাহায্য করে।
Middleware কী?
Middleware হলো একটি ফাংশন বা একাধিক ফাংশনের সিরিজ, যা Redux স্টোরে পৌঁছানোর আগে বা স্টোর থেকে বের হওয়ার পরে একশনগুলোকে প্রক্রিয়াজাত করতে সাহায্য করে। এটি একটি ফাংশন হিসেবে কাজ করে, যা তিনটি উপাদান নিয়ে কাজ করে:
- Store's dispatch method – অ্যাকশন ডিসপ্যাচ করার জন্য।
- Store's getState method – অ্যাপ্লিকেশনের বর্তমান স্টেট জানার জন্য।
- Next function – পরবর্তী মডিউলে একশন পাস করার জন্য।
এটা একটি হাইয়ার-অর্ডার ফাংশন, যা dispatch, getState, এবং next আর্গুমেন্ট গ্রহণ করে। এটি স্টোরের একশনগুলোর উপর প্রভাব ফেলে এবং অ্যাকশনগুলোর জন্য এক্সটেনশন বা কাস্টম লজিক প্রয়োগ করতে সাহায্য করে।
Middleware কিভাবে কাজ করে?
Redux-এ মিডলওয়্যারকে store তৈরি করার সময় পাস করা হয়। এটি একশন ডিসপ্যাচ হওয়ার পূর্বে বা পরে একটি নির্দিষ্ট কাজ করতে ব্যবহৃত হয়। সাধারণত, মিডলওয়্যারগুলো Redux pipeline-এ অবস্থান করে, যা একশনগুলোর মধ্যে কিছু অতিরিক্ত আচরণ, যেমন লগিং, অ্যাসিনক্রোনাস একশন হ্যান্ডলিং, অথবা ইন্টারসেপ্টিং একশন করে।
মিডলওয়্যার তিনটি মূল ধাপে কাজ করতে পারে:
- একশন প্রক্রিয়া শুরু করার আগে – একশন ডিসপ্যাচ করার আগে কিছু কাজ করা, যেমন লগিং বা ভ্যালিডেশন।
- একশন প্রক্রিয়া চলাকালীন – একশন প্রক্রিয়া চলাকালীন সময়ে কিছু লজিক প্রয়োগ করা, যেমন অ্যাসিনক্রোনাস ফিচার।
- একশন প্রক্রিয়া সম্পন্ন হওয়ার পর – একশন প্রক্রিয়া সম্পন্ন হওয়ার পর, যেমন রেসপন্স পাওয়ার পরে একশন ফিল্টার বা ট্রান্সফর্ম করা।
Middleware ব্যবহারের প্রয়োজনীয়তা
অ্যাসিনক্রোনাস কাজের জন্য
Redux সাধারণত সিনক্রোনাস একশন ব্যবহৃত হলেও, অনেক সময় অ্যাসিনক্রোনাস কাজের (যেমন API কল, টাইমার, বা ডেটা ফেচ) জন্য একশন ডিসপ্যাচ করতে হয়। Redux তাতে সাহায্য করতে middleware ব্যবহার করা হয়, যেমন Redux Thunk বা Redux Saga।- Redux Thunk middleware একশন ক্রিয়েটরের মাধ্যমে অ্যাসিনক্রোনাস কাজ পরিচালনা করতে সহায়তা করে।
- Redux Saga middleware জেনারেটর ফাংশন ব্যবহার করে অ্যাসিনক্রোনাস কাজ এবং সাইড ইফেক্টগুলো ম্যানেজ করতে পারে।
উদাহরণ (Redux Thunk):
function fetchData() { return function(dispatch) { dispatch({ type: 'FETCH_DATA_START' }); fetch('/api/data') .then(response => response.json()) .then(data => { dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data }); }) .catch(error => { dispatch({ type: 'FETCH_DATA_FAILURE', payload: error }); }); }; }এখানে,
fetchDataএকটি অ্যাসিনক্রোনাস কাজ, যাdispatchব্যবহার করে একশন ডিসপ্যাচ করছে।
লগিং এবং ডিবাগিং
স্টেট পরিবর্তনের প্রতিটি পদক্ষেপ লগ করা বা ট্র্যাক করা গুরুত্বপূর্ণ হতে পারে, বিশেষত ডিবাগিং করার সময়। Redux Logger মিডলওয়্যার একটি উদাহরণ, যা একশন ডিসপ্যাচ, স্টেট পরিবর্তন এবং প্রিপ্রোসেসিংকে লগ করে।উদাহরণ (Redux Logger):
import logger from 'redux-logger'; const store = createStore( rootReducer, applyMiddleware(logger) );এখানে,
redux-loggerমিডলওয়্যার ব্যবহার করা হয়েছে, যা একশন ডিসপ্যাচ হওয়ার সময় লগ করবে এবং স্টেট আপডেট পরবর্তী অবস্থা প্রদর্শন করবে।
একশন ফিল্টারিং এবং পরিবর্তন
কিছু একশনকে প্রক্রিয়াজাত করার আগে ফিল্টার করা বা পরিবর্তন করা হতে পারে। যেমন, যদি একশনটি কিছু শর্ত পূরণ না করে, তাহলে তা নিষ্ক্রিয় করা। কিছু মিডলওয়্যার একশন ফিল্টার করতে বা তার আগে শর্ত যাচাই করতে ব্যবহৃত হয়।উদাহরণ (একশন ফিল্টারিং):
const actionFilterMiddleware = store => next => action => { if (action.type === 'BLOCK_ACTION') { // Block the action return; } return next(action); }; const store = createStore( rootReducer, applyMiddleware(actionFilterMiddleware) );এখানে,
actionFilterMiddlewareএকশন ব্লক করার শর্ত প্রদান করছে।
স্টেট বা একশনের ট্রান্সফরমেশন
একশন বা স্টেট কিছু সময় পরে পরিবর্তন করা হতে পারে। যেমন, একশনটির কিছু ডেটা ট্রান্সফর্ম করা, বা কিছু অ্যাডিশনাল তথ্য যোগ করা। মিডলওয়্যার এই পরিবর্তন বা ট্রান্সফরমেশন করার কাজ করতে পারে।উদাহরণ:
const transformActionMiddleware = store => next => action => { if (action.type === 'ADD_ITEM') { action.payload = action.payload.toUpperCase(); } return next(action); }; const store = createStore( rootReducer, applyMiddleware(transformActionMiddleware) );এখানে,
transformActionMiddlewareএকশনটির পে-লোডে ট্রান্সফরমেশন করছে।
Redux Middleware এর কিছু জনপ্রিয় উদাহরণ:
- Redux Thunk: অ্যাসিনক্রোনাস একশন পরিচালনার জন্য।
- Redux Saga: সাইড ইফেক্ট পরিচালনা এবং অ্যাসিনক্রোনাস কাজের জন্য।
- Redux Logger: একশন এবং স্টেট পরিবর্তন লগ করার জন্য।
- Redux DevTools: ডেভেলপার টুলস যেটি স্টোর এবং একশন ট্র্যাক করার জন্য ব্যবহৃত হয়।
- Redux Promise Middleware: প্রমিস ভিত্তিক অ্যাসিনক্রোনাস কাজ পরিচালনার জন্য।
সারাংশ
Middleware Redux-এ একটি গুরুত্বপূর্ণ কনসেপ্ট, যা একশন প্রক্রিয়া করার মাঝে অতিরিক্ত লজিক প্রয়োগ করতে সহায়তা করে। এটি অ্যাসিনক্রোনাস কাজ পরিচালনা, লগিং, একশন ফিল্টারিং, এবং স্টেট পরিবর্তনের ট্রান্সফরমেশন প্রক্রিয়া সহজতর করে। Redux-এ মিডলওয়্যার ব্যবহৃত হয় কোডকে আরও স্কেলেবল, পরিষ্কার এবং কার্যকরী করার জন্য। বিভিন্ন ধরনের মিডলওয়্যার, যেমন Redux Thunk, Redux Logger, এবং Redux Saga, নির্দিষ্ট কাজের জন্য ব্যবহৃত হয়, যা অ্যাপ্লিকেশনকে আরও ভালোভাবে ম্যানেজ করতে সাহায্য করে।
Read more