Next.js, Gatsby және статикалық сайттар үшін cookie келісімі: әзірлеушілерге арналған интеграция нұсқаулығы
Статикалық сайттардағы келісім мәселесі
Next.js, Gatsby және Nuxt.js сияқты заманауи JavaScript фреймворктары веб-беттерді құру және жеткізу тәсілін түбегейлі өзгертті. Беттер құру кезінде немесе серверде алдын ала рендерленеді, содан кейін клиентте гидратацияланады. Бұл cookie келісімі үшін ерекше қиындық туғызады: келісім баннері кез келген трекинг скрипттері орындалғанға дейін дайын болуы тиіс, бірақ беттің өзі қазірдің өзінде рендерленген және edge-де кэштеулі болуы мүмкін.
Дәстүрлі CMP-лер серверде рендерленетін PHP немесе құжаты жоғарыдан төменге дейін сызықтық жүктелетін қарапайым HTML беттер үшін жасалған. Code splitting, lazy loading және streaming server-side rendering қолданылатын фреймворктар әлемінде бұл болжамдар бұзылады. Мұндай ортада келісімді дұрыс ұйымдастыру үшін рендерлеу конвейерін түсіну қажет.
Уақыттың маңызы сіз ойлағаннан да жоғары
Кәдімгі HTML бетінде CMP скриптін басқа скрипттерден бұрын <head> бөлігіне қою оңай. Next.js App Router немесе Gatsby-де жағдай күрделірек:
- Алдын ала рендерленген HTML алдымен келеді: Браузер CDN немесе серверден толық HTML алады. Егер сол HTML ішінде inline скрипттер немесе үшінші тарап тегтері болса, олар сіздің келісім логикаңыз жүктелгенге дейін ор��ндалуы мүмкін.
- Гидратация аралығы: React гидратациясы HTML боялғаннан кейін орындалады. Егер сіздің келісім компонентіңіз React компоненті болса, ол гидратация аяқталғанға дейін функционалды күйде болмайды. Осы аралықта Google тегтері немесе аналитика скрипттері келісімсіз іске қосылуы мүмкін.
- Edge-кэштеу қиындығы: Егер сіз ISR (Incremental Static Regeneration) немесе edge-функцияларды қолдансаңыз, HTML кэштеулі болады. Клиенттік механизмсіз келісімге тәуелді логиканы кэштеулі HTML-ге динамикалық түрде енгізе алмайсыз.
Негізгі қағида мынадай: келісім компонент деңгейінде емес, скрипт деңгейінде орнатылуы тиіс. Келісім баннерін рендерлейтін React компоненті, егер ол тек гидратациядан кейін интерактивті болса, тым кеш болады.
Next.js App Router интеграциясы
App Router-і бар Next.js 13+ скрипттерді басқарудың жаңа тәсілін енгізді. Келісімді интеграциялаудың ұсынылатын тәсілі төмендегідей:
1-қадам: CMP скриптін түбірлік layout-қа жүктеу
Түбірлік layout.tsx ішінде beforeInteractive стратегиясымен Next.js Script компонентін қолданыңыз. Бұл Next.js-ке скриптті бастапқы HTML құжатына, гидратация басталғанға дейін енгізуді бұйырады:
beforeInteractive стратегиясы шешуші мәнге ие. Әдепкі afterInteractive стратегиясы скрипттерді гидратациядан кейін жүктейді, бұл келісім үшін тым кеш. beforeInteractive көмегімен CMP скрипті серверде рендерленген HTML-ге қосылады және бет жүктелген кезде орындалады.
2-қадам: Google тегтеріне дейін әдепкі келісім күйін орнату
Google Tag Manager немесе gtag.js үзіндісіне дейін әдепкі келісім күйлерін орнататын inline скрипт қосыңыз. Бұл GTM CMP баннері пайда болғанға дейін жүктелсе де, ол бас тарту бойынша әдепкі мәндерді сақтайтынын қамтамасыз етеді:
Бұл inline скрипт түбірлік layout-тың <head> бөлігіне, CMP және GTM скрипттерінен бұрын орналастырылуы тиіс. Next.js-те бұл үшін layout-тың <head> элементінің ішінде кәдімгі <script> тегін қолдана аласыз.
3-қадам: Маршруттардың ауысуын өңдеу
Single-page application навигациясында CMP скрипті бір рет жүктеледі, бірақ маршруттардың ауысуы толық бет қайта жүктелуін тудырмайды. Сіздің CMP клиенттік навигациялар арасында сақталуы тиіс. FlexyConsent мұны автоматты түрде орындайды — бір рет жүктелгеннен кейін ол барлық маршрут ауысуларында қайта инициализациясыз белсенді болып қалады.
Next.js Pages Router интеграциясы
Pages Router қолданатын жобалар үшін тәсіл ұқсас, бірақ түбірлік layout орнына _document.tsx қолданылады. CMP скриптін арнайы Document класының <Head> компонентіне орналастырыңыз. beforeInteractive стратегиясы Pages Router-де де дәл солай жұмыс істейді.
Негізгі айырмашылық — _document.tsx тек серверде рендерленеді, сондықтан мұндағы кез келген келісім логикасы бастапқы HTML жүктемесінде міндетті түрде болады.
Gatsby статикалық сайт интеграциясы
Gatsby құру кезінде толық статикалық HTML жасайды. Сұраныс кезінде серверлік рендерлеу жоқ, бұл кейбір аспектілерді жеңілдетеді, бірақ басқаларын қиындатады:
gatsby-ssr.tsxқолданыңыз, CMP скриптін әр беттегі<head>бө��ігіне енгізу үшін.onRenderBodyAPI-і әр статикалық HTML файлына түсетін head-ке скрипттер қосуға мүмкіндік береді.- Келісімді lazy-load жасайтын Gatsby плагиндерінен аулақ болыңыз: Кейбір қауымдастық плагиндері келісімді тек гидратациядан кейін mount болатын React компоненттеріне орайды. Бұл жоғарыда талқыланған уақытша алшақтықты тудырады.
- Келісімнің әдепкі мәндерін inline орналастырыңыз: Әдепкі келісім күйлерін орнататын inline скрипт қосу үшін
gatsby-ssr.tsxішіндегіsetHeadComponentsқолданыңыз. Бұл скрипт статикалық HTML ішінде болады және бірден орындалады.
Gatsby-дің құру уақытына негізделген тәсілі CDN-дегі әр HTML файлына келісім скрипті кіретінін білдіреді. Бұл шын мәнінде тамаша — істен шығатын немесе дұрыс кэштелмей��ін серверлік логика жоқ.
Nuxt.js ерекшеліктері
Nuxt.js (Vue-негізді) өз үлгілеріне ие. Nuxt 3-те CMP скриптін ғаламдық түрде қосу үшін useHead composable-ін немесе nuxt.config.ts ішіндегі app head конфигурациясын қолданыңыз. Nuxt body: false опциясын (скрипттерді head бөлігіне орналастырады) және блоктамайтын жүктеу үшін async атрибутын қолдайды.
Nuxt-тің серверлік рендерлеу режимі үшін де сол қағида қолданылады: CMP скрипті бастапқы HTML жауапта болуы тиіс, Vue компоненті mount болғаннан кейін динамикалық түрде енгізілмеуі керек.
Layout shift-ті болдырмау
Келісім баннерлері Cumulative Layout Shift (CLS) үшін жиі кінәлі, бұл SEO рейтингтеріне әсер ететін Core Web Vital. Баннер бет рендерленгеннен кейін пайда болғанда, ол контентті төмен итереді немесе күтпеген жерден үстіне шығады.
Келісім баннерлерінен CLS-ті азайту стратегиялары:
- Төменгі жағынд�� орналасқан баннер қолданыңыз: Көрініс аймағының төменгі жағындағы баннерлер бет контентін жылжытпайды. Бұл CLS үшін ең қолайлы тәсіл.
- Орынды алдын ала резервтеңіз: Егер жоғарғы баннер қолдану қажет болса, бет layout-ы баннерді рендерлеуге дейін ескеретіндей CSS арқылы тік кеңістікті резервтеңіз.
- Жүктеу кезінде модальды overlay-лерден аулақ болыңыз: Бет рендерленгеннен кейін пайда болатын толық экранды келісім қабырғалары layout-тың тұрақсыздығын тудырады. Егер қабырға қажет болса, оны бастапқы бет күйінің бір бөлігі ретінде рендерлеңіз.
- CMP-ні head ішінде синхронды түрде жүктеңіз: CMP head ішінде рендерлеуді блоктайтын скрипт ретінде жүктелгенде, баннер кейіннен «секіріп» шықпай, бастапқы бояудың бір бөлігі ретінде пайда бола алады.
FlexyConsent-тің фреймворктан тәуелсіз тәсілі
FlexyConsent кез келген фреймворкпен — тіпті фреймворксіз де — жұмыс істеу үшін компонент деңгейінде емес, скрипт деңгейінде жұмыс істейтіндей етіп жасалған. Бұл неге маңызды:
- Бір ғана async script тегі:
<head>ішінде бір<script>тегі жеткілікті. Орнататын npm-пакеттер жоқ, фреймворкке тән орағыштар жоқ, build-конфигурация қажет емес. - Келісімнің әдепкі мәндері бірден орындалады: Скрипт Consent Mode V2 әдепкі мәндерін кез келген callback немесе DOM-мен жұмысқа дейінгі алғашқы әрекет ретінде орнатады. Бұл Google тегтері келісімді алғашқы миллисекундтан бастап сақтайтынын білдіреді.
- DOM-ға тәуелділік жоқ: Келісім логикасы React, Vue немесе Svelte гидратациясын күтпейді. Ол фреймворк lifecycle-ынан тәуелсіз жұмыс істейді.
- SSG, SSR, ISR және CSR-пен жұмыс істейді: Ол кәдімгі скрипт болғандықтан, бет статикалық түрде генерацияланған ба, серверде р��ндерленген бе, инкременталды регенерацияланған ба немесе клиентте рендерленген бе — бәрібір, бірдей жұмыс істейді.
Әзірлеушіге кеңес: Дұрыс CMP интеграциясын тексерудің ең қарапайым тәсілі — браузердің Network қойындысын ашып, Google домендері бойынша сүзгіден өткізіп, бетті қайта жүктеу. Келісімнің әдепкі командасы консольде пайда болғанға дейін ешқандай Google сұранысы жіберілмеуі тиіс. Егер жіберілсе, CMP тым кеш жүктеліп жатыр.
FlexyConsent-тің тегін тарифі шексіз pageview-ді қолдайды және Next.js, Gatsby, Nuxt, Astro, SvelteKit, Remix және қарапайым HTML-пен жұмыс істейді. Интеграция олардың барлығында бірдей: дұрыс орналастырылған бір script тегі.