Next.js SDK
Background
Для рендеринга результата экспериментов и фича флагов на стороне сервера в своих приложениях нужно подключить серверный sdk expf-sigma-node.js. Next.js имеет две функции для рендеринга на стороне сервера: getInitialProps и getServerSideProps.
Если н ет необходимости рендеринга на стороне сервера можно подключить клиентский sdk expf-sigma.js, результат экспериментов и фича флагов можно получить в компонентах.
- подключение sdk c ssr, функция getServerSideProps
- подключение sdk c ssr, функция getInitialProps
- подключение sdk без ssr
Подключение sdk c ssr, функция getServerSideProps
Установка SDK
- NPM
- Yarn
npm i expf-sigma-node.js
yarn add 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
- Yarn
npm i expf-sigma-node.js
yarn add 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
- Yarn
npm i expf-sigma.js
yarn add 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 = <TOKEN>;
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 />
</>
)
}