வெண்ணெய் போன்ற மென்மையான ஸ்க்ரோலிங்கைத் திறக்கவும். Virtualization, content-visibility மற்றும் பலவற்றைக் கொண்டு CSS Scroll Snap செயல்திறன் மேம்படுத்தல் பற்றி அறிக.
CSS Scroll Snap செயல்திறன்: Snap Point கணக்கீட்டு மேம்படுத்தலில் ஒரு ஆழமான பார்வை
நவீன இணைய மேம்பாட்டின் உலகில், பயனர்களின் எதிர்பார்ப்புகள் முன்னெப்போதையும் விட அதிகமாக உள்ளன. பயனர்கள் தங்கள் உலாவிகளில் நேரடியாக, தடையற்ற, உள்ளுணர்வுடன் கூடிய, மற்றும் செயலியைப் போன்ற அனுபவங்களை விரும்புகிறார்கள். CSS Scroll Snap ஒரு புரட்சிகரமான W3C தரநிலையாக உருவெடுத்துள்ளது, இது டெவலப்பர்களுக்கு ஜாவாஸ்கிரிப்ட்-அதிகமுள்ள லைப்ரரிகளின் சிக்கல்கள் இல்லாமல், பட கேரசல்கள், தயாரிப்பு கேலரிகள், மற்றும் முழுத்திரை செங்குத்துப் பிரிவுகள் போன்ற விரும்பத்தக்க, ஸ்வைப் செய்யக்கூடிய இடைமுகங்களை உருவாக்க ஒரு சக்திவாய்ந்த, அறிவிப்பு முறையை வழங்குகிறது.
இருப்பினும், பெரும் சக்தி பெரும் பொறுப்புடன் வருகிறது. அடிப்படை ஸ்க்ரோல் ஸ்னாப்பிங்கை செயல்படுத்துவது மிகவும் எளிமையானது என்றாலும், அதை விரிவுபடுத்தும்போது ஒரு மறைக்கப்பட்ட செயல்திறன் அரக்கனை வெளிப்படுத்தலாம். ஒரு ஸ்க்ரோல் கண்டெய்னர் நூற்றுக்கணக்கான, அல்லது ஆயிரக்கணக்கான ஸ்னாப் புள்ளிகளைக் கொண்டிருக்கும்போது, பயனரின் மென்மையான ஸ்க்ரோலிங் அனுபவம் ஒரு தடுமாற்றமான, பதிலளிக்காத கனவாக மாறக்கூடும். இதற்குக் காரணம், பெரும்பாலும் கவனிக்கப்படாத மற்றும் கணக்கீட்டு ரீதியாக செலவுமிக்க ஸ்னாப் புள்ளி கணக்கீடு (snap point calculation) செயல்முறையாகும்.
இந்த விரிவான வழிகாட்டி, ஸ்க்ரோல் ஸ்னாப்பின் "hello world" கட்டத்தைத் தாண்டி, அதன் நிஜ உலக செயல்திறன் சவால்களை எதிர்கொள்ளும் டெவலப்பர்களுக்கானது. உலாவியின் இயக்கவியலுக்குள் ஆழமாகச் சென்று, ஸ்னாப் புள்ளி கணக்கீடு ஏன் மற்றும் எப்படி ஒரு தடையாக மாறுகிறது என்பதை நாம் கண்டறிவோம். மிக முக்கியமாக, நவீன `content-visibility` பண்பிலிருந்து மெய்நிகராக்கத்தின் (virtualization) வலுவான முறை வரை, மேம்பட்ட உகப்பாக்க உத்திகளை ஆராய்வோம். இதன் மூலம் உலகளாவிய பார்வையாளர்களுக்காக அதிக செயல்திறன் கொண்ட, பெரிய அளவிலான ஸ்க்ரோல் செய்யக்கூடிய இடைமுகங்களை உருவாக்க உங்களுக்கு அதிகாரம் அளிப்போம்.
ஒரு விரைவு மீள்பார்வை: CSS Scroll Snap-இன் அடிப்படைகள்
செயல்திறன் சிக்கல்களைப் பற்றி ஆராய்வதற்கு முன், CSS Scroll Snap-இன் முக்கிய பண்புகளைப் பற்றிய ஒரு சுருக்கமான மதிப்பாய்வுடன் நாம் அனைவரும் ஒரே பக்கத்தில் இருப்பதை உறுதி செய்வோம். இந்த மாட்யூல் ஒரு ஸ்க்ரோல் கண்டெய்னருக்கும் (scroller) அதன் குழந்தை உறுப்புகளுக்கும் (snap items) இடையே ஒரு உறவை வரையறுப்பதன் மூலம் செயல்படுகிறது.
- கண்டெய்னர் (The Container): ஸ்க்ரோல் செய்யும் பெற்றோர் உறுப்பு. `scroll-snap-type` பண்பைப் பயன்படுத்தி நீங்கள் அதில் ஸ்க்ரோல் ஸ்னாப்பிங்கை இயக்குகிறீர்கள்.
- உருப்படிகள் (The Items): நீங்கள் ஸ்னாப் செய்ய விரும்பும் கண்டெய்னரின் நேரடி குழந்தைகள். வியூபோர்ட்டுக்குள் அவற்றின் சீரமைப்பை `scroll-snap-align` பண்பைப் பயன்படுத்தி வரையறுக்கிறீர்கள்.
முக்கிய கண்டெய்னர் பண்புகள்
scroll-snap-type: இதுதான் மாஸ்டர் சுவிட்ச். இது ஸ்க்ரோலிங் அச்சையும் (`x`, `y`, `block`, `inline`, அல்லது `both`) மற்றும் ஸ்னாப்பின் கடுமையையும் (`mandatory` அல்லது `proximity`) வரையறுக்கிறது. உதாரணமாக,scroll-snap-type: x mandatory;ஒரு கிடைமட்ட ஸ்க்ரோலரை உருவாக்குகிறது, இது பயனர் ஸ்க்ரோலிங்கை நிறுத்தும்போது எப்போதும் ஒரு ஸ்னாப் புள்ளியில் நிற்கும்.scroll-padding: இதை ஸ்க்ரோல் கண்டெய்னரின் வியூபோர்ட்டுக்குள் (அல்லது "ஸ்க்ரோல்போர்ட்") உள்ள பேடிங் என்று நினைத்துப் பாருங்கள். இது ஒரு உள்வெளியை உருவாக்குகிறது, மேலும் ஸ்னாப் உருப்படிகள் கண்டெய்னரின் விளிம்பிற்குப் பதிலாக இந்த புதிய, பேட் செய்யப்பட்ட எல்லைக்கு சீரமைக்கப்படும். நிலையான தலைப்புகள் அல்லது பிற UI கூறுகளைத் தவிர்க்க இது நம்பமுடியாத அளவிற்கு பயனுள்ளதாக இருக்கும்.
முக்கிய உருப்படி பண்புகள்
scroll-snap-align: இந்த பண்பு, கண்டெய்னரின் ஸ்க்ரோல்போர்ட்டுடன் உருப்படி எவ்வாறு சீரமைக்கப்பட வேண்டும் என்பதை உலாவிக்குச் சொல்கிறது. பொதுவான மதிப்புகள் `start`, `center`, மற்றும் `end` ஆகும். `scroll-snap-align: center;` கொண்ட ஒரு உருப்படி, ஸ்னாப் செய்யப்படும்போது தன்னை ஸ்க்ரோல்போர்ட்டுக்குள் மையப்படுத்த முயற்சிக்கும்.scroll-margin: இது `scroll-padding`-இன் எதிர்நிலையாகும். இது ஸ்னாப் உருப்படியைச் சுற்றி ஒரு மார்ஜின் போல செயல்படுகிறது, ஸ்னாப் கணக்கீட்டிற்குப் பயன்படுத்தப்படும் ஒரு வெளிப்புற எல்லையை வரையறுக்கிறது. இது ஒரு பாரம்பரிய `margin`-ஐ கொண்டு அதன் லேஅவுட்டைப் பாதிக்காமல், ஸ்னாப் செய்யப்பட்ட உறுப்பைச் சுற்றி இடத்தை உருவாக்க உங்களை அனுமதிக்கிறது.scroll-snap-stop: `always` மதிப்புடன் கூடிய இந்த பண்பு, ஒரு வேகமான ஸ்வைப் சைகையின் போதும், ஒவ்வொரு ஸ்னாப் புள்ளியிலும் உலாவியை நிறுத்தும்படி கட்டாயப்படுத்துகிறது. இயல்புநிலை நடத்தை (`normal`) பயனர் வேகமாக ஸ்க்ரோல் செய்தால், ஸ்னாப் புள்ளிகளைத் தவிர்த்துச் செல்ல உலாவியை அனுமதிக்கிறது.
இந்தப் பண்புகளுடன், ஒரு எளிய, செயல்திறன் மிக்க கேரசலை உருவாக்குவது எளிதானது. ஆனால் அந்த கேரசலில் 5 உருப்படிகளுக்குப் பதிலாக 5,000 உருப்படிகள் இருந்தால் என்ன ஆகும்?
செயல்திறன் சரிவு: உலாவிகள் ஸ்னாப் புள்ளிகளை எவ்வாறு கணக்கிடுகின்றன
செயல்திறன் சிக்கலைப் புரிந்துகொள்ள, ஒரு உலாவி ஒரு வலைப்பக்கத்தை எவ்வாறு ரெண்டர் செய்கிறது மற்றும் இந்தச் செயல்பாட்டில் ஸ்க்ரோல் ஸ்னாப் எங்கு பொருந்துகிறது என்பதை நாம் முதலில் புரிந்து கொள்ள வேண்டும். உலாவியின் ரெண்டரிங் பைப்லைன் பொதுவாக இந்த படிகளைப் பின்பற்றுகிறது: ஸ்டைல் → லேஅவுட் → பெயிண்ட் → கம்போசிட்.
- ஸ்டைல் (Style): உலாவி ஒவ்வொரு உறுப்புக்கும் இறுதி CSS ஸ்டைல்களைக் கணக்கிடுகிறது.
- லேஅவுட் (Layout or Reflow): உலாவி ஒவ்வொரு உறுப்பின் வடிவவியலையும் கணக்கிடுகிறது - அதன் அளவு மற்றும் பக்கத்தில் அதன் நிலை. இது ஒரு முக்கியமான மற்றும் பெரும்பாலும் செலவுமிக்க படியாகும்.
- பெயிண்ட் (Paint): உலாவி ஒவ்வொரு உறுப்புக்கும் பிக்சல்களை நிரப்புகிறது, உரை, நிறங்கள், படங்கள் மற்றும் எல்லைகள் போன்றவற்றை வரைகிறது.
- கம்போசிட் (Composite): உலாவி பல்வேறு லேயர்களை சரியான வரிசையில் திரையில் வரைகிறது.
நீங்கள் ஒரு ஸ்க்ரோல் ஸ்னாப் கண்டெய்னரை வரையறுக்கும்போது, நீங்கள் உலாவிக்கு ஒரு புதிய அறிவுறுத்தல்களை வழங்குகிறீர்கள். ஸ்னாப்பிங் நடத்தையைச் செயல்படுத்த, உலாவி ஸ்க்ரோல் கண்டெய்னருக்குள் உள்ள ஒவ்வொரு சாத்தியமான ஸ்னாப் புள்ளியின் சரியான நிலையை அறிந்திருக்க வேண்டும். இந்தக் கணக்கீடு லேஅவுட் கட்டத்துடன் உள்ளார்ந்த रूपமாக இணைக்கப்பட்டுள்ளது.
கணக்கீடு மற்றும் மறுகணக்கீட்டின் அதிக செலவு
செயல்திறன் தடை இரண்டு முக்கிய சூழ்நிலைகளிலிருந்து எழுகிறது:
1. ஏற்றும்போது ஆரம்ப கணக்கீடு: பக்கம் முதலில் ஏற்றப்படும்போது, உலாவி உங்கள் ஸ்க்ரோல் கண்டெய்னருக்குள் உள்ள DOM-ஐ கடந்து, `scroll-snap-align` பண்பு கொண்ட ஒவ்வொரு உறுப்பையும் கண்டறிந்து, அதன் துல்லியமான வடிவியல் நிலையை (கண்டெய்னரின் தொடக்கத்திலிருந்து அதன் ஆஃப்செட்) கணக்கிட வேண்டும். உங்களிடம் 5,000 பட்டியல் உருப்படிகள் இருந்தால், பயனர் மென்மையாக ஸ்க்ரோல் செய்யத் தொடங்குவதற்கு முன்பே உலாவி 5,000 கணக்கீடுகளைச் செய்ய வேண்டும். இது Time to Interactive (TTI)-ஐ கணிசமாக அதிகரிக்கலாம் மற்றும் குறிப்பாக குறைந்த CPU வளங்களைக் கொண்ட சாதனங்களில் ஒரு மந்தமான ஆரம்ப அனுபவத்திற்கு வழிவகுக்கும்.
2. செலவுமிக்க மறுகணக்கீடுகள் (லேஅவுட் த்ராஷிங்): ஆரம்ப ஏற்றத்திற்குப் பிறகு உலாவி முடித்துவிடவில்லை. ஏதேனும் ஒன்று அவற்றின் இருப்பிடத்தை மாற்றியிருக்கலாம் என்று நினைக்கும்போதெல்லாம் அது அனைத்து ஸ்னாப் புள்ளி நிலைகளையும் மறுகணக்கீடு செய்ய வேண்டும். இந்த மறுகணக்கீடு பல நிகழ்வுகளால் தூண்டப்படுகிறது:
- சாளர மறுஅளவிடுதல் (Window Resize): மிகவும் வெளிப்படையான தூண்டுதல். சாளரத்தை மறுஅளவிடுவதால் கண்டெய்னரின் பரிமாணங்கள் மாறுகின்றன, இது ஒவ்வொரு ஸ்னாப் புள்ளியையும் மாற்றக்கூடும்.
- DOM மாற்றங்கள் (DOM Mutations): டைனமிக் பயன்பாடுகளில் மிகவும் பொதுவான குற்றவாளி. ஸ்க்ரோல் கண்டெய்னருக்குள் உருப்படிகளைச் சேர்ப்பது, அகற்றுவது அல்லது மறுவரிசைப்படுத்துவது ஒரு முழுமையான மறுகணக்கீட்டைக் கட்டாயப்படுத்துகிறது. முடிவில்லாத ஸ்க்ரோல் ஃபீடில், ஒரு புதிய தொகுதி உருப்படிகளைச் சேர்ப்பது, உலாவி புதிய மற்றும் ஏற்கனவே உள்ள ஸ்னாப் புள்ளிகளைச் செயலாக்கும்போது ஒரு குறிப்பிடத்தக்க தடுமாற்றத்தைத் தூண்டலாம்.
- CSS மாற்றங்கள் (CSS Changes): கண்டெய்னர் அல்லது அதன் உருப்படிகளில் லேஅவுட்டைப் பாதிக்கும் எந்த CSS பண்பையும் மாற்றுவது - அதாவது `width`, `height`, `margin`, `padding`, `border`, அல்லது `font-size` - முந்தைய லேஅவுட்டை செல்லாததாக்கி, ஒரு மறுகணக்கீட்டைக் கட்டாயப்படுத்தலாம்.
இந்த கட்டாய, ஒத்திசைவான லேஅவுட் மறுகணக்கீடு லேஅவுட் த்ராஷிங் (Layout Thrashing)-இன் ஒரு வடிவமாகும். பயனர் உள்ளீட்டைக் கையாளுவதற்குப் பொறுப்பான உலாவியின் பிரதான த்ரெட், உறுப்புகளை அளவிடுவதில் பிஸியாக இருக்கும்போது தடுக்கப்படுகிறது. பயனரின் பார்வையில், இது ஜாங்க் (jank) ஆக வெளிப்படுகிறது: கைவிடப்பட்ட பிரேம்கள், தடுமாறும் அனிமேஷன்கள், மற்றும் பதிலளிக்காத இடைமுகம்.
செயல்திறன் தடைகளைக் கண்டறிதல்: உங்கள் கண்டறியும் கருவித்தொகுப்பு
ஒரு சிக்கலைச் சரிசெய்வதற்கு முன், நீங்கள் அதை அளவிட வேண்டும். அதிர்ஷ்டவசமாக, நவீன உலாவிகள் சக்திவாய்ந்த கண்டறியும் கருவிகளுடன் வருகின்றன.
Chrome DevTools செயல்திறன் தாவலைப் பயன்படுத்துதல்
செயல்திறன் தாவல், ரெண்டரிங் மற்றும் CPU சிக்கல்களைக் கண்டறிவதில் உங்கள் சிறந்த நண்பன். ஸ்க்ரோல் ஸ்னாப் செயல்திறனை ஆய்வு செய்வதற்கான ஒரு பொதுவான பணிப்பாய்வு இதோ:
- உங்கள் சோதனை வழக்கைத் தயாரிக்கவும்: மிக அதிக எண்ணிக்கையிலான உருப்படிகளைக் கொண்ட (எ.கா., 2,000+) ஒரு ஸ்க்ரோல் ஸ்னாப் கண்டெய்னருடன் ஒரு பக்கத்தை உருவாக்கவும்.
- DevTools-ஐ திறந்து செயல்திறன் தாவலுக்குச் செல்லவும்.
- பதிவு செய்யத் தொடங்குங்கள்: பதிவு பொத்தானைக் கிளிக் செய்யவும்.
- செயலைச் செய்யவும்: கண்டெய்னர் வழியாக வேகமாக ஸ்க்ரோல் செய்யவும். இது ஒரு டைனமிக் பட்டியலாக இருந்தால், புதிய உருப்படிகளைச் சேர்க்கும் செயலைத் தூண்டவும்.
- பதிவு செய்வதை நிறுத்தவும்.
இப்போது, காலவரிசையை பகுப்பாய்வு செய்யுங்கள். "Main" த்ரெட் பார்வையில் நீண்ட, திட-வண்ணப் பட்டிகளைத் தேடுங்கள். நீங்கள் குறிப்பாகத் தேட வேண்டியவை:
- நீண்ட "Layout" நிகழ்வுகள் (ஊதா): இவை நமது பிரச்சனையின் மிக நேரடியான குறிகாட்டிகளாகும். உருப்படிகளைச் சேர்த்த பிறகு அல்லது ஒரு ஸ்க்ரோலின் போது ஒரு பெரிய ஊதா நிறப் பகுதியைக் கண்டால், உலாவி பக்கத்தின் வடிவவியலை மறுகணக்கீடு செய்ய கணிசமான நேரத்தைச் செலவிடுகிறது என்று அர்த்தம். இந்த நிகழ்வின் மீது கிளிக் செய்தால், "Summary" தாவலில் ஆயிரக்கணக்கான கூறுகள் பாதிக்கப்பட்டிருப்பதை நீங்கள் அடிக்கடி காணலாம்.
- நீண்ட "Recalculate Style" நிகழ்வுகள் (ஊதா): இவை பெரும்பாலும் ஒரு Layout நிகழ்வுக்கு முன்னதாக நிகழ்கின்றன. லேஅவுட்டை விட குறைவான செலவு என்றாலும், அவை பிரதான த்ரெட்டின் பணிச்சுமைக்கு பங்களிக்கின்றன.
- மேல்-வலது மூலையில் உள்ள சிவப்பு கொடிகள்: DevTools பெரும்பாலும் "Forced reflow" அல்லது "Layout thrashing" ஐ ஒரு சிறிய சிவப்பு முக்கோணத்துடன் கொடியிடும், இந்த செயல்திறன் எதிர்ப்பு முறையைப் பற்றி உங்களை வெளிப்படையாக எச்சரிக்கிறது.
இந்தக் கருவியைப் பயன்படுத்துவதன் மூலம், உங்கள் ஸ்க்ரோல் ஸ்னாப் செயலாக்கம் செயல்திறன் சிக்கல்களை ஏற்படுத்துகிறது என்பதற்கு உறுதியான ஆதாரத்தைப் பெறலாம், "இது கொஞ்சம் மெதுவாக இருக்கிறது" என்ற தெளிவற்ற உணர்விலிருந்து தரவு சார்ந்த நோயறிதலுக்குச் செல்லலாம்.
மேம்படுத்தல் உத்தி 1: மெய்நிகராக்கம் (Virtualization) - கடினமான தீர்வு
முடிவில்லாமல் ஸ்க்ரோல் செய்யும் சமூக ஊடக ஃபீட் அல்லது ஒரு பெரிய தயாரிப்பு κατάλογு போன்ற ஆயிரக்கணக்கான சாத்தியமான ஸ்னாப் புள்ளிகளைக் கொண்ட பயன்பாடுகளுக்கு, மிகவும் பயனுள்ள மேம்படுத்தல் உத்தி மெய்நிகராக்கம் (virtualization) (விண்டோயிங் என்றும் அழைக்கப்படுகிறது) ஆகும்.
முக்கிய கருத்து
மெய்நிகராக்கத்தின் பின்னணியில் உள்ள கொள்கை எளிமையானது ஆனால் சக்தி வாய்ந்தது: தற்போது வியூபோர்ட்டில் தெரியும் (அல்லது gần தெரியக்கூடிய) DOM கூறுகளை மட்டுமே ரெண்டர் செய்யுங்கள்.
DOM-இல் 5,000 `
பயனர் ஸ்க்ரோல் செய்யும்போது, எந்த உருப்படிகள் இப்போது தெரிய வேண்டும் என்பதைக் கணக்கிட ஒரு சிறிய அளவு ஜாவாஸ்கிரிப்ட் இயங்குகிறது. பின்னர் அது தற்போதுள்ள 10-20 DOM முனைகளின் தொகுப்பை மீண்டும் பயன்படுத்துகிறது, பார்வைக்கு வெளியே ஸ்க்ரோல் செய்யப்பட்ட உருப்படிகளின் தரவை நீக்குகிறது, மற்றும் பார்வைக்குள் வரும் புதிய உருப்படிகளின் தரவுகளுடன் அவற்றை நிரப்புகிறது.
ஸ்க்ரோல் ஸ்னாப்பில் மெய்நிகராக்கத்தைப் பயன்படுத்துதல்
இது ஒரு சவாலை முன்வைக்கிறது. CSS Scroll Snap என்பது அறிவிப்பு சார்ந்தது மற்றும் அதன் நிலைகளைக் கணக்கிட உண்மையான DOM கூறுகள் இருக்க வேண்டும் என்பதை நம்பியுள்ளது. கூறுகள் இல்லை என்றால், உலாவி அவற்றுக்கு ஸ்னாப் புள்ளிகளை உருவாக்க முடியாது.
இதற்கு ஒரு கலப்பின அணுகுமுறை தீர்வாகும். உங்கள் ஸ்க்ரோல் கண்டெய்னருக்குள் குறைந்த எண்ணிக்கையிலான உண்மையான DOM கூறுகளை நீங்கள் பராமரிக்கிறீர்கள். இந்தக் கூறுகளுக்கு `scroll-snap-align` பண்பு இருக்கும், அவை சரியாக ஸ்னாப் செய்யும். ஜாவாஸ்கிரிப்ட் மூலம் கையாளப்படும் மெய்நிகராக்க தர்க்கம், பயனர் பெரிய, மெய்நிகர் தரவுத்தொகுப்பின் வழியாக ஸ்க்ரோல் செய்யும்போது இந்த சில DOM முனைகளின் உள்ளடக்கத்தை மாற்றுவதற்குப் பொறுப்பாகும்.
மெய்நிகராக்கத்தின் நன்மைகள்:
- மிகப்பெரிய செயல்திறன் ஆதாயம்: உங்கள் தரவுத்தொகுப்பில் 1,000 அல்லது 1,000,000 உருப்படிகள் இருந்தாலும், உலாவி ஒரு சில கூறுகளுக்கு மட்டுமே லேஅவுட் மற்றும் ஸ்னாப் புள்ளிகளைக் கணக்கிட வேண்டும். இது ஆரம்ப கணக்கீடு செலவு மற்றும் ஸ்க்ரோலிங்கின் போது மறுகணக்கீடு செலவை கிட்டத்தட்ட நீக்குகிறது.
- குறைக்கப்பட்ட நினைவகப் பயன்பாடு: குறைவான DOM முனைகள் என்றால் உலாவியால் குறைந்த நினைவகம் பயன்படுத்தப்படுகிறது, இது குறைந்த-நிலை மொபைல் சாதனங்களில் செயல்திறனுக்கு முக்கியமானது.
குறைபாடுகள் மற்றும் பரிசீலனைகள்:
- அதிகரித்த சிக்கலான தன்மை: நீங்கள் தூய CSS-இன் எளிமையை ஜாவாஸ்கிரிப்ட்-இயக்கப்படும் ஒரு தீர்வின் சிக்கலான தன்மைக்காக வர்த்தகம் செய்கிறீர்கள். இப்போது நீங்கள் நிலையை நிர்வகித்தல், தெரியும் உருப்படிகளைக் கணக்கிடுதல் மற்றும் DOM-ஐ திறமையாகப் புதுப்பித்தல் ஆகியவற்றிற்குப் பொறுப்பாகிறீர்கள்.
- அணுகல்தன்மை (Accessibility): அணுகல்தன்மை கண்ணோட்டத்தில் மெய்நிகராக்கத்தைச் சரியாகச் செயல்படுத்துவது எளிதல்ல. நீங்கள் ஃபோகஸை நிர்வகிக்க வேண்டும், ஸ்கிரீன் ரீடர்கள் உள்ளடக்கத்தை வழிநடத்த முடியும் என்பதை உறுதிப்படுத்த வேண்டும், மற்றும் சரியான ARIA பண்புகளைப் பராமரிக்க வேண்டும்.
- பக்கத்தில் தேடுதல் (Ctrl/Cmd+F): தற்போது DOM-இல் ரெண்டர் செய்யப்படாத உள்ளடக்கத்திற்கு உலாவியின் இயல்புநிலை தேடல் செயல்பாடு வேலை செய்யாது.
பெரும்பாலான பெரிய அளவிலான பயன்பாடுகளுக்கு, செயல்திறன் நன்மைகள் சிக்கலான தன்மையை விட மிக அதிகமாக உள்ளன. இதை நீங்கள் புதிதாக உருவாக்க வேண்டியதில்லை. TanStack Virtual (முன்னர் React Virtual), `react-window`, மற்றும் `vue-virtual-scroller` போன்ற சிறந்த திறந்த மூல லைப்ரரிகள் மெய்நிகராக்கத்தைச் செயல்படுத்துவதற்கான வலுவான, உற்பத்திக்குத் தயாரான தீர்வுகளை வழங்குகின்றன.
மேம்படுத்தல் உத்தி 2: `content-visibility` பண்பு
முழுமையான மெய்நிகராக்கம் உங்கள் பயன்பாட்டுக்கு மிக அதிகமாகத் தோன்றினால், ஒரு நவீன, CSS-சொந்த அணுகுமுறை உள்ளது, இது ஒரு குறிப்பிடத்தக்க செயல்திறன் ஊக்கத்தை அளிக்கக்கூடும்: `content-visibility` பண்பு.
அது எப்படி வேலை செய்கிறது
`content-visibility` பண்பு உலாவியின் ரெண்டரிங் இயந்திரத்திற்கு ஒரு சக்திவாய்ந்த குறிப்பாகும். நீங்கள் ஒரு உறுப்பில் `content-visibility: auto;` என்று அமைக்கும்போது, நீங்கள் உலாவிக்குச் சொல்கிறீர்கள்:
"இந்த உறுப்பு தற்போது பயனருக்குப் பொருத்தமற்றது என்று நீங்கள் தீர்மானித்தால்—அதாவது, அது திரைக்கு வெளியே இருந்தால்—அதற்கான பெரும்பாலான ரெண்டரிங் வேலைகளை (லேஅவுட் மற்றும் பெயிண்ட் உட்பட) தவிர்ப்பதற்கு உங்களுக்கு என் அனுமதி உண்டு."
உறுப்பு வியூபோர்ட்டுக்குள் ஸ்க்ரோல் செய்யும்போது, உலாவி தானாகவே சரியான நேரத்தில் அதை ரெண்டர் செய்யத் தொடங்குகிறது. இந்த தேவைக்கேற்ற ரெண்டரிங், நீண்ட உருப்படிகளைக் கொண்ட ஒரு பக்கத்தின் ஆரம்ப ஏற்றுதல் நேரத்தை வியத்தகு முறையில் குறைக்க முடியும்.
`contain-intrinsic-size` துணை பண்பு
இதில் ஒரு சிக்கல் உள்ளது. உலாவி ஒரு உறுப்பின் உள்ளடக்கத்தை ரெண்டர் செய்யவில்லை என்றால், அதன் அளவு என்னவென்று அதற்குத் தெரியாது. இது பயனர் ஸ்க்ரோல் செய்யும்போது மற்றும் புதிய கூறுகள் ரெண்டர் செய்யப்படும்போது ஸ்க்ரோல்பார் குதித்து மறுஅளவிடப்பட காரணமாகும், இது ஒரு மோசமான பயனர் அனுபவத்தை உருவாக்கும். இதைத் தீர்க்க, நாம் `contain-intrinsic-size` பண்பைப் பயன்படுத்துகிறோம்.
contain-intrinsic-size: 300px 500px; (உயரம் மற்றும் அகலம்) ஆனது, உறுப்பு ரெண்டர் செய்யப்படுவதற்கு முன்பு அதற்கான ஒரு ப்ளேஸ்ஹோல்டர் அளவை வழங்குகிறது. உலாவி இந்த மதிப்பைப் பயன்படுத்தி ஸ்க்ரோல் கண்டெய்னர் மற்றும் அதன் ஸ்க்ரோல்பாரின் லேஅவுட்டைக் கணக்கிடுகிறது, இது எந்தவொரு தடுமாற்றமான குதிப்புகளையும் தடுக்கிறது.
ஸ்க்ரோல்-ஸ்னாப் உருப்படிகளின் பட்டியலுக்கு இதை எப்படிப் பயன்படுத்துவது என்பது இங்கே:
.scroll-snap-container {
scroll-snap-type: y mandatory;
height: 100vh;
overflow-y: scroll;
}
.snap-item {
scroll-snap-align: start;
/* The magic happens here */
content-visibility: auto;
contain-intrinsic-size: 100vh; /* Assuming full-height sections */
}
`content-visibility` மற்றும் Snap Point கணக்கீடு
இந்த நுட்பம் ஆரம்ப ரெண்டரிங் செலவுக்கு கணிசமாக உதவுகிறது. உலாவி ஆரம்ப லேஅவுட் பாஸை மிக வேகமாகச் செய்ய முடியும், ஏனெனில் அது திரைக்கு வெளியே உள்ள கூறுகளுக்கு அவற்றின் உள்ளடக்கங்களின் சிக்கலான லேஅவுட்டைக் கணக்கிடுவதற்குப் பதிலாக, ப்ளேஸ்ஹோல்டர் `contain-intrinsic-size`-ஐ மட்டுமே பயன்படுத்த வேண்டும். இதன் பொருள் ஒரு வேகமான Time to Interactive.
`content-visibility`-இன் நன்மைகள்:
- எளிமை: இது வெறும் இரண்டு வரிகள் CSS மட்டுமே. ஒரு முழு ஜாவாஸ்கிரிப்ட் மெய்நிகராக்க லைப்ரரியைச் செயல்படுத்துவதை விட இது மிகவும் எளிமையானது.
- முற்போக்கான மேம்பாடு (Progressive Enhancement): இதை ஆதரிக்காத உலாவிகள் வெறுமனே புறக்கணிக்கும், மற்றும் பக்கம் முன்பு போலவே செயல்படும்.
- DOM கட்டமைப்பைப் பாதுகாக்கிறது: அனைத்து உருப்படிகளும் DOM-இல் இருப்பதால், பக்கத்தில் தேடுதல் போன்ற இயல்புநிலை உலாவி அம்சங்கள் தொடர்ந்து செயல்படும்.
வரம்புகள்:
- ஒரு வெள்ளித் குண்டு அல்ல: இது ரெண்டரிங் வேலையை ஒத்திவைத்தாலும், உலாவி அனைத்து DOM முனைகளின் இருப்பையும் அங்கீகரிக்கிறது. பல்லாயிரக்கணக்கான உருப்படிகளைக் கொண்ட பட்டியல்களுக்கு, முனைகளின் எண்ணிக்கை மட்டுமே கணிசமான நினைவகம் மற்றும் ஸ்டைல் மற்றும் மரம் மேலாண்மைக்கு சில CPU-ஐ நுகர முடியும். இந்த தீவிர நிகழ்வுகளில், மெய்நிகராக்கம் மேலானது.
- துல்லியமான அளவு: `contain-intrinsic-size`-இன் செயல்திறன், நீங்கள் ஒரு நியாயமான துல்லியமான ப்ளேஸ்ஹோல்டர் அளவை வழங்குவதைப் பொறுத்தது. உங்கள் உருப்படிகள் மிகவும் மாறுபட்ட உள்ளடக்க உயரங்களைக் கொண்டிருந்தால், சில உள்ளடக்க மாற்றத்தை ஏற்படுத்தாத ஒரு ஒற்றை மதிப்பைத் தேர்ந்தெடுப்பது சவாலாக இருக்கலாம்.
- உலாவி ஆதரவு: நவீன Chromium-அடிப்படையிலான உலாவிகள் மற்றும் Firefox-இல் ஆதரவு நன்றாக இருந்தாலும், அது இன்னும் உலகளாவியதாக இல்லை. ஒரு முக்கியமான அம்சமாக அதை வரிசைப்படுத்துவதற்கு முன்பு எப்போதும் CanIUse.com போன்ற ஒரு மூலத்தைச் சரிபார்க்கவும்.
மேம்படுத்தல் உத்தி 3: ஜாவாஸ்கிரிப்ட்-Debounced DOM கையாளுதல்
இந்த உத்தி, ஸ்க்ரோல் கண்டெய்னரிலிருந்து உருப்படிகள் அடிக்கடி சேர்க்கப்படும் அல்லது அகற்றப்படும் டைனமிக் பயன்பாடுகளில் மறுகணக்கீட்டின் செயல்திறன் செலவைக் குறிவைக்கிறது.
பிரச்சனை: ஆயிரம் வெட்டுகளால் மரணம்
ஒரு WebSocket இணைப்பு வழியாக புதிய உருப்படிகள் வரும் ஒரு நேரடி ஃபீடை கற்பனை செய்து பாருங்கள். ஒரு எளிமையான செயலாக்கம் ஒவ்வொரு புதிய உருப்பையும் அது வந்தவுடன் DOM-இல் சேர்க்கலாம்:
// ANTI-PATTERN: This triggers a layout recalculation for every single item!
socket.on('newItem', (itemData) => {
const newItemElement = document.createElement('div');
newItemElement.className = 'snap-item';
newItemElement.textContent = itemData.text;
container.prepend(newItemElement);
});
பத்து உருப்படிகள் விரைவாக வந்தால், இந்தக் குறியீடு பத்து தனித்தனி DOM கையாளுதல்களைத் தூண்டுகிறது. ஒவ்வொரு `prepend()` செயல்பாடும் லேஅவுட்டை செல்லாததாக்குகிறது, இது கண்டெய்னரில் உள்ள அனைத்து ஸ்னாப் புள்ளிகளின் நிலைகளையும் மறுகணக்கீடு செய்ய உலாவியைக் கட்டாயப்படுத்துகிறது. இது லேஅவுட் த்ராஷிங்கின் ஒரு உன்னதமான காரணமாகும், மேலும் UI-ஐ மிகவும் தடுமாற்றமாக உணர வைக்கும்.
தீர்வு: உங்கள் புதுப்பிப்புகளைத் தொகுப்பாக்குங்கள்
இந்த புதுப்பிப்புகளை ஒரே செயல்பாட்டில் தொகுப்பதே முக்கியம். நேரடி DOM-ஐ பத்து முறை மாற்றுவதற்குப் பதிலாக, நீங்கள் ஒரு இன்-மெமரி `DocumentFragment`-இல் புதிய கூறுகளை உருவாக்கி, பின்னர் அந்த ஃபிராக்மென்ட்டை ஒரே நேரத்தில் DOM-இல் சேர்க்கலாம். இது ஒரே ஒரு லேஅவுட் மறுகணக்கீட்டிற்கு வழிவகுக்கிறது.
உலாவி அடுத்த பிரேமை பெயிண்ட் செய்வதற்கு சற்று முன்பு, நமது DOM கையாளுதல் மிகவும் உகந்த நேரத்தில் நடப்பதை உறுதிசெய்ய `requestAnimationFrame`-ஐப் பயன்படுத்தி இதை மேலும் மேம்படுத்தலாம்.
// GOOD PATTERN: Batching DOM updates
let itemBatch = [];
let updateScheduled = false;
socket.on('newItem', (itemData) => {
itemBatch.push(itemData);
if (!updateScheduled) {
updateScheduled = true;
requestAnimationFrame(updateDOM);
}
});
function updateDOM() {
const fragment = document.createDocumentFragment();
itemBatch.forEach(itemData => {
const newItemElement = document.createElement('div');
newItemElement.className = 'snap-item';
newItemElement.textContent = itemData.text;
fragment.appendChild(newItemElement);
});
container.prepend(fragment);
// Reset for the next batch
itemBatch = [];
updateScheduled = false;
}
இந்த debounced/batched அணுகுமுறை, செலவுமிக்க, தனிப்பட்ட புதுப்பிப்புகளின் தொடரை ஒரு ஒற்றை, திறமையான செயல்பாடாக மாற்றுகிறது, உங்கள் ஸ்க்ரோல் ஸ்னாப் இடைமுகத்தின் பதிலளிக்கும் தன்மையைப் பாதுகாக்கிறது.
உலகளாவிய பார்வையாளர்களுக்கான மேம்பட்ட பரிசீலனைகள் மற்றும் சிறந்த நடைமுறைகள்
செயல்திறனை மேம்படுத்துவது என்பது ஒரு உயர்நிலை டெவலப்பர் இயந்திரத்தில் விஷயங்களை வேகமாகச் செய்வது மட்டுமல்ல. இது அனைத்து பயனர்களுக்கும், அவர்களின் சாதனம், நெட்வொர்க் வேகம் அல்லது இருப்பிடத்தைப் பொருட்படுத்தாமல், ஒரு மென்மையான மற்றும் அணுகக்கூடிய அனுபவத்தை உறுதி செய்வதாகும். ஒரு செயல்திறன் மிக்க தளம் ஒரு உள்ளடக்கிய தளமாகும்.
மீடியாவை சோம்பேறித்தனமாக ஏற்றுதல் (Lazy Loading Media)
உங்கள் ஸ்னாப் உருப்படிகளில் படங்கள் அல்லது வீடியோக்கள் இருக்கலாம். நீங்கள் DOM முனைகளை மெய்நிகராக்கினாலும், 5,000-உருப்படி பட்டியலுக்கான அனைத்து மீடியா சொத்துக்களையும் ஆர்வத்துடன் ஏற்றுவது நெட்வொர்க் மற்றும் நினைவகப் பயன்பாட்டிற்கு பேரழிவாக இருக்கும். ஸ்க்ரோல் செயல்திறன் மேம்படுத்தல்களை எப்போதும் மீடியா சோம்பேறித்தனமான ஏற்றுதலுடன் இணைக்கவும். `` மற்றும் `
அணுகல்தன்மை பற்றிய ஒரு குறிப்பு
மெய்நிகராக்கம் போன்ற தனிப்பயன் தீர்வுகளைச் செயல்படுத்தும்போது, அணுகல்தன்மையை ஒருபோதும் மறக்க வேண்டாம். விசைப்பலகை பயனர்கள் உங்கள் பட்டியல் வழியாக செல்ல முடியும் என்பதை உறுதிப்படுத்தவும். உருப்படிகள் சேர்க்கப்படும்போது அல்லது அகற்றப்படும்போது ஃபோகஸை சரியாக நிர்வகிக்கவும். ஸ்கிரீன் ரீடர் பயனர்களுக்கு உங்கள் மெய்நிகராக்கப்பட்ட விட்ஜெட்டை விவரிக்க பொருத்தமான ARIA பாத்திரங்கள் மற்றும் பண்புகளைப் பயன்படுத்தவும்.
சரியான உத்தியைத் தேர்ந்தெடுத்தல்: ஒரு முடிவு வழிகாட்டி
நீங்கள் எந்த மேம்படுத்தலைப் பயன்படுத்த வேண்டும்? இதோ ஒரு எளிய வழிகாட்டி:
- சில டஜன் உருப்படிகளுக்கு (< 50-100): நிலையான CSS Scroll Snap சரியாக இருக்கலாம். முன்கூட்டியே மேம்படுத்த வேண்டாம்.
- சில நூறு உருப்படிகளுக்கு (100-500): `content-visibility: auto` உடன் தொடங்கவும். இது ஒரு குறைந்த-முயற்சி, உயர்-தாக்க தீர்வாகும், இது உங்களுக்குத் தேவையானதாக இருக்கலாம்.
- பல ஆயிரம் உருப்படிகளுக்கு (500+): ஒரு ஜாவாஸ்கிரிப்ட் மெய்நிகராக்க லைப்ரரி மிகவும் வலுவான மற்றும் அளவிடக்கூடிய தீர்வாகும். ஆரம்ப சிக்கலான தன்மை உத்தரவாதமான செயல்திறனுடன் பலனளிக்கிறது.
- அடிக்கடி சேர்க்கைகள்/நீக்கங்களைக் கொண்ட எந்தவொரு பட்டியலுக்கும்: பட்டியலின் அளவைப் பொருட்படுத்தாமல், எப்போதும் தொகுக்கப்பட்ட DOM புதுப்பிப்புகளைச் செயல்படுத்தவும்.
முடிவு: செயல்திறன் ஒரு முக்கிய அம்சமாக
CSS Scroll Snap நவீன, தொட்டுணரக்கூடிய வலை இடைமுகங்களை உருவாக்குவதற்கான ஒரு அற்புதமான அறிவிப்பு API-ஐ வழங்குகிறது. ஆனால் நாம் பார்த்தது போல், அதன் எளிமை, அளவில் மட்டுமே வெளிப்படும் செயல்திறன் செலவுகளை மறைக்கக்கூடும். ஸ்க்ரோல் ஸ்னாப்பில் தேர்ச்சி பெறுவதற்கான திறவுகோல், உலாவி ஒவ்வொரு ஸ்னாப் புள்ளியின் நிலையையும் கணக்கிட வேண்டும் என்பதைப் புரிந்துகொள்வதாகும், மேலும் இந்தக் கணக்கீட்டிற்கு ஒரு நிஜ உலக செலவு உள்ளது.
Performance Profiler போன்ற கருவிகளைக் கொண்டு தடைகளைக் கண்டறிந்து, சரியான மேம்படுத்தல் உத்தியைப் பயன்படுத்துவதன் மூலம்—அது `content-visibility`-இன் நவீன எளிமையாக இருந்தாலும் சரி, தொகுக்கப்பட்ட DOM புதுப்பிப்புகளின் அறுவை சிகிச்சை துல்லியமாக இருந்தாலும் சரி, அல்லது மெய்நிகராக்கத்தின் தொழில்துறை வலிமையாக இருந்தாலும் சரி—நீங்கள் இந்த சவால்களை வெல்ல முடியும். நீங்கள் உருவாக்கும் ஸ்க்ரோலிங் அனுபவங்கள் அழகானதாகவும் உள்ளுணர்வுடனும் மட்டுமல்லாமல், உலகில் எங்கிருந்தும், எந்தவொரு சாதனத்திலும், ஒவ்வொரு பயனருக்கும் நம்பமுடியாத அளவிற்கு வேகமாகவும் பதிலளிக்கக்கூடியதாகவும் இருக்கும். செயல்திறன் என்பது ஒரு அம்சம் மட்டுமல்ல; இது ஒரு தரமான பயனர் அனுபவத்தின் ஒரு அடிப்படைக் கூறு.