Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste tutorial, você usará um sinalizador de recurso de grade para gerenciar experiências para diferentes segmentos de usuário em um aplicativo de exemplo, Citação do Dia. Use o sinalizador de recurso de grade criado em Usar sinalizadores de recursos de grades. Antes de continuar, certifique-se de criar o sinalizador de recurso de grade chamado Saudação em seu repositório de Configuração de Aplicativos.
Pré-requisitos
- Versões LTS do Node.js.
- Siga o tutorial Usar sinalizadores de recursos de grades e crie o sinalizador de recurso de grade chamado Saudação.
Criar um aplicativo do 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 da URL (por exemplo,?userId=UserA
) para simular diferentes identidades de usuário.
Executar o aplicativo
Defina a variável de ambiente denominada AZURE_APPCONFIG_ENDPOINT para o ponto de extremidade do repositório de Configuração de Aplicativos encontrado na Visão Geral do seu repositório no portal do Azure.
Se você usar o prompt de comando do Windows, execute o comando a seguir 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 comando a seguir:
export AZURE_APPCONFIG_ENDPOINT='<endpoint-of-your-app-configuration-store>'
Execute o aplicativo.
node server.js
Abra o navegador e navegue até
localhost:8080
. Você deve ver o modo de exibição padrão do aplicativo que não tem nenhuma mensagem de saudação.Você pode usar
userId
o parâmetro de consulta na URL para especificar a 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óximas etapas
Para obter a visão geral completa dos recursos da biblioteca de gerenciamento de funcionalidades JavaScript, consulte a documentação a seguir.