Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Neste tutorial, você usa um sinalizador de recurso variante para gerenciar experiências para diferentes segmentos de usuário em um aplicativo de exemplo, Cotação do Dia. Você utiliza o sinalizador de recurso variante criado em Usar sinalizadores de recurso variante. Antes de continuar, certifique-se de criar o sinalizador de recurso variante chamado Saudação na sua loja de configuração de aplicativos.
Pré-requisitos
- Versões LTS do Node.js.
- Siga o tutorial Usar sinalizadores de recurso variante e crie o sinalizador de recurso variante chamado Saudação.
Criar uma aplicação Node.js
Crie uma pasta chamada
quote-of-the-day
e inicialize o projeto.mkdir quote-of-the-day cd quote-of-the-day npm init -y
Instale os seguintes pacotes.
npm install @azure/app-configuration-provider npm install @microsoft/feature-management npm install express
Crie um novo arquivo chamado server.js e adicione o código a seguir.
const express = require("express"); const server = express(); const appConfigEndpoint = process.env.AZURE_APPCONFIG_ENDPOINT; const { DefaultAzureCredential } = require("@azure/identity"); const { load } = require("@azure/app-configuration-provider"); const { FeatureManager, ConfigurationMapFeatureFlagProvider } = require("@microsoft/feature-management"); let appConfig; let featureManager; async function initializeConfig() { appConfig = await load(appConfigEndpoint, new DefaultAzureCredential(), { featureFlagOptions: { enabled: true, refresh: { enabled: true } } }); const featureFlagProvider = new ConfigurationMapFeatureFlagProvider(appConfig); featureManager = new FeatureManager(featureFlagProvider); } function startServer() { // Use a middleware to refresh the configuration before each request server.use((req, res, next) => { appConfig.refresh(); next(); }); server.use(express.json()); // Serve static index.html from the current folder server.use(express.static(".")); // This API returns the different greeting messages based on the segment the user belongs to. // It evaluates a variant feature flag based on user context. The greeting message is retrieved from the variant configuration. server.get("/api/getGreetingMessage", async (req, res) => { const { userId, groups } = req.query; const variant = await featureManager.getVariant("Greeting", { userId: userId, groups: groups ? groups.split(",") : [] }); res.status(200).send({ message: variant?.configuration }); }); server.post("/api/like", (req, res) => { const { UserId } = req.body; if (UserId === undefined) { return res.status(400).send({ error: "UserId is required" }); } // Here you would typically emit a 'like' event to compare variants. res.status(200).send(); }); const port = "8080"; server.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); }); } // Initialize the configuration and start the server initializeConfig() .then(() => { startServer(); }) .catch((error) => { console.error("Failed to load configuration:", error); process.exit(1); });
Crie um novo arquivo chamado index.html e adicione o seguinte código:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Quote of the Day</title> <style> .heart-button { background-color: transparent; border: none; cursor: pointer; font-size: 24px; } .heart-button:hover { background-color: #F0F0F0; } </style> </head> <body> <div style="display: flex; flex-direction: column; min-height: 100vh; background-color: #f4f4f4;"> <header style="background-color: white; border-bottom: 1px solid #eaeaea; display: flex; justify-content: space-between; align-items: center; font-family: 'Arial', sans-serif; font-size: 16px;"> <div style="font-size: 1.25em; color: black;">QuoteOfTheDay</div> </header> <main style="display: flex; justify-content: center; align-items: center; flex-grow: 1;"> <div style="background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); max-width: 700px; position: relative; text-align: left;"> <div id="quote-content"> <h2 id="greeting">Quote of the Day</h2> <blockquote style="font-size: 2em; font-style: italic; color: #4EC2F7; margin: 0 0 20px 0; line-height: 1.4;"> <p>"You cannot change what you are, only what you do."</p> <footer style="font-size: 0.55em; color: black; font-family: 'Arial', sans-serif; font-style: normal; font-weight: bold;">— Philip Pullman</footer> </blockquote> <div style="position: absolute; top: 10px; right: 10px; display: flex;"> <button class="heart-button" id="like-button"> <span id="heart-icon" style="color: #ccc">♥</span> </button> </div> </div> <div id="loading" style="display: none;"> <p>Loading</p> </div> </div> </main> </div> <script> // extract URL parameters to simulate user login document.addEventListener('DOMContentLoaded', function() { const urlParams = new URLSearchParams(window.location.search); const currentUser = urlParams.get('userId') || ''; let liked = false; const greetingElement = document.getElementById('greeting'); const heartIcon = document.getElementById('heart-icon'); const likeButton = document.getElementById('like-button'); const quoteContent = document.getElementById('quote-content'); const loadingElement = document.getElementById('loading'); async function init() { quoteContent.style.display = 'none'; loadingElement.style.display = 'block'; const response = await fetch(`/api/getGreetingMessage?userId=${currentUser}`, { method: "GET" }); const result = await response.json(); greetingElement.textContent = result.message || ""; quoteContent.style.display = 'block'; loadingElement.style.display = 'none'; } likeButton.addEventListener('click', async function() { if (!liked) { const response = await fetch("/api/like", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ UserId: currentUser }), }); } liked = !liked; heartIcon.style.color = liked ? 'red' : '#ccc'; }); init(); }); </script> </body> </html>
Para simplificar, o exemplo extrai o
userId
dos parâmetros de consulta de URL (por exemplo,?userId=UserA
) para simular diferentes identidades de usuário.
Execute o aplicativo
Defina a variável de ambiente chamada AZURE_APPCONFIG_ENDPOINT para o ponto de extremidade da sua loja de Configuração de Aplicativos encontrado em Visão geral da sua loja no portal do Azure.
Se você usar o prompt de comando do Windows, execute o seguinte comando e reinicie o prompt de comando para permitir que a alteração entre em vigor:
setx AZURE_APPCONFIG_ENDPOINT "<endpoint-of-your-app-configuration-store>"
Se você usar o PowerShell, execute o seguinte comando:
$Env:AZURE_APPCONFIG_ENDPOINT = "<endpoint-of-your-app-configuration-store>"
Se você usa macOS ou Linux, execute o seguinte comando:
export AZURE_APPCONFIG_ENDPOINT='<endpoint-of-your-app-configuration-store>'
Execute o aplicativo.
node server.js
Abra o navegador e navegue até
localhost:8080
. Deverá ver a vista predefinida da aplicação que não tem qualquer mensagem de saudação.Você pode usar
userId
o parâmetro query na url para especificar o ID do usuário. Visitelocalhost:8080/?userId=UserA
e você verá uma longa mensagem de saudação.Experimente diferentes IDs de usuário para ver como o sinalizador de recurso variante altera a mensagem de saudação para diferentes segmentos de usuários. Visite
localhost:8080/?userId=UserB
e você verá uma mensagem de saudação mais curta.
Próximos passos
Para obter o resumo completo dos recursos da biblioteca de gerenciamento de recursos JavaScript, consulte o documento a seguir.