അനാവശ്യമായ റീ-റെൻഡറുകൾ തടഞ്ഞുകൊണ്ട് റിയാക്ട് ആപ്ലിക്കേഷനുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിനുള്ള ഒരു സമ്പൂർണ്ണ ഗൈഡ്. മെച്ചപ്പെട്ട പ്രകടനത്തിനായി മെമ്മോയിസേഷൻ, PureComponent, shouldComponentUpdate പോലുള്ള ടെക്നിക്കുകൾ പഠിക്കാം.
റിയാക്ട് റെൻഡർ ഒപ്റ്റിമൈസേഷൻ: അനാവശ്യമായ റീ-റെൻഡറുകൾ തടയുന്നതിൽ വൈദഗ്ദ്ധ്യം നേടാം
യൂസർ ഇൻ്റർഫേസുകൾ നിർമ്മിക്കുന്നതിനുള്ള ശക്തമായ ജാവാസ്ക്രിപ്റ്റ് ലൈബ്രറിയായ റിയാക്ട്, ചിലപ്പോൾ അമിതമായ അല്ലെങ്കിൽ അനാവശ്യമായ റീ-റെൻഡറുകൾ കാരണം പ്രകടനത്തിലെ തടസ്സങ്ങൾ നേരിടാം. ധാരാളം കമ്പോണൻ്റുകളുള്ള സങ്കീർണ്ണമായ ആപ്ലിക്കേഷനുകളിൽ, ഈ റീ-റെൻഡറുകൾ പ്രകടനത്തെ കാര്യമായി കുറയ്ക്കുകയും, ഉപയോക്താക്കൾക്ക് വേഗത കുറഞ്ഞ അനുഭവം നൽകുകയും ചെയ്യും. ഈ ഗൈഡ്, റിയാക്ടിൽ അനാവശ്യമായ റീ-റെൻഡറുകൾ തടയുന്നതിനുള്ള സാങ്കേതിക വിദ്യകളെക്കുറിച്ച് വിശദമായ ഒരു അവലോകനം നൽകുന്നു, നിങ്ങളുടെ ആപ്ലിക്കേഷനുകൾ ലോകമെമ്പാടുമുള്ള ഉപയോക്താക്കൾക്ക് വേഗതയേറിയതും കാര്യക്ഷമവും പ്രതികരണശേഷിയുള്ളതുമാണെന്ന് ഉറപ്പാക്കുന്നു.
റിയാക്ടിലെ റീ-റെൻഡറുകളെക്കുറിച്ച് മനസ്സിലാക്കാം
ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കുകളിലേക്ക് കടക്കുന്നതിന് മുമ്പ്, റിയാക്ടിൻ്റെ റെൻഡറിംഗ് പ്രക്രിയ എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് മനസ്സിലാക്കേണ്ടത് അത്യാവശ്യമാണ്. ഒരു കമ്പോണൻ്റിൻ്റെ സ്റ്റേറ്റ് (state) അല്ലെങ്കിൽ പ്രോപ്സ് (props) മാറുമ്പോൾ, റിയാക്ട് ആ കമ്പോണൻ്റിൻ്റെയും അതിൻ്റെ ചൈൽഡ് കമ്പോണൻ്റുകളുടെയും ഒരു റീ-റെൻഡർ ട്രിഗർ ചെയ്യുന്നു. ഈ പ്രക്രിയയിൽ വെർച്വൽ DOM അപ്ഡേറ്റ് ചെയ്യുകയും, യഥാർത്ഥ DOM-ൽ വരുത്തേണ്ട ഏറ്റവും കുറഞ്ഞ മാറ്റങ്ങൾ നിർണ്ണയിക്കാൻ അതിനെ മുൻ പതിപ്പുമായി താരതമ്യം ചെയ്യുകയും ചെയ്യുന്നു.
എന്നിരുന്നാലും, എല്ലാ സ്റ്റേറ്റ് അല്ലെങ്കിൽ പ്രോപ്സ് മാറ്റങ്ങൾക്കും ഒരു DOM അപ്ഡേറ്റ് ആവശ്യമില്ല. പുതിയ വെർച്വൽ DOM പഴയതിന് സമാനമാണെങ്കിൽ, റീ-റെൻഡർ അടിസ്ഥാനപരമായി വിഭവങ്ങൾ പാഴാക്കലാണ്. ഈ അനാവശ്യ റീ-റെൻഡറുകൾ വിലയേറിയ സിപിയു സൈക്കിളുകൾ ഉപയോഗിക്കുകയും, പ്രത്യേകിച്ച് സങ്കീർണ്ണമായ കമ്പോണൻ്റ് ട്രീകളുള്ള ആപ്ലിക്കേഷനുകളിൽ പ്രകടന പ്രശ്നങ്ങളിലേക്ക് നയിക്കുകയും ചെയ്യും.
അനാവശ്യ റീ-റെൻഡറുകൾ കണ്ടെത്തൽ
റീ-റെൻഡറുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിലെ ആദ്യപടി അവ എവിടെയാണ് സംഭവിക്കുന്നതെന്ന് കണ്ടെത്തലാണ്. ഇതിനായി റിയാക്ട് നിരവധി ടൂളുകൾ നൽകുന്നുണ്ട്:
1. റിയാക്ട് പ്രൊഫൈലർ (React Profiler)
ക്രോം, ഫയർഫോക്സ് എന്നിവയ്ക്കുള്ള റിയാക്ട് ഡെവലപ്പർ ടൂൾസ് എക്സ്റ്റൻഷനിൽ ലഭ്യമായ റിയാക്ട് പ്രൊഫൈലർ, നിങ്ങളുടെ റിയാക്ട് കമ്പോണൻ്റുകളുടെ പ്രകടനം റെക്കോർഡ് ചെയ്യാനും വിശകലനം ചെയ്യാനും നിങ്ങളെ അനുവദിക്കുന്നു. ഏത് കമ്പോണൻ്റുകളാണ് റീ-റെൻഡർ ചെയ്യുന്നതെന്നും, അവ റെൻഡർ ചെയ്യാൻ എത്ര സമയമെടുക്കുന്നുവെന്നും, എന്തിനാണ് അവ റീ-റെൻഡർ ചെയ്യുന്നതെന്നും ഇത് വ്യക്തമാക്കുന്നു.
പ്രൊഫൈലർ ഉപയോഗിക്കാൻ, DevTools-ലെ "Record" ബട്ടൺ എനേബിൾ ചെയ്ത് നിങ്ങളുടെ ആപ്ലിക്കേഷനുമായി ഇടപഴകുക. റെക്കോർഡിംഗിന് ശേഷം, പ്രൊഫൈലർ കമ്പോണൻ്റ് ട്രീയും അതിൻ്റെ റെൻഡറിംഗ് സമയവും കാണിക്കുന്ന ഒരു ഫ്ലേം ചാർട്ട് പ്രദർശിപ്പിക്കും. റെൻഡർ ചെയ്യാൻ കൂടുതൽ സമയമെടുക്കുന്നതോ അല്ലെങ്കിൽ അടിക്കടി റീ-റെൻഡർ ചെയ്യുന്നതോ ആയ കമ്പോണൻ്റുകൾ ഒപ്റ്റിമൈസേഷന് ഏറ്റവും അനുയോജ്യമായവയാണ്.
2. Why Did You Render?
"Why Did You Render?" എന്നത് ഒരു ലൈബ്രറിയാണ്, ഇത് അനാവശ്യമായേക്കാവുന്ന റീ-റെൻഡറുകളെക്കുറിച്ച് നിങ്ങളെ അറിയിക്കാൻ റിയാക്ടിനെ പാച്ച് ചെയ്യുന്നു. റീ-റെൻഡറിന് കാരണമായ പ്രത്യേക പ്രോപ്പർട്ടികൾ കൺസോളിൽ ലോഗ് ചെയ്താണ് ഇത് ചെയ്യുന്നത്. റീ-റെൻഡറിംഗ് പ്രശ്നങ്ങളുടെ മൂലകാരണം കണ്ടെത്താൻ ഇത് വളരെ സഹായകമാകും.
"Why Did You Render?" ഉപയോഗിക്കാൻ, ഇത് ഒരു ഡെവലപ്മെൻ്റ് ഡിപൻഡൻസിയായി ഇൻസ്റ്റാൾ ചെയ്യുക:
npm install @welldone-software/why-did-you-render --save-dev
തുടർന്ന്, ഇത് നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ എൻട്രി പോയിൻ്റിൽ (ഉദാഹരണത്തിന്, index.js) ഇമ്പോർട്ട് ചെയ്യുക:
import whyDidYouRender from '@welldone-software/why-did-you-render';
if (process.env.NODE_ENV === 'development') {
whyDidYouRender(React, {
include: [/.*/]
});
}
ഈ കോഡ് ഡെവലപ്മെൻ്റ് മോഡിൽ "Why Did You Render?" പ്രവർത്തനക്ഷമമാക്കുകയും അനാവശ്യമായേക്കാവുന്ന റീ-റെൻഡറുകളെക്കുറിച്ചുള്ള വിവരങ്ങൾ കൺസോളിലേക്ക് ലോഗ് ചെയ്യുകയും ചെയ്യും.
3. Console.log സ്റ്റേറ്റ്മെൻ്റുകൾ
ഒരു ലളിതവും എന്നാൽ ഫലപ്രദവുമായ ഒരു മാർഗ്ഗം, നിങ്ങളുടെ കമ്പോണൻ്റിൻ്റെ render
മെത്തേഡിൽ (അല്ലെങ്കിൽ ഫംഗ്ഷണൽ കമ്പോണൻ്റ് ബോഡിയിൽ) console.log
സ്റ്റേറ്റ്മെൻ്റുകൾ ചേർത്ത് അത് എപ്പോഴാണ് റീ-റെൻഡർ ചെയ്യുന്നതെന്ന് ട്രാക്ക് ചെയ്യുക എന്നതാണ്. പ്രൊഫൈലറിനെയോ "Why Did You Render?"-നെയോ അപേക്ഷിച്ച് ഇത് അത്ര സങ്കീർണ്ണമല്ലെങ്കിലും, പ്രതീക്ഷിച്ചതിലും കൂടുതൽ തവണ റീ-റെൻഡർ ചെയ്യുന്ന കമ്പോണൻ്റുകൾ വേഗത്തിൽ കണ്ടെത്താൻ ഇത് സഹായിക്കും.
അനാവശ്യ റീ-റെൻഡറുകൾ തടയാനുള്ള ടെക്നിക്കുകൾ
പ്രകടന പ്രശ്നങ്ങൾക്ക് കാരണമാകുന്ന കമ്പോണൻ്റുകൾ തിരിച്ചറിഞ്ഞുകഴിഞ്ഞാൽ, അനാവശ്യമായ റീ-റെൻഡറുകൾ തടയാൻ നിങ്ങൾക്ക് വിവിധ സാങ്കേതിക വിദ്യകൾ ഉപയോഗിക്കാം:
1. മെമ്മോയിസേഷൻ (Memoization)
വലിയ ഫംഗ്ഷൻ കോളുകളുടെ ഫലങ്ങൾ കാഷെ ചെയ്യുകയും, അതേ ഇൻപുട്ടുകൾ വീണ്ടും വരുമ്പോൾ കാഷെ ചെയ്ത ഫലം തിരികെ നൽകുകയും ചെയ്യുന്ന ഒരു ശക്തമായ ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കാണ് മെമ്മോയിസേഷൻ. റിയാക്ടിൽ, പ്രോപ്സുകൾ മാറിയിട്ടില്ലെങ്കിൽ കമ്പോണൻ്റുകൾ റീ-റെൻഡർ ചെയ്യുന്നത് തടയാൻ മെമ്മോയിസേഷൻ ഉപയോഗിക്കാം.
a. React.memo
React.memo
ഒരു ഫംഗ്ഷണൽ കമ്പോണൻ്റിനെ മെമ്മോയിസ് ചെയ്യുന്ന ഒരു ഹയർ-ഓർഡർ കമ്പോണൻ്റാണ്. ഇത് നിലവിലെ പ്രോപ്സുകളെ മുൻ പ്രോപ്സുകളുമായി ഷാലോ കംപയർ (shallowly compares) ചെയ്യുകയും പ്രോപ്സുകൾ മാറിയിട്ടുണ്ടെങ്കിൽ മാത്രം കമ്പോണൻ്റിനെ റീ-റെൻഡർ ചെയ്യുകയും ചെയ്യുന്നു.
ഉദാഹരണം:
const MyComponent = React.memo(function MyComponent(props) {
return <div>{props.data}</div>;
});
സ്ഥിരമായി, React.memo
എല്ലാ പ്രോപ്സുകളുടെയും ഒരു ഷാലോ കംപാരിസൺ നടത്തുന്നു. താരതമ്യത്തിനുള്ള ലോജിക്ക് ഇഷ്ടാനുസൃതമാക്കാൻ നിങ്ങൾക്ക് React.memo
-യുടെ രണ്ടാമത്തെ ആർഗ്യുമെൻ്റായി ഒരു കസ്റ്റം കംപാരിസൺ ഫംഗ്ഷൻ നൽകാം.
const MyComponent = React.memo(function MyComponent(props) {
return <div>{props.data}</div>;
}, (prevProps, nextProps) => {
// പ്രോപ്സുകൾ തുല്യമാണെങ്കിൽ true, അല്ലെങ്കിൽ false റിട്ടേൺ ചെയ്യുക
return prevProps.data === nextProps.data;
});
b. useMemo
useMemo
ഒരു കണക്കുകൂട്ടലിൻ്റെ ഫലം മെമ്മോയിസ് ചെയ്യുന്ന ഒരു റിയാക്ട് ഹുക്ക് ആണ്. ഇത് ഒരു ഫംഗ്ഷനും ഒരു ഡിപൻഡൻസികളുടെ അറേയും ആർഗ്യുമെൻ്റുകളായി എടുക്കുന്നു. ഡിപൻഡൻസികളിൽ ഒന്ന് മാറുമ്പോൾ മാത്രമേ ഫംഗ്ഷൻ വീണ്ടും എക്സിക്യൂട്ട് ചെയ്യപ്പെടുകയുള്ളൂ, തുടർന്നുള്ള റെൻഡറുകളിൽ മെമ്മോയിസ് ചെയ്ത ഫലം തിരികെ നൽകും.
വലിയ കണക്കുകൂട്ടലുകൾ മെമ്മോയിസ് ചെയ്യുന്നതിനോ അല്ലെങ്കിൽ ചൈൽഡ് കമ്പോണൻ്റുകളിലേക്ക് പ്രോപ്സായി കൈമാറുന്ന ഒബ്ജക്റ്റുകളിലേക്കോ ഫംഗ്ഷനുകളിലേക്കോ സ്ഥിരമായ റെഫറൻസുകൾ ഉണ്ടാക്കുന്നതിനോ useMemo
പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാണ്.
ഉദാഹരണം:
const memoizedValue = useMemo(() => {
// ഇവിടെ വലിയ കണക്കുകൂട്ടലുകൾ നടത്തുക
return computeExpensiveValue(a, b);
}, [a, b]);
2. PureComponent
PureComponent
എന്നത് റിയാക്ട് കമ്പോണൻ്റുകൾക്കുള്ള ഒരു ബേസ് ക്ലാസാണ്, അത് അതിൻ്റെ shouldComponentUpdate
മെത്തേഡിൽ പ്രോപ്സുകളുടെയും സ്റ്റേറ്റിൻ്റെയും ഒരു ഷാലോ കംപാരിസൺ നടപ്പിലാക്കുന്നു. പ്രോപ്സുകളും സ്റ്റേറ്റും മാറിയിട്ടില്ലെങ്കിൽ, കമ്പോണൻ്റ് റീ-റെൻഡർ ചെയ്യില്ല.
റെൻഡറിംഗിനായി പൂർണ്ണമായും പ്രോപ്സുകളെയും സ്റ്റേറ്റിനെയും ആശ്രയിക്കുകയും കോൺടെക്സ്റ്റിലോ മറ്റ് ബാഹ്യ ഘടകങ്ങളിലോ ആശ്രയിക്കാതിരിക്കുകയും ചെയ്യുന്ന കമ്പോണൻ്റുകൾക്ക് PureComponent
ഒരു നല്ല തിരഞ്ഞെടുപ്പാണ്.
ഉദാഹരണം:
class MyComponent extends React.PureComponent {
render() {
return <div>{this.props.data}</div>;
}
}
പ്രധാന കുറിപ്പ്: PureComponent
-ഉം React.memo
-ഉം ഷാലോ കംപാരിസണുകളാണ് നടത്തുന്നത്. അതായത്, അവ ഒബ്ജക്റ്റുകളുടെയും അറേകളുടെയും റെഫറൻസുകൾ മാത്രമേ താരതമ്യം ചെയ്യുകയുള്ളൂ, അവയുടെ ഉള്ളടക്കങ്ങളെയല്ല. നിങ്ങളുടെ പ്രോപ്സുകളിലോ സ്റ്റേറ്റിലോ നെസ്റ്റഡ് ഒബ്ജക്റ്റുകളോ അറേകളോ ഉണ്ടെങ്കിൽ, മാറ്റങ്ങൾ ശരിയായി കണ്ടെത്തുന്നുവെന്ന് ഉറപ്പാക്കാൻ നിങ്ങൾക്ക് ഇമ്മ്യൂട്ടബിലിറ്റി പോലുള്ള ടെക്നിക്കുകൾ ഉപയോഗിക്കേണ്ടി വന്നേക്കാം.
3. shouldComponentUpdate
ഒരു കമ്പോണൻ്റ് റീ-റെൻഡർ ചെയ്യണമോ വേണ്ടയോ എന്ന് സ്വമേധയാ നിയന്ത്രിക്കാൻ shouldComponentUpdate
എന്ന ലൈഫ് സൈക്കിൾ മെത്തേഡ് നിങ്ങളെ അനുവദിക്കുന്നു. ഈ മെത്തേഡിന് അടുത്ത പ്രോപ്സുകളും അടുത്ത സ്റ്റേറ്റും ആർഗ്യുമെൻ്റുകളായി ലഭിക്കുന്നു, കമ്പോണൻ്റ് റീ-റെൻഡർ ചെയ്യണമെങ്കിൽ true
അല്ലെങ്കിൽ ചെയ്യരുതെങ്കിൽ false
റിട്ടേൺ ചെയ്യണം.
റീ-റെൻഡറിംഗിൽ ഏറ്റവും കൂടുതൽ നിയന്ത്രണം shouldComponentUpdate
നൽകുന്നുണ്ടെങ്കിലും, ഇതിന് ഏറ്റവും കൂടുതൽ മാനുവൽ പ്രയത്നവും ആവശ്യമാണ്. ഒരു റീ-റെൻഡർ ആവശ്യമാണോ എന്ന് നിർണ്ണയിക്കാൻ നിങ്ങൾ പ്രസക്തമായ പ്രോപ്സുകളും സ്റ്റേറ്റും ശ്രദ്ധാപൂർവ്വം താരതമ്യം ചെയ്യേണ്ടതുണ്ട്.
ഉദാഹരണം:
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// ഇവിടെ പ്രോപ്സുകളും സ്റ്റേറ്റും താരതമ്യം ചെയ്യുക
return nextProps.data !== this.props.data || nextState.count !== this.state.count;
}
render() {
return <div>{this.props.data}</div>;
}
}
ജാഗ്രത: shouldComponentUpdate
തെറ്റായി നടപ്പിലാക്കുന്നത് അപ്രതീക്ഷിത പെരുമാറ്റങ്ങൾക്കും ബഗുകൾക്കും ഇടയാക്കും. നിങ്ങളുടെ താരതമ്യ ലോജിക്ക് സമഗ്രമാണെന്നും എല്ലാ പ്രസക്തമായ ഘടകങ്ങളും കണക്കിലെടുക്കുന്നുണ്ടെന്നും ഉറപ്പാക്കുക.
4. useCallback
useCallback
ഒരു ഫംഗ്ഷൻ ഡെഫനിഷൻ മെമ്മോയിസ് ചെയ്യുന്ന ഒരു റിയാക്ട് ഹുക്ക് ആണ്. ഇത് ഒരു ഫംഗ്ഷനും ഒരു ഡിപൻഡൻസികളുടെ അറേയും ആർഗ്യുമെൻ്റുകളായി എടുക്കുന്നു. ഡിപൻഡൻസികളിൽ ഒന്ന് മാറുമ്പോൾ മാത്രമേ ഫംഗ്ഷൻ പുനർനിർവചിക്കപ്പെടുകയുള്ളൂ, തുടർന്നുള്ള റെൻഡറുകളിൽ മെമ്മോയിസ് ചെയ്ത ഫംഗ്ഷൻ തിരികെ നൽകും.
React.memo
അല്ലെങ്കിൽ PureComponent
ഉപയോഗിക്കുന്ന ചൈൽഡ് കമ്പോണൻ്റുകളിലേക്ക് ഫംഗ്ഷനുകൾ പ്രോപ്സായി കൈമാറുന്നതിന് useCallback
പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാണ്. ഫംഗ്ഷൻ മെമ്മോയിസ് ചെയ്യുന്നതിലൂടെ, പാരൻ്റ് കമ്പോണൻ്റ് റീ-റെൻഡർ ചെയ്യുമ്പോൾ ചൈൽഡ് കമ്പോണൻ്റ് അനാവശ്യമായി റീ-റെൻഡർ ചെയ്യുന്നത് നിങ്ങൾക്ക് തടയാൻ കഴിയും.
ഉദാഹരണം:
const handleClick = useCallback(() => {
// ക്ലിക്ക് ഇവൻ്റ് കൈകാര്യം ചെയ്യുക
console.log('Clicked!');
}, []);
5. ഇമ്മ്യൂട്ടബിലിറ്റി (Immutability)
ഡാറ്റയെ മാറ്റമില്ലാത്തതായി കണക്കാക്കുന്ന ഒരു പ്രോഗ്രാമിംഗ് ആശയമാണ് ഇമ്മ്യൂട്ടബിലിറ്റി, അതായത് അത് സൃഷ്ടിച്ചതിന് ശേഷം മാറ്റാൻ കഴിയില്ല. ഇമ്മ്യൂട്ടബിൾ ഡാറ്റയുമായി പ്രവർത്തിക്കുമ്പോൾ, ഏതൊരു മാറ്റവും നിലവിലുള്ളതിനെ പരിഷ്കരിക്കുന്നതിനുപകരം ഒരു പുതിയ ഡാറ്റാ സ്ട്രക്ച്ചർ ഉണ്ടാക്കുന്നതിലേക്ക് നയിക്കുന്നു.
റിയാക്ട് റീ-റെൻഡറുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന് ഇമ്മ്യൂട്ടബിലിറ്റി നിർണായകമാണ്, കാരണം ഇത് ഷാലോ കംപാരിസണുകൾ ഉപയോഗിച്ച് പ്രോപ്സുകളിലെയും സ്റ്റേറ്റിലെയും മാറ്റങ്ങൾ എളുപ്പത്തിൽ കണ്ടെത്താൻ റിയാക്ടിനെ അനുവദിക്കുന്നു. നിങ്ങൾ ഒരു ഒബ്ജക്റ്റോ അറേയോ നേരിട്ട് മാറ്റുകയാണെങ്കിൽ, റിയാക്ടിന് മാറ്റം കണ്ടെത്താൻ കഴിയില്ല, കാരണം ഒബ്ജക്റ്റിലേക്കോ അറേയിലേക്കോ ഉള്ള റെഫറൻസ് അതേപടി നിലനിൽക്കുന്നു.
റിയാക്ടിൽ ഇമ്മ്യൂട്ടബിൾ ഡാറ്റയുമായി പ്രവർത്തിക്കാൻ നിങ്ങൾക്ക് Immutable.js അല്ലെങ്കിൽ Immer പോലുള്ള ലൈബ്രറികൾ ഉപയോഗിക്കാം. ഈ ലൈബ്രറികൾ ഇമ്മ്യൂട്ടബിൾ ഡാറ്റ ഉണ്ടാക്കാനും കൈകാര്യം ചെയ്യാനും എളുപ്പമാക്കുന്ന ഡാറ്റാ സ്ട്രക്ച്ചറുകളും ഫംഗ്ഷനുകളും നൽകുന്നു.
Immer ഉപയോഗിച്ചുള്ള ഉദാഹരണം:
import { useImmer } from 'use-immer';
function MyComponent() {
const [data, setData] = useImmer({
name: 'John',
age: 30
});
const updateName = () => {
setData(draft => {
draft.name = 'Jane';
});
};
return (
<div>
<p>Name: {data.name}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
}
6. കോഡ് സ്പ്ലിറ്റിംഗും ലേസി ലോഡിംഗും (Code Splitting and Lazy Loading)
നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ കോഡിനെ ആവശ്യാനുസരണം ലോഡ് ചെയ്യാൻ കഴിയുന്ന ചെറിയ ഭാഗങ്ങളായി വിഭജിക്കുന്ന ഒരു ടെക്നിക്കാണ് കോഡ് സ്പ്ലിറ്റിംഗ്. ഇത് നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ പ്രാരംഭ ലോഡ് സമയം ഗണ്യമായി മെച്ചപ്പെടുത്താൻ സഹായിക്കും, കാരണം ബ്രൗസറിന് നിലവിലെ കാഴ്ചയ്ക്ക് ആവശ്യമായ കോഡ് മാത്രം ഡൗൺലോഡ് ചെയ്താൽ മതി.
React.lazy
ഫംഗ്ഷനും Suspense
കമ്പോണൻ്റും ഉപയോഗിച്ച് റിയാക്ട് കോഡ് സ്പ്ലിറ്റിംഗിനായി ബിൽറ്റ്-ഇൻ പിന്തുണ നൽകുന്നു. React.lazy
കമ്പോണൻ്റുകൾ ഡൈനാമിക്കായി ഇമ്പോർട്ട് ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു, അതേസമയം Suspense
കമ്പോണൻ്റ് ലോഡുചെയ്യുമ്പോൾ ഒരു ഫാൾബാക്ക് UI കാണിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
ഉദാഹരണം:
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
7. കീ-കൾ (Keys) കാര്യക്ഷമമായി ഉപയോഗിക്കുക
റിയാക്ടിൽ എലമെൻ്റുകളുടെ ലിസ്റ്റുകൾ റെൻഡർ ചെയ്യുമ്പോൾ, ഓരോ എലമെൻ്റിനും തനതായ കീ-കൾ നൽകേണ്ടത് നിർണായകമാണ്. ഏതൊക്കെ എലമെൻ്റുകൾ മാറിയിട്ടുണ്ടെന്നും, ചേർത്തിട്ടുണ്ടെന്നും, അല്ലെങ്കിൽ നീക്കം ചെയ്തിട്ടുണ്ടെന്നും തിരിച്ചറിയാൻ കീ-കൾ റിയാക്ടിനെ സഹായിക്കുന്നു, ഇത് DOM കാര്യക്ഷമമായി അപ്ഡേറ്റ് ചെയ്യാൻ അനുവദിക്കുന്നു.
അറേയിലെ ഇൻഡെക്സുകൾ കീ-കളായി ഉപയോഗിക്കുന്നത് ഒഴിവാക്കുക, കാരണം അറേയിലെ എലമെൻ്റുകളുടെ ക്രമം മാറുമ്പോൾ അവ മാറാം, ഇത് അനാവശ്യമായ റീ-റെൻഡറുകളിലേക്ക് നയിക്കും. പകരം, ഓരോ എലമെൻ്റിനും ഒരു ഡാറ്റാബേസിൽ നിന്നുള്ള ഐഡി അല്ലെങ്കിൽ ജനറേറ്റ് ചെയ്ത UUID പോലുള്ള ഒരു തനതായ ഐഡൻ്റിഫയർ ഉപയോഗിക്കുക.
8. കോൺടെക്സ്റ്റ് ഉപയോഗം ഒപ്റ്റിമൈസ് ചെയ്യുക (Optimizing Context Usage)
കമ്പോണൻ്റ് ട്രീയുടെ ഓരോ ലെവലിലൂടെയും പ്രോപ്സുകൾ വ്യക്തമായി കൈമാറാതെ കമ്പോണൻ്റുകൾക്കിടയിൽ ഡാറ്റ പങ്കിടാനുള്ള ഒരു മാർഗ്ഗം റിയാക്ട് കോൺടെക്സ്റ്റ് നൽകുന്നു. എന്നിരുന്നാലും, കോൺടെക്സ്റ്റിൻ്റെ അമിതമായ ഉപയോഗം പ്രകടന പ്രശ്നങ്ങളിലേക്ക് നയിച്ചേക്കാം, കാരണം ഒരു കോൺടെക്സ്റ്റ് ഉപയോഗിക്കുന്ന ഏതൊരു കമ്പോണൻ്റും കോൺടെക്സ്റ്റ് മൂല്യം മാറുമ്പോഴെല്ലാം റീ-റെൻഡർ ചെയ്യും.
കോൺടെക്സ്റ്റ് ഉപയോഗം ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന്, ഈ തന്ത്രങ്ങൾ പരിഗണിക്കുക:
- ഒന്നിലധികം, ചെറിയ കോൺടെക്സ്റ്റുകൾ ഉപയോഗിക്കുക: എല്ലാ ആപ്ലിക്കേഷൻ ഡാറ്റയും സംഭരിക്കുന്നതിന് ഒരൊറ്റ, വലിയ കോൺടെക്സ്റ്റ് ഉപയോഗിക്കുന്നതിന് പകരം, അതിനെ ചെറുതും കൂടുതൽ ശ്രദ്ധ കേന്ദ്രീകരിച്ചതുമായ കോൺടെക്സ്റ്റുകളായി വിഭജിക്കുക. ഇത് ഒരു നിർദ്ദിഷ്ട കോൺടെക്സ്റ്റ് മൂല്യം മാറുമ്പോൾ റീ-റെൻഡർ ചെയ്യുന്ന കമ്പോണൻ്റുകളുടെ എണ്ണം കുറയ്ക്കും.
- കോൺടെക്സ്റ്റ് മൂല്യങ്ങൾ മെമ്മോയിസ് ചെയ്യുക: കോൺടെക്സ്റ്റ് പ്രൊവൈഡർ നൽകുന്ന മൂല്യങ്ങൾ മെമ്മോയിസ് ചെയ്യാൻ
useMemo
ഉപയോഗിക്കുക. മൂല്യങ്ങൾ യഥാർത്ഥത്തിൽ മാറിയിട്ടില്ലെങ്കിൽ കോൺടെക്സ്റ്റ് കൺസ്യൂമറുകളുടെ അനാവശ്യ റീ-റെൻഡറുകൾ ഇത് തടയും. - കോൺടെക്സ്റ്റിന് പകരമുള്ളവ പരിഗണിക്കുക: ചില സന്ദർഭങ്ങളിൽ, പ്രത്യേകിച്ച് ധാരാളം കമ്പോണൻ്റുകളും അടിക്കടിയുള്ള സ്റ്റേറ്റ് അപ്ഡേറ്റുകളുമുള്ള സങ്കീർണ്ണമായ ആപ്ലിക്കേഷനുകൾക്ക്, Redux അല്ലെങ്കിൽ Zustand പോലുള്ള മറ്റ് സ്റ്റേറ്റ് മാനേജ്മെൻ്റ് സൊല്യൂഷനുകൾ കോൺടെക്സ്റ്റിനേക്കാൾ കൂടുതൽ ഉചിതമായേക്കാം.
അന്താരാഷ്ട്ര പരിഗണനകൾ
ഒരു ആഗോള പ്രേക്ഷകർക്കായി റിയാക്ട് ആപ്ലിക്കേഷനുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുമ്പോൾ, ഇനിപ്പറയുന്ന ഘടകങ്ങൾ പരിഗണിക്കേണ്ടത് പ്രധാനമാണ്:
- വ്യത്യസ്ത നെറ്റ്വർക്ക് വേഗതകൾ: വിവിധ പ്രദേശങ്ങളിലെ ഉപയോക്താക്കൾക്ക് വളരെ വ്യത്യസ്തമായ നെറ്റ്വർക്ക് വേഗതകൾ ഉണ്ടായിരിക്കാം. നെറ്റ്വർക്കിലൂടെ ഡൗൺലോഡ് ചെയ്യുകയും കൈമാറ്റം ചെയ്യുകയും ചെയ്യേണ്ട ഡാറ്റയുടെ അളവ് കുറയ്ക്കുന്നതിന് നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ഒപ്റ്റിമൈസ് ചെയ്യുക. ഇമേജ് ഒപ്റ്റിമൈസേഷൻ, കോഡ് സ്പ്ലിറ്റിംഗ്, ലേസി ലോഡിംഗ് തുടങ്ങിയ ടെക്നിക്കുകൾ ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.
- ഉപകരണങ്ങളുടെ കഴിവുകൾ: ഉപയോക്താക്കൾ ഉയർന്ന നിലവാരമുള്ള സ്മാർട്ട്ഫോണുകൾ മുതൽ പഴയതും ശക്തി കുറഞ്ഞതുമായ ഉപകരണങ്ങൾ വരെ പലതരം ഉപകരണങ്ങളിൽ നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ആക്സസ് ചെയ്യാം. പലതരം ഉപകരണങ്ങളിൽ നന്നായി പ്രവർത്തിക്കാൻ നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ഒപ്റ്റിമൈസ് ചെയ്യുക. റെസ്പോൺസീവ് ഡിസൈൻ, അഡാപ്റ്റീവ് ഇമേജുകൾ, പെർഫോമൻസ് പ്രൊഫൈലിംഗ് തുടങ്ങിയ ടെക്നിക്കുകൾ ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.
- പ്രാദേശികവൽക്കരണം (Localization): നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ഒന്നിലധികം ഭാഷകളിലേക്ക് പ്രാദേശികവൽക്കരിച്ചിട്ടുണ്ടെങ്കിൽ, പ്രാദേശികവൽക്കരണ പ്രക്രിയ പ്രകടന തടസ്സങ്ങൾ ഉണ്ടാക്കുന്നില്ലെന്ന് ഉറപ്പാക്കുക. കാര്യക്ഷമമായ പ്രാദേശികവൽക്കരണ ലൈബ്രറികൾ ഉപയോഗിക്കുക, നിങ്ങളുടെ കമ്പോണൻ്റുകളിൽ നേരിട്ട് ടെക്സ്റ്റ് സ്ട്രിംഗുകൾ ഹാർഡ്കോഡ് ചെയ്യുന്നത് ഒഴിവാക്കുക.
യഥാർത്ഥ ലോക ഉദാഹരണങ്ങൾ
ഈ ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കുകൾ എങ്ങനെ പ്രയോഗിക്കാമെന്നതിൻ്റെ ചില യഥാർത്ഥ ലോക ഉദാഹരണങ്ങൾ നമുക്ക് പരിഗണിക്കാം:
1. ഇ-കൊമേഴ്സ് ഉൽപ്പന്ന ലിസ്റ്റിംഗ്
നൂറുകണക്കിന് ഉൽപ്പന്നങ്ങൾ പ്രദർശിപ്പിക്കുന്ന ഒരു ഉൽപ്പന്ന ലിസ്റ്റിംഗ് പേജുള്ള ഒരു ഇ-കൊമേഴ്സ് വെബ്സൈറ്റ് സങ്കൽപ്പിക്കുക. ഓരോ ഉൽപ്പന്ന ഇനവും ഒരു പ്രത്യേക കമ്പോണൻ്റായി റെൻഡർ ചെയ്യുന്നു.
ഒപ്റ്റിമൈസേഷൻ ഇല്ലാതെ, ഉപയോക്താവ് ഉൽപ്പന്ന ലിസ്റ്റ് ഫിൽട്ടർ ചെയ്യുകയോ അടുക്കുകയോ ചെയ്യുമ്പോഴെല്ലാം, എല്ലാ ഉൽപ്പന്ന കമ്പോണൻ്റുകളും റീ-റെൻഡർ ചെയ്യും, ഇത് വേഗത കുറഞ്ഞതും തടസ്സങ്ങളുള്ളതുമായ അനുഭവത്തിലേക്ക് നയിക്കും. ഇത് ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന്, ഉൽപ്പന്ന കമ്പോണൻ്റുകൾ മെമ്മോയിസ് ചെയ്യാൻ നിങ്ങൾക്ക് React.memo
ഉപയോഗിക്കാം, അവയുടെ പ്രോപ്സുകൾ (ഉദാ. ഉൽപ്പന്നത്തിൻ്റെ പേര്, വില, ചിത്രം) മാറുമ്പോൾ മാത്രം അവ റീ-റെൻഡർ ചെയ്യുന്നുവെന്ന് ഉറപ്പാക്കാം.
2. സോഷ്യൽ മീഡിയ ഫീഡ്
ഒരു സോഷ്യൽ മീഡിയ ഫീഡ് സാധാരണയായി പോസ്റ്റുകളുടെ ഒരു ലിസ്റ്റ് പ്രദർശിപ്പിക്കുന്നു, ഓരോന്നിനും അഭിപ്രായങ്ങളും ലൈക്കുകളും മറ്റ് ഇൻ്ററാക്ടീവ് ഘടകങ്ങളും ഉണ്ട്. ഒരു ഉപയോക്താവ് ഒരു പോസ്റ്റ് ലൈക്ക് ചെയ്യുകയോ ഒരു അഭിപ്രായം ചേർക്കുകയോ ചെയ്യുമ്പോഴെല്ലാം മുഴുവൻ ഫീഡും റീ-റെൻഡർ ചെയ്യുന്നത് കാര്യക്ഷമമല്ലാത്തതാകും.
ഇത് ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന്, പോസ്റ്റുകളിൽ ലൈക്ക് ചെയ്യുന്നതിനും കമൻ്റ് ചെയ്യുന്നതിനുമുള്ള ഇവൻ്റ് ഹാൻഡ്ലറുകൾ മെമ്മോയിസ് ചെയ്യാൻ നിങ്ങൾക്ക് useCallback
ഉപയോഗിക്കാം. ഈ ഇവൻ്റ് ഹാൻഡ്ലറുകൾ ട്രിഗർ ചെയ്യുമ്പോൾ പോസ്റ്റ് കമ്പോണൻ്റുകൾ അനാവശ്യമായി റീ-റെൻഡർ ചെയ്യുന്നത് ഇത് തടയും.
3. ഡാറ്റാ വിഷ്വലൈസേഷൻ ഡാഷ്ബോർഡ്
ഒരു ഡാറ്റാ വിഷ്വലൈസേഷൻ ഡാഷ്ബോർഡ് പലപ്പോഴും പുതിയ ഡാറ്റ ഉപയോഗിച്ച് അടിക്കടി അപ്ഡേറ്റ് ചെയ്യുന്ന സങ്കീർണ്ണമായ ചാർട്ടുകളും ഗ്രാഫുകളും പ്രദർശിപ്പിക്കുന്നു. ഡാറ്റ മാറുമ്പോഴെല്ലാം ഈ ചാർട്ടുകൾ റീ-റെൻഡർ ചെയ്യുന്നത് കമ്പ്യൂട്ടേഷണലായി ചെലവേറിയതാകാം.
ഇത് ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന്, ചാർട്ട് ഡാറ്റ മെമ്മോയിസ് ചെയ്യാൻ നിങ്ങൾക്ക് useMemo
ഉപയോഗിക്കാം, മെമ്മോയിസ് ചെയ്ത ഡാറ്റ മാറുമ്പോൾ മാത്രം ചാർട്ടുകൾ റീ-റെൻഡർ ചെയ്യുക. ഇത് റീ-റെൻഡറുകളുടെ എണ്ണം ഗണ്യമായി കുറയ്ക്കുകയും ഡാഷ്ബോർഡിൻ്റെ മൊത്തത്തിലുള്ള പ്രകടനം മെച്ചപ്പെടുത്തുകയും ചെയ്യും.
മികച്ച രീതികൾ (Best Practices)
റിയാക്ട് റീ-റെൻഡറുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുമ്പോൾ മനസ്സിൽ സൂക്ഷിക്കേണ്ട ചില മികച്ച രീതികൾ ഇതാ:
- നിങ്ങളുടെ ആപ്ലിക്കേഷൻ പ്രൊഫൈൽ ചെയ്യുക: പ്രകടന പ്രശ്നങ്ങൾക്ക് കാരണമാകുന്ന കമ്പോണൻ്റുകൾ കണ്ടെത്താൻ റിയാക്ട് പ്രൊഫൈലറോ "Why Did You Render?"-ഓ ഉപയോഗിക്കുക.
- എളുപ്പമുള്ളവയിൽ നിന്ന് ആരംഭിക്കുക: ഏറ്റവും കൂടുതൽ തവണ റീ-റെൻഡർ ചെയ്യുന്നതോ അല്ലെങ്കിൽ റെൻഡർ ചെയ്യാൻ ഏറ്റവും കൂടുതൽ സമയമെടുക്കുന്നതോ ആയ കമ്പോണൻ്റുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കുക.
- മെമ്മോയിസേഷൻ വിവേകത്തോടെ ഉപയോഗിക്കുക: എല്ലാ കമ്പോണൻ്റുകളും മെമ്മോയിസ് ചെയ്യരുത്, കാരണം മെമ്മോയിസേഷന് തന്നെ ഒരു ചിലവുണ്ട്. യഥാർത്ഥത്തിൽ പ്രകടന പ്രശ്നങ്ങൾക്ക് കാരണമാകുന്ന കമ്പോണൻ്റുകൾ മാത്രം മെമ്മോയിസ് ചെയ്യുക.
- ഇമ്മ്യൂട്ടബിലിറ്റി ഉപയോഗിക്കുക: പ്രോപ്സുകളിലെയും സ്റ്റേറ്റിലെയും മാറ്റങ്ങൾ കണ്ടെത്തുന്നത് റിയാക്ടിന് എളുപ്പമാക്കാൻ ഇമ്മ്യൂട്ടബിൾ ഡാറ്റാ സ്ട്രക്ച്ചറുകൾ ഉപയോഗിക്കുക.
- കമ്പോണൻ്റുകൾ ചെറുതും ശ്രദ്ധ കേന്ദ്രീകരിച്ചതുമായി സൂക്ഷിക്കുക: ചെറുതും കൂടുതൽ ശ്രദ്ധ കേന്ദ്രീകരിച്ചതുമായ കമ്പോണൻ്റുകൾ ഒപ്റ്റിമൈസ് ചെയ്യാനും പരിപാലിക്കാനും എളുപ്പമാണ്.
- നിങ്ങളുടെ ഒപ്റ്റിമൈസേഷനുകൾ പരീക്ഷിക്കുക: ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കുകൾ പ്രയോഗിച്ച ശേഷം, ഒപ്റ്റിമൈസേഷനുകൾക്ക് ആഗ്രഹിച്ച ഫലം ഉണ്ടെന്നും പുതിയ ബഗുകളൊന്നും ഉണ്ടാക്കിയിട്ടില്ലെന്നും ഉറപ്പാക്കാൻ നിങ്ങളുടെ ആപ്ലിക്കേഷൻ സമഗ്രമായി പരീക്ഷിക്കുക.
ഉപസംഹാരം
റിയാക്ട് ആപ്ലിക്കേഷനുകളുടെ പ്രകടനം ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന് അനാവശ്യമായ റീ-റെൻഡറുകൾ തടയുന്നത് നിർണായകമാണ്. റിയാക്ടിൻ്റെ റെൻഡറിംഗ് പ്രക്രിയ എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് മനസ്സിലാക്കുകയും ഈ ഗൈഡിൽ വിവരിച്ച ടെക്നിക്കുകൾ ഉപയോഗിക്കുകയും ചെയ്യുന്നതിലൂടെ, നിങ്ങളുടെ ആപ്ലിക്കേഷനുകളുടെ പ്രതികരണശേഷിയും കാര്യക്ഷമതയും ഗണ്യമായി മെച്ചപ്പെടുത്താനും ലോകമെമ്പാടുമുള്ള ഉപയോക്താക്കൾക്ക് മികച്ച ഉപയോക്തൃ അനുഭവം നൽകാനും കഴിയും. നിങ്ങളുടെ ആപ്ലിക്കേഷൻ പ്രൊഫൈൽ ചെയ്യാനും, പ്രകടന പ്രശ്നങ്ങൾക്ക് കാരണമാകുന്ന കമ്പോണൻ്റുകൾ കണ്ടെത്താനും, ആ പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ഉചിതമായ ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കുകൾ പ്രയോഗിക്കാനും ഓർമ്മിക്കുക. ഈ മികച്ച രീതികൾ പിന്തുടരുന്നതിലൂടെ, നിങ്ങളുടെ കോഡ്ബേസിൻ്റെ സങ്കീർണ്ണതയോ വലുപ്പമോ പരിഗണിക്കാതെ തന്നെ നിങ്ങളുടെ റിയാക്ട് ആപ്ലിക്കേഷനുകൾ വേഗതയേറിയതും കാര്യക്ഷമവും സ്കെയിലബിളും ആണെന്ന് നിങ്ങൾക്ക് ഉറപ്പാക്കാം.