Ćwiczenie — Użycie konta magazynu do hostowania statycznej witryny internetowej
Teraz, gdy interfejs API jest wdrażany w chmurze, jako inżynier firmy Tailwind Traders, musisz zaktualizować kod klienta i wdrożyć go w celu obsługi komunikatów usługi SignalR przychodzących dla usługi Azure Functions.
Aktualizowanie aplikacji klienckiej
W programie Visual Studio Code otwórz
./start/client/src/index.js
i zastąp cały kod, aby nasłuchiwać komunikatów usługi SignalR. Kod pobiera początkową listę magazynową z żądaniem HTTP, a następnie nasłuchuje aktualizacji z połączenia usługi SignalR. Po zaktualizowaniu akcji klient aktualizuje cenę akcji w interfejsie użytkownika.import './style.css'; import { BACKEND_URL } from './env'; const app = new Vue({ el: '#app', data() { return { stocks: [] } }, methods: { async getStocks() { try { const url = `${BACKEND_URL}/api/getStocks`; console.log('Fetching stocks from ', url); const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status} - ${response.statusText}`); } app.stocks = await response.json(); } catch (ex) { console.error(ex); } } }, created() { this.getStocks(); } }); const connect = () => { const signalR_URL = `${BACKEND_URL}/api`; console.log(`Connecting to SignalR...${signalR_URL}`) const connection = new signalR.HubConnectionBuilder() .withUrl(signalR_URL) .configureLogging(signalR.LogLevel.Information) .build(); connection.onclose(() => { console.log('SignalR connection disconnected'); setTimeout(() => connect(), 2000); }); connection.on('updated', updatedStock => { console.log('Stock updated message received', updatedStock); const index = app.stocks.findIndex(s => s.id === updatedStock.id); console.log(`${updatedStock.symbol} Old price: ${app.stocks[index].price}, New price: ${updatedStock.price}`); app.stocks.splice(index, 1, updatedStock); }); connection.start().then(() => { console.log("SignalR connection established"); }); }; connect();
Otwórz
./start/client/index.html
i wklej następujący kod zamiast bieżącego div z identyfikatorem aplikacji.<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css" integrity="sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4=" crossorigin="anonymous" /> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <title>Stock Notifications | Enable automatic updates in a web application using Azure Functions and SignalR</title> </head> <body> <div id="app" class="container"> <h1 class="title">Stocks</h1> <div id="stocks"> <div v-for="stock in stocks" class="stock"> <transition name="fade" mode="out-in"> <div class="list-item" :key="stock.price"> <div class="lead">{{ stock.symbol }}: ${{ stock.price }}</div> <div class="change">Change: <span :class="{ 'is-up': stock.changeDirection === '+', 'is-down': stock.changeDirection === '-' }"> {{ stock.changeDirection }}{{ stock.change }} </span> </div> </div> </transition> </div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js" integrity="sha256-chlNFSVx3TdcQ2Xlw7SvnbLAavAQLO0Y/LBiWX04viY=" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script> <script src="bundle.js" type="text/javascript"></script> </body> </html>
Ten znacznik zawiera element przejścia, który umożliwia Vue.js uruchamianie subtelnej animacji w miarę zmian danych zapasów. Po zaktualizowaniu akcji kafelek zanika i szybko zostaje ponownie wyświetlony. W ten sposób jeśli strona jest pełna danych akcji, użytkownicy mogą łatwo dostrzec zmienione akcje.
Dodaj następujący blok skryptu tuż nad odwołaniem do bundle.js , aby uwzględnić zestaw Sdk usługi SignalR.
<script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1.0.3/dist/browser/signalr.js"></script>
Aktualizowanie klienta .env
Utwórz plik zmiennych środowiskowych w folderze
start/client
o nazwie.env
.Dodaj zmienną o nazwie
BACKEND_URL
i dodaj jej wartość skopiowaną z lekcji 5.BACKEND_URL=https://YOUR-FUNTIONS-APP-NAME.azurewebsites.net
Tworzenie zasobu usługi Azure Static Web Apps i wdrażanie klienta
Otwórz witrynę Azure Portal, aby utworzyć nowy zasób usługi Azure Static Web Apps.
Skorzystaj z poniższych informacji, aby ukończyć kartę Podstawy tworzenia zasobów.
Nazwa/nazwisko Wartość Subskrypcja Wybierz subskrypcję. Grupa zasobów Użyj grupy stock-prototype
zasobów .Nazwa statycznej aplikacji internetowej Postpend your name to client
. Na przykładclient-jamie
.Typ planu hostingu Wybierz pozycję Bezpłatna. Źródło wdrożenia Wybierz pozycję GitHub. Organizacja Wybieranie konta usługi GitHub Repozytorium Wyszukaj i wybierz pozycję mslearn-advocates.azure-functions-and-signalr
.Oddział Wybierz gałąź główną. Ustawienia wstępne kompilacji Wybierz pozycję Vue.js. Lokalizacja aplikacji Wprowadź /start/client
.Lokalizacja interfejsu API Pozostaw puste. Lokalizacja wyjściowa Wprowadź dist
.Wybierz pozycję Podgląd pliku przepływu pracy, aby przejrzeć ustawienia wdrożenia. Krok Kompilowanie i wdrażanie powinien wyglądać następująco:
- name: Build And Deploy id: builddeploy uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_123 }} repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) action: "upload" ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig app_location: "/solution/client" # App source code path api_location: "" # Api source code path - optional output_location: "dist" # Built app content directory - optional ###### End of Repository/Build Configurations ######
Wybierz pozycję Zamknij , aby zapisać zmianę.
Wybierz pozycję Przejrzyj i utwórz, a następnie wybierz pozycję Utwórz , aby utworzyć zasób. Przed kontynuowaniem zaczekaj na ukończenie wdrażania.
Wybierz pozycję Przejdź do zasobu, aby otworzyć nowy zasób usługi Azure Static Web App.
Na stronie Przegląd skopiuj wartość adresu URL. Jest to podstawowy adres URL wdrożonej statycznej aplikacji internetowej.
Dodawanie zmiennej BACKEND_URL do repozytorium
Przepływ pracy musi mieć zmienną BACKEND_URL
środowiskową ustawioną na wdrożony podstawowy adres URL aplikacji usługi Azure Functions z lekcji 5.
W przeglądarce rozwidlenia przykładowego repozytorium GitHub wybierz pozycję Ustawienia — Zabezpieczenia —>> Wpisy tajne i zmienne —> Akcje.
Wybierz pozycję Zmienne, a następnie wybierz pozycję Nowa zmienna repozytorium.
Użyj poniższej tabeli, aby utworzyć zmienną:
Nazwa/nazwisko Wartość BACKEND_URL Podstawowy adres URL wdrożonej aplikacji usługi Azure Functions. Adres URL powinien być w formacie https://<FUNCTIONS-RESOURCE-NAME>.azurewebsites.net
Wybierz pozycję Dodaj zmienną , aby zapisać zmienną w repozytorium.
Edytowanie przepływu pracy wdrażania usługi GitHub
W terminalu programu Visual Studio Code pobierz nowy plik przepływu pracy z rozwidlenia (źródła).
git pull origin main
Otwórz plik
.github/workflows/azure-static-web-apps-*.yml
.name
Zmień wartość w górnej części pliku naClient
.Edytuj krok Kompiluj i wdróż , aby dodać właściwość env dla zmiennej środowiskowej
BACKEND_URL
.```yaml name: Client - Azure Static Web Apps CI/CD on: push: branches: - main pull_request: types: [opened, synchronize, reopened, closed] branches: - main jobs: build_and_deploy_job: if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') runs-on: ubuntu-latest name: Build and Deploy Job steps: - uses: actions/checkout@v3 with: submodules: true lfs: false #Debug only - Did GitHub action variable get into workflow correctly? - name: Echo run: | echo "BACKEND_URL: ${{ vars.BACKEND_URL }}" - name: Build And Deploy id: builddeploy uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_123 }} repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) action: "upload" ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig app_location: "/solution/client" # App source code path api_location: "" # Api source code path - optional output_location: "dist" # Built app content directory - optional ###### End of Repository/Build Configurations ###### env: BACKEND_URL: ${{ vars.BACKEND_URL }} close_pull_request_job: if: github.event_name == 'pull_request' && github.event.action == 'closed' runs-on: ubuntu-latest name: Close Pull Request Job steps: - name: Close Pull Request id: closepullrequest uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_123 }} action: "close" ```
Zapisz i wypchnij zmiany do repozytorium.
git add . git commit -m "Add BACKEND_URL environment variable" git push
Otwórz kartę Akcje w repozytorium rozwidlenia usługi GitHub, aby obejrzeć wdrożenie.
Aktualizowanie mechanizmu CORS w aplikacji funkcji
Domyślnie aplikacje funkcji nie zezwalają na żądania CORS. Należy zaktualizować aplikację funkcji, aby zezwolić na żądania ze statycznej aplikacji internetowej.
W witrynie Azure Portal przejdź do aplikacji usługi Azure Functions utworzonej w lekcji 5.
W menu po lewej stronie wybierz pozycję INTERFEJS API —> CORS.
Wybierz pozycję Włącz kontrolę dostępu-allow-credentials.
Dodaj wartość skopiowaną dla adresu URL zasobu usługi Static Web Apps.
Właściwości Wartość Dozwolone źródła Podstawowy adres URL wdrożonej statycznej aplikacji internetowej. Wybierz pozycję Zapisz , aby zapisać ustawienia mechanizmu CORS.
Testowanie wdrożenia klienta
- W przeglądarce użyj adresu URL wdrożonej statycznej aplikacji internetowej, aby otworzyć klienta.
- Otwórz narzędzia deweloperskie, aby obejrzeć konsolę, aby zobaczyć, kiedy są odbierane dane usługi SignalR dotyczące zaktualizowanej akcji. Pamiętaj, że nie są to żądania HTTP, więc nie będą one widoczne na karcie Sieć.
Gratulacje! Twoja aplikacja stockowa została ulepszona za pomocą usługi SignalR!