Skip to main content

Next.js SDK

Background#

Для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° экспСримСнтов ΠΈ Ρ„ΠΈΡ‡Π° Ρ„Π»Π°Π³ΠΎΠ² Π½Π° сторонС сСрвСра Π² своих прилоТСниях Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ сСрвСрынй sdk expf-sigma-node.js. Next.js ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π½Π° сторонС сСрвСра: getInitialProps ΠΈ getServerSideProps.
Если Π½Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡ‚ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π½Π° сторонС сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ клиСнтский sdk expf-sigma.js, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ экспСримСнтов ΠΈ Ρ„ΠΈΡ‡Π° Ρ„Π»Π°Π³ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠΎΠ½Π΅Π½Ρ‚Π°Ρ….

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ sdk c ssr, фукция getServerSideProps#

Установка SDK#

npm i expf-sigma-node.js

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SDK#

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈ экспортируйтС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ асинхроннуыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

/helpers/sigma.js
import Sigma from 'expf-sigma-node.js';
const token = <TOKEN>;
export const sigmaGetExperimentParam = async (expId, paramName, userProps = {}) => {  const userData = userProps;  const sigma = new Sigma(token, userData);
  const variant = await sigma.getExperiment(expId).then(    (res) => res.getParamValue(paramName)  );    if (variant) return variant;  return;}
export const sigmaGetAllUserExperiments = async (userProps = {}) => {  const userData = userProps;  const sigma = new Sigma(token, userData);
  const userSigmaExps = await sigma.getAllUserExperiments()
  if (userSigmaExps) return userSigmaExps;  return;}

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° с экспСримСнтом#

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ экпСримСнта ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

  • страница запускаСтся Π²ΠΎ врСмя запроса, ΠΈ эта страница Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ.
  • Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ
  • Π½Π° страницС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ скрипт для ΠΏΠ΅Ρ€Π΅Π΄Π΅Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² GA
  • для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Ρ‹Π΅ Π² GA, Π½Π° страницС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ скрипт "https://www.googletagmanager.com/gtag/js" ΠΈ Ρ…ΡƒΠΊ useEffect()
  • ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ getServerSideProps
/pages/InnerPage/index.js
import BannerName from '../../components/BannerName.js';import { sigmaGetExperimentParam, sigmaGetAllUserExperiments } from "../../helpers/sigma.js";import React from 'react';import Script from 'next/script'
export default function InnerPage({ isBannerNameExperiment, allExperiments }) {  React.useEffect( () => {    window.dataLayer = window.dataLayer || [];    function gtag() { dataLayer.push(arguments) };    gtag('event', 'get', {       event_category: 'check',       event_action: 'check',       dimension1: allExperiments });    console.log(window.dataLayer)  }, []);
  return (    <>      <Script         src='https://www.googletagmanager.com/gtag/js?id=UA-000000-1'         strategy='beforeInteractive'      />      <main>        {isBannerNameExperiment &&  <BannerName /> }      </main>    </>  )}
export const getServerSideProps = async ({ res, req }) => {  const userId = userCooKieId || req.userId; // ΠΊΡƒΠΊΠ° ΠΈΠ»ΠΈ любой id
  const isBannerNameExperiment = await sigmaGetExperimentParam(<expId>, <expParam>, { userId });  const allExperiments = await sigmaGetAllUserExperiments({ userId });
  return {    props: {      isBannerNameExperiment,      allExperiments,    },  }}

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ sdk c ssr, фукция getInitialProps#

Установка SDK#

npm i expf-sigma-node.js

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SDK#

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈ экспортируйтС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ асинхроннуыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

/helpers/sigma.js
import Sigma from 'expf-sigma-node.js';
const token = <TOKEN>;
export const sigmaGetExperimentParam = async (expId, paramName, userProps = {}) => {  const userData = userProps;  const sigma = new Sigma(token, userData);
  const variant = await sigma.getExperiment(expId).then(    (res) => res.getParamValue(paramName)  );    if (variant) return variant;  return;}
export const sigmaGetAllUserExperiments = async (userProps = {}) => {  const userData = userProps;  const sigma = new Sigma(token, userData);
  const userSigmaExps = await sigma.getAllUserExperiments()
  if (userSigmaExps) return userSigmaExps;  return;}

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° с экспСримСнтом#

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ экпСримСнта ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

  • динамичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ‚Π΅Π»Π΅ InnerPage.getInitialProps
  • ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ getInitialProps
/pages/InnerPage/index.js
import BannerName from '../../components/BannerName.js';
function InnerPage({ isBannerNameExperiment, allExperiments }) {  return (    <>      <main>        {isBannerNameExperiment &&  <BannerName /> }      </main>    </>  )}
InnerPage.getInitialProps = async () => {  const sigma = await import('../../helpers/sigma.js')  const userId = userCooKieId || req.userId; // ΠΊΡƒΠΊΠ° ΠΈΠ»ΠΈ любой id
  const isBannerNameExperiment = await sigma.sigmaGetExperimentParam(<expId>, <expParam>, { userId });  const allExperiments = await sigma.sigmaGetAllUserExperiments({ userId });
  return { isBannerNameExperiment, allExperiments }  }}
export default InnerPage;

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ sdk Π±Π΅Π· ssr#

Установка SDK#

npm i expf-sigma.js

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SDK#

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ hook, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ настройки sdk ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнтов, Ρ„ΠΈΡ‡Π° Ρ„Π»Π°Π³ΠΎΠ².

./src/hooks/useSigma.js
import Sigma from "expf-sigma.js";import { useEffect, useState } from 'react';
export function useSigma () {  const [sigma, setSigmaState] = useState({});
  useEffect(() => {    const sigmaData =  async () => {      const sigma = new Sigma();      const token = 'AE541D2D-0A51-4BB8-90D5-947B9DE05DD9';
      sigma.init({        token,        userData: {          email: '1ex@mail.ru',        },      });
      const browserName = await sigma.checkFlag('browser_name');      const buttonColor = await sigma.checkFlag('button_color');      const exParam = await sigma.getExperiment('param').then((res) => res.getParamValue('param_name'));
      setSigmaState({        browserName,        buttonColor,        exParam      });    }
    sigmaData();  }, []);
  return [sigma];}

Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ hook, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

./src/components/Title.js
import { useSigma } from "../hooks/useSigma";
export default function Title() {  const [sigma] = useSigma();
  return (    <h1>{sigma.browserName}</h1>  );}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с hook useSigma, Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ssr ΠΈ динамичСски ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

import dynamic from 'next/dynamic';const DynamicComponentWithNoSSR = dynamic(  () => import('../../components/Title.js'),  { ssr: false })
export default function ClientSide() {  return (    <>      <DynamicComponentWithNoSSR />    </>  )}