Tutoriel : Bien démarrer avec ASP.NET Core SignalR à l’aide de TypeScript et Webpack

Remarque

Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 8 de cet article.

Important

Ces informations portent sur la préversion du produit, qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.

Pour la version actuelle, consultez la version .NET 8 de cet article.

By Sébastien Sougnez

Ce tutoriel montre comment utiliser Webpack dans une application web ASP.NET Core SignalR pour regrouper et générer un client écrit en TypeScript. Webpack permet aux développeurs de regrouper et générer les ressources côté client d’une application web.

Dans ce tutoriel, vous allez apprendre à :

  • Créer une application ASP.NET Core SignalR
  • Configurer le serveur SignalR
  • Configurer un pipeline de build à l’aide de Webpack
  • Configurer le client TypeScript SignalR
  • Activer la communication entre le client et le serveur

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Prérequis

Créer l’application web ASP.NET Core

Par défaut, Visual Studio utilise la version de npm qu’il trouve dans son répertoire d’installation. Pour configurer Visual Studio pour rechercher npm dans la variable d’environnement PATH :

Lancez Visual Studio. Dans la fenêtre de démarrage, sélectionnez Continuer sans code.

  1. Accédez à Outils>Options>Projets et solutions>Gestion des packages web>Outils web externes.

  2. Sélectionnez l’entrée $(PATH) dans la liste. Sélectionnez la flèche vers le haut pour déplacer l’entrée à la deuxième position de la liste, puis sélectionnez OK :

    Configuration de Visual Studio.

Pour créer une application web ASP.NET Core :

  1. Utilisez l’option de menu Fichier>Nouveau>Projet et choisissez le modèle ASP.NET Core Vide. Cliquez sur Suivant.
  2. Nommez le projet SignalRWebpack, puis sélectionnez Créer.
  3. Sélectionnez .NET 8.0 (prise en charge à long terme) dans la liste déroulante Framework. Sélectionnez Créer.

Ajoutez le package NuGet Microsoft.TypeScript.MSBuild au projet :

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet. Sous l’onglet Parcourir, recherchez Microsoft.TypeScript.MSBuild, puis cliquez sur Installer à droite pour installer le package.

Visual Studio ajoute le package NuGet sous le nœud Dépendances dans Explorateur de solutions, ce qui permet la compilation TypeScript dans le projet.

Configurer le serveur

Dans cette section, vous allez configurer l’application web ASP.NET Core pour envoyer et recevoir des messages SignalR.

  1. Dans Program.cs, appelez AddSignalR :

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. Là encore, dans Program.cs, appelez UseDefaultFiles et UseStaticFiles :

    var app = builder.Build();
    
    app.UseDefaultFiles();
    app.UseStaticFiles();
    

    Le code précédent permet au serveur de localiser et de servir le fichier index.html. Le fichier est servi si l’utilisateur entre son URL complète ou l’URL racine de l’application web.

  3. Créez un répertoire nommé Hubs dans la racine du projet, SignalRWebpack/, pour la classe hub SignalR.

  4. Créez un fichier, Hubs/ChatHub.cs, avec le code suivant :

    using Microsoft.AspNetCore.SignalR;
    
    namespace SignalRWebpack.Hubs;
    
    public class ChatHub : Hub
    {
        public async Task NewMessage(long username, string message) =>
            await Clients.All.SendAsync("messageReceived", username, message);
    }
    

    Le code précédent diffuse les messages reçus à tous les utilisateurs connectés, une fois que le serveur les reçoit. Vous n’avez pas besoin d’appeler une méthode générique on pour recevoir tous les messages. Une méthode nommée après le nom du message est suffisante.

    Dans cet exemple :

    • Le client TypeScript envoie un message identifié comme newMessage.
    • La méthode C# NewMessage attend les données envoyées par le client.
    • Un appel est effectué pour SendAsync sur Clients.All.
    • Les messages reçus sont envoyés à tous les clients connectés au hub.
  5. Ajoutez l’instruction using suivante en haut de Program.cs pour résoudre la référence ChatHub :

    using SignalRWebpack.Hubs;
    
  6. Dans Program.cs, mappez l’itinéraire /hub au hub ChatHub. Remplacez le code qui affiche Hello World! par le code suivant :

    app.MapHub<ChatHub>("/hub");
    

Configurer le client

Dans cette section, vous allez créer un projet Node.js pour convertir TypeScript en JavaScript et regrouper des ressources côté client, notamment HTML et CSS, à l’aide de Webpack.

  1. Exécutez la commande suivante dans la racine du projet pour créer un fichier package.json :

    npm init -y
    
  2. Ajoutez la propriété mise en surbrillance au fichier package.json et enregistrez les modifications apportées au fichier :

    {
      "name": "SignalRWebpack",
      "version": "1.0.0",
      "private": true,
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    La définition de la propriété private sur true empêche les avertissements d’installation de package à l’étape suivante.

  3. Installez les packages npm nécessaires. À partir de la racine du projet, exécutez la commande suivante :

    npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
    

    L’option -E désactive le comportement par défaut de npm pour écrire contrôle de version sémantique opérateurs de plage pour package.json. Par exemple, "webpack": "5.76.1" peut être utilisé à la place de "webpack": "^5.76.1". Cette option empêche les mises à niveau involontaires vers des versions de package plus récentes.

    Pour plus d’informations, consultez la documentation npm-install.

  4. Remplacez la propriété scripts du fichier package.json par le code suivant :

    "scripts": {
      "build": "webpack --mode=development --watch",
      "release": "webpack --mode=production",
      "publish": "npm run release && dotnet publish -c Release"
    },
    

    Les scripts suivants sont définis :

    • build : Regroupe les ressources côté client en mode de développement et surveille les changements de fichier. L’observateur de fichiers force la regénération du regroupement chaque fois qu’un fichier projet change. L’option mode désactive les optimisations de production, comme la minimisation de l’arborescence (tree shaking). utilisez build uniquement dans le développement.
    • release : Regroupe les ressources côté client en mode de production.
    • publish : Exécute le script release pour regrouper les ressources côté client en mode de production. La commande appelle la commande publish de CLI .NET pour publier l’application.
  5. Créez un fichier nommé webpack.config.js à la racine du projet avec le code suivant :

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    module.exports = {
        entry: "./src/index.ts",
        output: {
            path: path.resolve(__dirname, "wwwroot"),
            filename: "[name].[chunkhash].js",
            publicPath: "/",
        },
        resolve: {
            extensions: [".js", ".ts"],
        },
        module: {
            rules: [
                {
                    test: /\.ts$/,
                    use: "ts-loader",
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader, "css-loader"],
                },
            ],
        },
        plugins: [
            new CleanWebpackPlugin(),
            new HtmlWebpackPlugin({
                template: "./src/index.html",
            }),
            new MiniCssExtractPlugin({
                filename: "css/[name].[chunkhash].css",
            }),
        ],
    };
    

    Le fichier précédent configure le processus de compilation Webpack :

    • La propriété output remplace la valeur par défaut de dist. Le regroupement est émis dans le répertoire wwwroot à la place.
    • Le tableau resolve.extensions inclut .js pour importer le code JavaScript du client SignalR.
  6. Créez un nouveau répertoire nommé src à la racine du projet, SignalRWebpack/, pour le code client.

  7. Copiez le répertoire src et son contenu de l'exemple de projet vers la racine du projet. Le répertoire src contient les fichiers suivants :

    • index.html, qui définit le balisage réutilisable de la page d’accueil :

      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="utf-8" />
          <title>ASP.NET Core SignalR with TypeScript and Webpack</title>
        </head>
        <body>
          <div id="divMessages" class="messages"></div>
          <div class="input-zone">
            <label id="lblMessage" for="tbMessage">Message:</label>
            <input id="tbMessage" class="input-zone-input" type="text" />
            <button id="btnSend">Send</button>
          </div>
        </body>
      </html>
      
    • css/main.css, qui fournit des styles CSS pour la page d’accueil :

      *,
      *::before,
      *::after {
        box-sizing: border-box;
      }
      
      html,
      body {
        margin: 0;
        padding: 0;
      }
      
      .input-zone {
        align-items: center;
        display: flex;
        flex-direction: row;
        margin: 10px;
      }
      
      .input-zone-input {
        flex: 1;
        margin-right: 10px;
      }
      
      .message-author {
        font-weight: bold;
      }
      
      .messages {
        border: 1px solid #000;
        margin: 10px;
        max-height: 300px;
        min-height: 300px;
        overflow-y: auto;
        padding: 5px;
      }
      
    • tsconfig.json, qui configure le compilateur TypeScript pour produire javaScript compatible 5 ECMAScript :

      {
        "compilerOptions": {
          "target": "es5"
        }
      }
      
    • index.ts:

      import * as signalR from "@microsoft/signalr";
      import "./css/main.css";
      
      const divMessages: HTMLDivElement = document.querySelector("#divMessages");
      const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
      const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
      const username = new Date().getTime();
      
      const connection = new signalR.HubConnectionBuilder()
          .withUrl("/hub")
          .build();
      
      connection.on("messageReceived", (username: string, message: string) => {
        const m = document.createElement("div");
      
        m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`;
      
        divMessages.appendChild(m);
        divMessages.scrollTop = divMessages.scrollHeight;
      });
      
      connection.start().catch((err) => document.write(err));
      
      tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
          send();
        }
      });
      
      btnSend.addEventListener("click", send);
      
      function send() {
        connection.send("newMessage", username, tbMessage.value)
          .then(() => (tbMessage.value = ""));
      }
      

      Le code précédent récupère les références aux éléments DOM et attache deux gestionnaires d’événements :

      • keyup : se déclenche lorsque l’utilisateur tape dans la zone de texte tbMessage et appelle la fonction send lorsque l’utilisateur appuie sur la touche Entrée.
      • click : se déclenche lorsque l’utilisateur sélectionne le bouton Envoyer et appelle send la fonction.

      La classe HubConnectionBuilder crée un générateur pour configurer la connexion de serveur. La fonction withUrl configure l’URL du hub.

      SignalR permet l’échange de messages entre un client et un serveur. Chaque message a un nom spécifique. Par exemple, les messages portant le nom messageReceived peuvent exécuter la logique responsable de l’affichage du nouveau message dans la zone de messages. L’écoute d’un message spécifique peut être effectuée au moyen de la fonction on. N’importe quel nombre de noms de messages peuvent être écoutés. Vous pouvez aussi passer des paramètres au message, comme le nom de l’auteur et le contenu du message reçu. Dès que le client reçoit un message, un élément div est créé avec le nom de l’auteur et le contenu du message dans son attribut innerHTML. Il est ajouté à l’élément div principal qui affiche les messages.

      L’envoi d’un message au moyen de la connexion WebSocket nécessite l’appel de la méthode send. Le premier paramètre de la méthode est le nom du message. Les données du message se trouvent dans les autres paramètres. Dans cet exemple, un message identifié comme newMessage est envoyé au serveur. Le message se compose du nom d’utilisateur et de l’entrée de l’utilisateur dans une zone de texte. Si l’envoi fonctionne, la valeur de la zone de texte est effacée.

  8. Exécutez la commande suivante à la racine du projet :

    npm i @microsoft/signalr @types/node
    

    La commande précédente active :

    • Le SignalRclient TypeScript, ce qui permet au client d’envoyer des messages au serveur.
    • Définitions de type TypeScript pour Node.js, qui permet la vérification au moment de la compilation des types Node.js.

Test de l'application

Vérifiez que l’application fonctionne avec les étapes suivantes :

  1. Exécutez Webpack en mode release. Dans la fenêtre Console du Gestionnaire de package, exécutez la commande suivante à la racine du projet.

    npm run release
    

    Cette commande génère les ressources côté client à délivrer pendant l’exécution de l’application. Les ressources sont placées dans le dossier wwwroot.

    Webpack a effectué les tâches suivantes :

    • Vide le contenu du répertoire wwwroot.
    • Converti le TypeScript en JavaScript dans un processus appelé transpilation.
    • Troncation du code JavaScript généré pour réduire la taille de fichier dans un processus appelé minimisation.
    • Copie des fichiers JavaScript, CSS et HTML traités à partir de src dans le répertoire wwwroot.
    • Injection des éléments suivants dans le fichier wwwroot/index.html :
      • Balise <link>, référençant le fichier wwwroot/main.<hash>.css. Cette balise est placée immédiatement avant la balise </head> de fermeture.
      • Balise <script>, référençant le fichier wwwroot/main.<hash>.js minifié. Cette balise est placée immédiatement après la balise de fermeture </title>.
  2. Sélectionnez Déboguer>Démarrer sans débogage pour lancer l’application dans un navigateur sans attacher le débogueur. Le fichier wwwroot/index.html est servi à https://localhost:<port>.

    En cas d’erreurs de compilation, essayez de fermer et de rouvrir la solution.

  3. Ouvrez une autre instance du navigateur (n’importe quel navigateur) et collez l’URL dans la barre d’adresse.

  4. Choisissez un navigateur, tapez quelque chose dans la zone de texte Message, puis cliquez sur le bouton Envoyer. Le nom unique de l’utilisateur et le message sont affichés instantanément dans les deux pages.

Message affiché dans les deux fenêtres de navigateur

Étapes suivantes

Ressources supplémentaires

Ce tutoriel montre comment utiliser Webpack dans une application web ASP.NET Core SignalR pour regrouper et générer un client écrit en TypeScript. Webpack permet aux développeurs de regrouper et générer les ressources côté client d’une application web.

Dans ce tutoriel, vous allez apprendre à :

  • Créer une application ASP.NET Core SignalR
  • Configurer le serveur SignalR
  • Configurer un pipeline de build à l’aide de Webpack
  • Configurer le client TypeScript SignalR
  • Activer la communication entre le client et le serveur

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Prérequis

Créer l’application web ASP.NET Core

Par défaut, Visual Studio utilise la version de npm qu’il trouve dans son répertoire d’installation. Pour configurer Visual Studio pour rechercher npm dans la variable d’environnement PATH :

Lancez Visual Studio. Dans la fenêtre de démarrage, sélectionnez Continuer sans code.

  1. Accédez à Outils>Options>Projets et solutions>Gestion des packages web>Outils web externes.

  2. Sélectionnez l’entrée $(PATH) dans la liste. Sélectionnez la flèche vers le haut pour déplacer l’entrée à la deuxième position de la liste, puis sélectionnez OK :

    Configuration de Visual Studio.

Pour créer une application web ASP.NET Core :

  1. Utilisez l’option de menu Fichier>Nouveau>Projet et choisissez le modèle ASP.NET Core Vide. Cliquez sur Suivant.
  2. Nommez le projet SignalRWebpack, puis sélectionnez Créer.
  3. Sélectionnez .NET 7.0 (Standard Term Support) dans la liste déroulante Framework. Cliquez sur Créer.

Ajoutez le package NuGet Microsoft.TypeScript.MSBuild au projet :

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet. Sous l’onglet Parcourir, recherchez Microsoft.TypeScript.MSBuild, puis cliquez sur Installer à droite pour installer le package.

Visual Studio ajoute le package NuGet sous le nœud Dépendances dans Explorateur de solutions, ce qui permet la compilation TypeScript dans le projet.

Configurer le serveur

Dans cette section, vous allez configurer l’application web ASP.NET Core pour envoyer et recevoir des messages SignalR.

  1. Dans Program.cs, appelez AddSignalR :

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. Là encore, dans Program.cs, appelez UseDefaultFiles et UseStaticFiles :

    var app = builder.Build();
    
    app.UseDefaultFiles();
    app.UseStaticFiles();
    

    Le code précédent permet au serveur de localiser et de servir le fichier index.html. Le fichier est servi si l’utilisateur entre son URL complète ou l’URL racine de l’application web.

  3. Créez un répertoire nommé Hubs dans la racine du projet, SignalRWebpack/, pour la classe hub SignalR.

  4. Créez un fichier, Hubs/ChatHub.cs, avec le code suivant :

    using Microsoft.AspNetCore.SignalR;
    
    namespace SignalRWebpack.Hubs;
    
    public class ChatHub : Hub
    {
        public async Task NewMessage(long username, string message) =>
            await Clients.All.SendAsync("messageReceived", username, message);
    }
    

    Le code précédent diffuse les messages reçus à tous les utilisateurs connectés, une fois que le serveur les reçoit. Vous n’avez pas besoin d’appeler une méthode générique on pour recevoir tous les messages. Une méthode nommée après le nom du message est suffisante.

    Dans cet exemple :

    • Le client TypeScript envoie un message identifié comme newMessage.
    • La méthode C# NewMessage attend les données envoyées par le client.
    • Un appel est effectué pour SendAsync sur Clients.All.
    • Les messages reçus sont envoyés à tous les clients connectés au hub.
  5. Ajoutez l’instruction using suivante en haut de Program.cs pour résoudre la référence ChatHub :

    using SignalRWebpack.Hubs;
    
  6. Dans Program.cs, mappez l’itinéraire /hub au hub ChatHub. Remplacez le code qui affiche Hello World! par le code suivant :

    app.MapHub<ChatHub>("/hub");
    

Configurer le client

Dans cette section, vous allez créer un projet Node.js pour convertir TypeScript en JavaScript et regrouper des ressources côté client, notamment HTML et CSS, à l’aide de Webpack.

  1. Exécutez la commande suivante dans la racine du projet pour créer un fichier package.json :

    npm init -y
    
  2. Ajoutez la propriété mise en surbrillance au fichier package.json et enregistrez les modifications apportées au fichier :

    {
      "name": "SignalRWebpack",
      "version": "1.0.0",
      "private": true,
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    La définition de la propriété private sur true empêche les avertissements d’installation de package à l’étape suivante.

  3. Installez les packages npm nécessaires. À partir de la racine du projet, exécutez la commande suivante :

    npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
    

    L’option -E désactive le comportement par défaut de npm pour écrire contrôle de version sémantique opérateurs de plage pour package.json. Par exemple, "webpack": "5.76.1" peut être utilisé à la place de "webpack": "^5.76.1". Cette option empêche les mises à niveau involontaires vers des versions de package plus récentes.

    Pour plus d’informations, consultez la documentation npm-install.

  4. Remplacez la propriété scripts du fichier package.json par le code suivant :

    "scripts": {
      "build": "webpack --mode=development --watch",
      "release": "webpack --mode=production",
      "publish": "npm run release && dotnet publish -c Release"
    },
    

    Les scripts suivants sont définis :

    • build : Regroupe les ressources côté client en mode de développement et surveille les changements de fichier. L’observateur de fichiers force la regénération du regroupement chaque fois qu’un fichier projet change. L’option mode désactive les optimisations de production, comme la minimisation de l’arborescence (tree shaking). utilisez build uniquement dans le développement.
    • release : Regroupe les ressources côté client en mode de production.
    • publish : Exécute le script release pour regrouper les ressources côté client en mode de production. La commande appelle la commande publish de CLI .NET pour publier l’application.
  5. Créez un fichier nommé webpack.config.js à la racine du projet avec le code suivant :

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    module.exports = {
        entry: "./src/index.ts",
        output: {
            path: path.resolve(__dirname, "wwwroot"),
            filename: "[name].[chunkhash].js",
            publicPath: "/",
        },
        resolve: {
            extensions: [".js", ".ts"],
        },
        module: {
            rules: [
                {
                    test: /\.ts$/,
                    use: "ts-loader",
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader, "css-loader"],
                },
            ],
        },
        plugins: [
            new CleanWebpackPlugin(),
            new HtmlWebpackPlugin({
                template: "./src/index.html",
            }),
            new MiniCssExtractPlugin({
                filename: "css/[name].[chunkhash].css",
            }),
        ],
    };
    

    Le fichier précédent configure le processus de compilation Webpack :

    • La propriété output remplace la valeur par défaut de dist. Le regroupement est émis dans le répertoire wwwroot à la place.
    • Le tableau resolve.extensions inclut .js pour importer le code JavaScript du client SignalR.
  6. Copiez le répertoire src et son contenu de l'exemple de projet vers la racine du projet. Le répertoire src contient les fichiers suivants :

    • index.html, qui définit le balisage réutilisable de la page d’accueil :

      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="utf-8" />
          <title>ASP.NET Core SignalR with TypeScript and Webpack</title>
        </head>
        <body>
          <div id="divMessages" class="messages"></div>
          <div class="input-zone">
            <label id="lblMessage" for="tbMessage">Message:</label>
            <input id="tbMessage" class="input-zone-input" type="text" />
            <button id="btnSend">Send</button>
          </div>
        </body>
      </html>
      
    • css/main.css, qui fournit des styles CSS pour la page d’accueil :

      *,
      *::before,
      *::after {
        box-sizing: border-box;
      }
      
      html,
      body {
        margin: 0;
        padding: 0;
      }
      
      .input-zone {
        align-items: center;
        display: flex;
        flex-direction: row;
        margin: 10px;
      }
      
      .input-zone-input {
        flex: 1;
        margin-right: 10px;
      }
      
      .message-author {
        font-weight: bold;
      }
      
      .messages {
        border: 1px solid #000;
        margin: 10px;
        max-height: 300px;
        min-height: 300px;
        overflow-y: auto;
        padding: 5px;
      }
      
    • tsconfig.json, qui configure le compilateur TypeScript pour produire javaScript compatible 5 ECMAScript :

      {
        "compilerOptions": {
          "target": "es5"
        }
      }
      
    • index.ts:

      import * as signalR from "@microsoft/signalr";
      import "./css/main.css";
      
      const divMessages: HTMLDivElement = document.querySelector("#divMessages");
      const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
      const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
      const username = new Date().getTime();
      
      const connection = new signalR.HubConnectionBuilder()
          .withUrl("/hub")
          .build();
      
      connection.on("messageReceived", (username: string, message: string) => {
        const m = document.createElement("div");
      
        m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`;
      
        divMessages.appendChild(m);
        divMessages.scrollTop = divMessages.scrollHeight;
      });
      
      connection.start().catch((err) => document.write(err));
      
      tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
          send();
        }
      });
      
      btnSend.addEventListener("click", send);
      
      function send() {
        connection.send("newMessage", username, tbMessage.value)
          .then(() => (tbMessage.value = ""));
      }
      

      Le code précédent récupère les références aux éléments DOM et attache deux gestionnaires d’événements :

      • keyup : se déclenche lorsque l’utilisateur tape dans la zone de texte tbMessage et appelle la fonction send lorsque l’utilisateur appuie sur la touche Entrée.
      • click : se déclenche lorsque l’utilisateur sélectionne le bouton Envoyer et appelle send la fonction.

      La classe HubConnectionBuilder crée un générateur pour configurer la connexion de serveur. La fonction withUrl configure l’URL du hub.

      SignalR permet l’échange de messages entre un client et un serveur. Chaque message a un nom spécifique. Par exemple, les messages portant le nom messageReceived peuvent exécuter la logique responsable de l’affichage du nouveau message dans la zone de messages. L’écoute d’un message spécifique peut être effectuée au moyen de la fonction on. N’importe quel nombre de noms de messages peuvent être écoutés. Vous pouvez aussi passer des paramètres au message, comme le nom de l’auteur et le contenu du message reçu. Dès que le client reçoit un message, un élément div est créé avec le nom de l’auteur et le contenu du message dans son attribut innerHTML. Il est ajouté à l’élément div principal qui affiche les messages.

      L’envoi d’un message au moyen de la connexion WebSocket nécessite l’appel de la méthode send. Le premier paramètre de la méthode est le nom du message. Les données du message se trouvent dans les autres paramètres. Dans cet exemple, un message identifié comme newMessage est envoyé au serveur. Le message se compose du nom d’utilisateur et de l’entrée de l’utilisateur dans une zone de texte. Si l’envoi fonctionne, la valeur de la zone de texte est effacée.

  7. Exécutez la commande suivante à la racine du projet :

    npm i @microsoft/signalr @types/node
    

    La commande précédente active :

    • Le SignalRclient TypeScript, ce qui permet au client d’envoyer des messages au serveur.
    • Définitions de type TypeScript pour Node.js, qui permet la vérification au moment de la compilation des types Node.js.

Test de l'application

Vérifiez que l’application fonctionne avec les étapes suivantes :

  1. Exécutez Webpack en mode release. Dans la fenêtre Console du Gestionnaire de package, exécutez la commande suivante à la racine du projet.

    npm run release
    

    Cette commande génère les ressources côté client à délivrer pendant l’exécution de l’application. Les ressources sont placées dans le dossier wwwroot.

    Webpack a effectué les tâches suivantes :

    • Vide le contenu du répertoire wwwroot.
    • Converti le TypeScript en JavaScript dans un processus appelé transpilation.
    • Troncation du code JavaScript généré pour réduire la taille de fichier dans un processus appelé minimisation.
    • Copie des fichiers JavaScript, CSS et HTML traités à partir de src dans le répertoire wwwroot.
    • Injection des éléments suivants dans le fichier wwwroot/index.html :
      • Balise <link>, référençant le fichier wwwroot/main.<hash>.css. Cette balise est placée immédiatement avant la balise </head> de fermeture.
      • Balise <script>, référençant le fichier wwwroot/main.<hash>.js minifié. Cette balise est placée immédiatement après la balise de fermeture </title>.
  2. Sélectionnez Déboguer>Démarrer sans débogage pour lancer l’application dans un navigateur sans attacher le débogueur. Le fichier wwwroot/index.html est servi à https://localhost:<port>.

    En cas d’erreurs de compilation, essayez de fermer et de rouvrir la solution.

  3. Ouvrez une autre instance du navigateur (n’importe quel navigateur) et collez l’URL dans la barre d’adresse.

  4. Choisissez un navigateur, tapez quelque chose dans la zone de texte Message, puis cliquez sur le bouton Envoyer. Le nom unique de l’utilisateur et le message sont affichés instantanément dans les deux pages.

Message affiché dans les deux fenêtres de navigateur

Étapes suivantes

Ressources supplémentaires

Ce tutoriel montre comment utiliser Webpack dans une application web ASP.NET Core SignalR pour regrouper et générer un client écrit en TypeScript. Webpack permet aux développeurs de regrouper et générer les ressources côté client d’une application web.

Dans ce tutoriel, vous allez apprendre à :

  • Créer une application ASP.NET Core SignalR
  • Configurer le serveur SignalR
  • Configurer un pipeline de build à l’aide de Webpack
  • Configurer le client TypeScript SignalR
  • Activer la communication entre le client et le serveur

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Prérequis

Créer l’application web ASP.NET Core

Par défaut, Visual Studio utilise la version de npm qu’il trouve dans son répertoire d’installation. Pour configurer Visual Studio pour rechercher npm dans la variable d’environnement PATH :

  1. Lancez Visual Studio. Dans la fenêtre de démarrage, sélectionnez Continuer sans code.

  2. Accédez à Outils>Options>Projets et solutions>Gestion des packages web>Outils web externes.

  3. Sélectionnez l’entrée $(PATH) dans la liste. Sélectionnez la flèche vers le haut pour déplacer l’entrée à la deuxième position de la liste, puis sélectionnez OK :

    Configuration de Visual Studio.

Pour créer une application web ASP.NET Core :

  1. Utilisez l’option de menu Fichier>Nouveau>Projet et choisissez le modèle ASP.NET Core Vide. Cliquez sur Suivant.
  2. Nommez le projet SignalRWebpack, puis sélectionnez Créer.
  3. Sélectionnez .NET 6.0 (Long Term Support) dans la liste déroulante Framework. Cliquez sur Créer.

Ajoutez le package NuGet Microsoft.TypeScript.MSBuild au projet :

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet. Sous l’onglet Parcourir, recherchez Microsoft.TypeScript.MSBuild, puis cliquez sur Installer à droite pour installer le package.

Visual Studio ajoute le package NuGet sous le nœud Dépendances dans Explorateur de solutions, ce qui permet la compilation TypeScript dans le projet.

Configurer le serveur

Dans cette section, vous allez configurer l’application web ASP.NET Core pour envoyer et recevoir des messages SignalR.

  1. Dans Program.cs, appelez AddSignalR :

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. Là encore, dans Program.cs, appelez UseDefaultFiles et UseStaticFiles :

    var app = builder.Build();
    
    app.UseDefaultFiles();
    app.UseStaticFiles();
    

    Le code précédent permet au serveur de localiser et de servir le fichier index.html. Le fichier est servi si l’utilisateur entre son URL complète ou l’URL racine de l’application web.

  3. Créez un répertoire nommé Hubs dans la racine du projet, SignalRWebpack/, pour la classe hub SignalR.

  4. Créez un fichier, Hubs/ChatHub.cs, avec le code suivant :

    using Microsoft.AspNetCore.SignalR;
    
    namespace SignalRWebpack.Hubs;
    
    public class ChatHub : Hub
    {
        public async Task NewMessage(long username, string message) =>
            await Clients.All.SendAsync("messageReceived", username, message);
    }
    

    Le code précédent diffuse les messages reçus à tous les utilisateurs connectés, une fois que le serveur les reçoit. Vous n’avez pas besoin d’appeler une méthode générique on pour recevoir tous les messages. Une méthode nommée après le nom du message est suffisante.

    Dans cet exemple, le client TypeScript envoie un message identifié comme newMessage. La méthode C# NewMessage attend les données envoyées par le client. Un appel est effectué pour SendAsync sur Clients.All. Les messages reçus sont envoyés à tous les clients connectés au hub.

  5. Ajoutez l’instruction using suivante en haut de Program.cs pour résoudre la référence ChatHub :

    using SignalRWebpack.Hubs;
    
  6. Dans Program.cs, mappez l’itinéraire /hub au hub ChatHub. Remplacez le code qui affiche Hello World! par le code suivant :

    app.MapHub<ChatHub>("/hub");
    

Configurer le client

Dans cette section, vous allez créer un projet Node.js pour convertir TypeScript en JavaScript et regrouper des ressources côté client, notamment HTML et CSS, à l’aide de Webpack.

  1. Exécutez la commande suivante dans la racine du projet pour créer un fichier package.json :

    npm init -y
    
  2. Ajoutez la propriété mise en surbrillance au fichier package.json et enregistrez les modifications apportées au fichier :

    {
      "name": "SignalRWebpack",
      "version": "1.0.0",
      "private": true,
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    La définition de la propriété private sur true empêche les avertissements d’installation de package à l’étape suivante.

  3. Installez les packages npm nécessaires. À partir de la racine du projet, exécutez la commande suivante :

    npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
    

    L’option -E désactive le comportement par défaut de npm pour écrire contrôle de version sémantique opérateurs de plage pour package.json. Par exemple, "webpack": "5.70.0" peut être utilisé à la place de "webpack": "^5.70.0". Cette option empêche les mises à niveau involontaires vers des versions de package plus récentes.

    Pour plus d’informations, consultez la documentation npm-install.

  4. Remplacez la propriété scripts du fichier package.json par le code suivant :

    "scripts": {
      "build": "webpack --mode=development --watch",
      "release": "webpack --mode=production",
      "publish": "npm run release && dotnet publish -c Release"
    },
    

    Les scripts suivants sont définis :

    • build : Regroupe les ressources côté client en mode de développement et surveille les changements de fichier. L’observateur de fichiers force la regénération du regroupement chaque fois qu’un fichier projet change. L’option mode désactive les optimisations de production, comme la minimisation de l’arborescence (tree shaking). utilisez build uniquement dans le développement.
    • release : Regroupe les ressources côté client en mode de production.
    • publish : Exécute le script release pour regrouper les ressources côté client en mode de production. La commande appelle la commande publish de CLI .NET pour publier l’application.
  5. Créez un fichier nommé webpack.config.js à la racine du projet avec le code suivant :

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    module.exports = {
      entry: "./src/index.ts",
      output: {
        path: path.resolve(__dirname, "wwwroot"),
        filename: "[name].[chunkhash].js",
        publicPath: "/",
      },
      resolve: {
        extensions: [".js", ".ts"],
      },
      module: {
        rules: [
          {
            test: /\.ts$/,
            use: "ts-loader",
          },
          {
            test: /\.css$/,
            use: [MiniCssExtractPlugin.loader, "css-loader"],
          },
        ],
      },
      plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
          template: "./src/index.html",
        }),
        new MiniCssExtractPlugin({
          filename: "css/[name].[chunkhash].css",
        }),
      ],
    };
    

    Le fichier précédent configure le processus de compilation Webpack :

    • La propriété output remplace la valeur par défaut de dist. Le regroupement est émis dans le répertoire wwwroot à la place.
    • Le tableau resolve.extensions inclut .js pour importer le code JavaScript du client SignalR.
  6. Copiez le répertoire src et son contenu de l'exemple de projet vers la racine du projet. Le répertoire src contient les fichiers suivants :

    • index.html, qui définit le balisage réutilisable de la page d’accueil :

      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="utf-8" />
          <title>ASP.NET Core SignalR with TypeScript and Webpack</title>
        </head>
        <body>
          <div id="divMessages" class="messages"></div>
          <div class="input-zone">
            <label id="lblMessage" for="tbMessage">Message:</label>
            <input id="tbMessage" class="input-zone-input" type="text" />
            <button id="btnSend">Send</button>
          </div>
        </body>
      </html>
      
    • css/main.css, qui fournit des styles CSS pour la page d’accueil :

      *,
      *::before,
      *::after {
        box-sizing: border-box;
      }
      
      html,
      body {
        margin: 0;
        padding: 0;
      }
      
      .input-zone {
        align-items: center;
        display: flex;
        flex-direction: row;
        margin: 10px;
      }
      
      .input-zone-input {
        flex: 1;
        margin-right: 10px;
      }
      
      .message-author {
        font-weight: bold;
      }
      
      .messages {
        border: 1px solid #000;
        margin: 10px;
        max-height: 300px;
        min-height: 300px;
        overflow-y: auto;
        padding: 5px;
      }
      
    • tsconfig.json, qui configure le compilateur TypeScript pour produire javaScript compatible 5 ECMAScript :

      {
        "compilerOptions": {
          "target": "es5"
        }
      }
      
    • index.ts:

      import * as signalR from "@microsoft/signalr";
      import "./css/main.css";
      
      const divMessages: HTMLDivElement = document.querySelector("#divMessages");
      const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
      const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
      const username = new Date().getTime();
      
      const connection = new signalR.HubConnectionBuilder()
          .withUrl("/hub")
          .build();
      
      connection.on("messageReceived", (username: string, message: string) => {
        const m = document.createElement("div");
      
        m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`;
      
        divMessages.appendChild(m);
        divMessages.scrollTop = divMessages.scrollHeight;
      });
      
      connection.start().catch((err) => document.write(err));
      
      tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
          send();
        }
      });
      
      btnSend.addEventListener("click", send);
      
      function send() {
        connection.send("newMessage", username, tbMessage.value)
          .then(() => (tbMessage.value = ""));
      }
      

    Le code précédent récupère les références aux éléments DOM et attache deux gestionnaires d’événements :

    • keyup : se déclenche lorsque l’utilisateur tape dans la zone de texte tbMessage et appelle la fonction send lorsque l’utilisateur appuie sur la touche Entrée.
    • click : se déclenche lorsque l’utilisateur sélectionne le bouton Envoyer et appelle send la fonction.

    La classe HubConnectionBuilder crée un générateur pour configurer la connexion de serveur. La fonction withUrl configure l’URL du hub.

    SignalR permet l’échange de messages entre un client et un serveur. Chaque message a un nom spécifique. Par exemple, les messages portant le nom messageReceived peuvent exécuter la logique responsable de l’affichage du nouveau message dans la zone de messages. L’écoute d’un message spécifique peut être effectuée au moyen de la fonction on. N’importe quel nombre de noms de messages peuvent être écoutés. Vous pouvez aussi passer des paramètres au message, comme le nom de l’auteur et le contenu du message reçu. Dès que le client reçoit un message, un élément div est créé avec le nom de l’auteur et le contenu du message dans son attribut innerHTML. Il est ajouté à l’élément div principal qui affiche les messages.

    L’envoi d’un message au moyen de la connexion WebSocket nécessite l’appel de la méthode send. Le premier paramètre de la méthode est le nom du message. Les données du message se trouvent dans les autres paramètres. Dans cet exemple, un message identifié comme newMessage est envoyé au serveur. Le message se compose du nom d’utilisateur et de l’entrée de l’utilisateur dans une zone de texte. Si l’envoi fonctionne, la valeur de la zone de texte est effacée.

  7. Exécutez la commande suivante à la racine du projet :

    npm i @microsoft/signalr @types/node
    

    La commande précédente active :

    • Le SignalRclient TypeScript, ce qui permet au client d’envoyer des messages au serveur.
    • Définitions de type TypeScript pour Node.js, qui permet la vérification au moment de la compilation des types Node.js.

Test de l'application

Vérifiez que l’application fonctionne avec les étapes suivantes :

  1. Exécutez Webpack en mode release. Dans la fenêtre Console du Gestionnaire de package, exécutez la commande suivante à la racine du projet. Si vous ne vous trouvez pas à la racine du projet, tapez cd SignalRWebpack avant d’entrer la commande.

    npm run release
    

    Cette commande génère les ressources côté client à délivrer pendant l’exécution de l’application. Les ressources sont placées dans le dossier wwwroot.

    Webpack a effectué les tâches suivantes :

    • Vide le contenu du répertoire wwwroot.
    • Converti le TypeScript en JavaScript dans un processus appelé transpilation.
    • Troncation du code JavaScript généré pour réduire la taille de fichier dans un processus appelé minimisation.
    • Copie des fichiers JavaScript, CSS et HTML traités à partir de src dans le répertoire wwwroot.
    • Injection des éléments suivants dans le fichier wwwroot/index.html :
      • Balise <link>, référençant le fichier wwwroot/main.<hash>.css. Cette balise est placée immédiatement avant la balise </head> de fermeture.
      • Balise <script>, référençant le fichier wwwroot/main.<hash>.js minifié. Cette balise est placée immédiatement après la balise de fermeture </title>.
  2. Sélectionnez Déboguer>Démarrer sans débogage pour lancer l’application dans un navigateur sans attacher le débogueur. Le fichier wwwroot/index.html est servi à https://localhost:<port>.

    Si vous obtenez des erreurs de compilation, essayez de fermer et de rouvrir la solution.

  3. Ouvrez une autre instance du navigateur (n’importe quel navigateur) et collez l’URL dans la barre d’adresse.

  4. Choisissez un navigateur, tapez quelque chose dans la zone de texte Message, puis cliquez sur le bouton Envoyer. Le nom unique de l’utilisateur et le message sont affichés instantanément dans les deux pages.

Message affiché dans les deux fenêtres de navigateur

Étapes suivantes

Ressources supplémentaires

Ce tutoriel montre comment utiliser Webpack dans une application web ASP.NET Core SignalR pour regrouper et générer un client écrit en TypeScript. Webpack permet aux développeurs de regrouper et générer les ressources côté client d’une application web.

Dans ce tutoriel, vous allez apprendre à :

  • Structurer une application de démarrage ASP.NET Core SignalR
  • Configurer le client TypeScript SignalR
  • Configurer un pipeline de build à l’aide de Webpack
  • Configurer le serveur SignalR
  • Activer la communication entre le client et le serveur

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Prérequis

Créer l’application web ASP.NET Core

Configurez Visual Studio pour rechercher npm dans la variable d'environnement PATH. Par défaut, Visual Studio utilise la version de npm qu’il trouve dans son répertoire d’installation. Suivez ces instructions dans Visual Studio :

  1. Lancez Visual Studio. Dans la fenêtre de démarrage, sélectionnez Continuer sans code.

  2. Accédez à Outils>Options>Projets et solutions>Gestion des packages web>Outils web externes.

  3. Sélectionnez l’entrée $(PATH) dans la liste. Sélectionnez la flèche vers le haut pour déplacer l’entrée à la deuxième position de la liste, puis sélectionnez OK.

    Configuration de Visual Studio.

La configuration de Visual Studio est terminée.

  1. Utilisez l’option de menu Fichier>Nouveau>Projet et choisissez le modèle Application web ASP.NET Core. Cliquez sur Suivant.
  2. Nommez le projet *SignalRWebPac``, puis sélectionnez Créer.
  3. Sélectionnez .NET Core dans la liste déroulante du framework cible, puis ASP.NET Core 3.1 dans la liste déroulante du sélecteur de framework. Sélectionnez le modèle Vide, puis sélectionnez Créer.

Ajoutez le package Microsoft.TypeScript.MSBuild au projet :

  1. Dans Explorateur de solutions (panneau droit), cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet. Dans l'onglet Parcourir, recherchez Microsoft.TypeScript.MSBuild, puis cliquez sur Installer à droite pour installer le package.

Visual Studio ajoute le package NuGet sous le nœud Dépendances dans Explorateur de solutions, ce qui permet la compilation TypeScript dans le projet.

Configurer Webpack et TypeScript

Les étapes suivantes configurent la conversion de TypeScript en JavaScript et le regroupement des ressources côté client.

  1. Exécutez la commande suivante dans la racine du projet pour créer un fichier package.json :

    npm init -y
    
  2. Ajoutez la propriété mise en surbrillance au fichier package.json et enregistrez les modifications apportées au fichier :

    {
      "name": "SignalRWebPack",
      "version": "1.0.0",
      "private": true,
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    La définition de la propriété private sur true empêche les avertissements d’installation de package à l’étape suivante.

  3. Installez les packages npm nécessaires. À partir de la racine du projet, exécutez la commande suivante :

    npm i -D -E clean-webpack-plugin@3.0.0 css-loader@3.4.2 html-webpack-plugin@3.2.0 mini-css-extract-plugin@0.9.0 ts-loader@6.2.1 typescript@3.7.5 webpack@4.41.5 webpack-cli@3.3.10
    

    Détails de commande à prendre en compte :

    • Un numéro de version suit le signe @ pour chaque nom de package. npm installe ces versions de package spécifiques.
    • L’option -E désactive le comportement par défaut de npm consistant à écrire des opérateurs de plage de gestion sémantique des versions dans packagejson. Par exemple, "webpack": "4.41.5" peut être utilisé à la place de "webpack": "^4.41.5". Cette option empêche les mises à niveau involontaires vers des versions de package plus récentes.

    Consultez la documentation npm-install pour plus de détails.

  4. Remplacez la propriété scripts du fichier package.json par le code suivant :

    "scripts": {
      "build": "webpack --mode=development --watch",
      "release": "webpack --mode=production",
      "publish": "npm run release && dotnet publish -c Release"
    },
    

    Explication des scripts :

    • build : Regroupe les ressources côté client en mode de développement et surveille les changements de fichier. L’observateur de fichiers force la regénération du regroupement chaque fois qu’un fichier projet change. L’option mode désactive les optimisations de production, comme la minimisation de l’arborescence (tree shaking). Utilisez uniquement build dans le développement.
    • release : Regroupe les ressources côté client en mode de production.
    • publish : Exécute le script release pour regrouper les ressources côté client en mode de production. La commande appelle la commande publish de CLI .NET Core pour publier l’application.
  5. Créez un fichier nommé webpack.config.js à la racine du projet avec le code suivant :

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    module.exports = {
        entry: "./src/index.ts",
        output: {
            path: path.resolve(__dirname, "wwwroot"),
            filename: "[name].[chunkhash].js",
            publicPath: "/"
        },
        resolve: {
            extensions: [".js", ".ts"]
        },
        module: {
            rules: [
                {
                    test: /\.ts$/,
                    use: "ts-loader"
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader, "css-loader"]
                }
            ]
        },
        plugins: [
            new CleanWebpackPlugin(),
            new HtmlWebpackPlugin({
                template: "./src/index.html"
            }),
            new MiniCssExtractPlugin({
                filename: "css/[name].[chunkhash].css"
            })
        ]
    };
    

    Le fichier précédent configure la compilation Webpack. Détails de configuration à prendre en compte :

    • La propriété output remplace la valeur par défaut de dist. Le regroupement est émis dans le répertoire wwwroot à la place.
    • Le tableau resolve.extensions inclut .js pour importer le code JavaScript du client SignalR.
  6. Créez un répertoire src à la racine du projet pour stocker les ressources côté client du projet.

  7. Créez src/index.html avec le balisage suivant.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>ASP.NET Core SignalR</title>
    </head>
    <body>
        <div id="divMessages" class="messages">
        </div>
        <div class="input-zone">
            <label id="lblMessage" for="tbMessage">Message:</label>
            <input id="tbMessage" class="input-zone-input" type="text" />
            <button id="btnSend">Send</button>
        </div>
    </body>
    </html>
    

    Le code HTML précédent définit le balisage réutilisable de la page d’accueil.

  8. Créez un répertoire src/css. Son objectif est de stocker les fichiers .css du projet.

  9. Créez src/css/main.css avec le CSS suivant :

    *, *::before, *::after {
        box-sizing: border-box;
    }
    
    html, body {
        margin: 0;
        padding: 0;
    }
    
    .input-zone {
        align-items: center;
        display: flex;
        flex-direction: row;
        margin: 10px;
    }
    
    .input-zone-input {
        flex: 1;
        margin-right: 10px;
    }
    
    .message-author {
        font-weight: bold;
    }
    
    .messages {
        border: 1px solid #000;
        margin: 10px;
        max-height: 300px;
        min-height: 300px;
        overflow-y: auto;
        padding: 5px;
    }
    

    Le fichier main.css précédent définit le style de l’application.

  10. Créez src/tsconfig.json avec le JSON suivant :

    {
      "compilerOptions": {
        "target": "es5"
      }
    }
    

    Le code précédent configure le compilateur TypeScript pour produire du code JavaScript compatible ECMAScript 5.

  11. Créez src/index.ts avec le code suivant :

    import "./css/main.css";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
    }
    

    Le code TypeScript précédent récupère les références aux éléments DOM et joint deux gestionnaires d’événements :

    • keyup : Cet événement se déclenche quand l’utilisateur tape des données dans la zone de texte tbMessage. La fonction send est appelée quand l’utilisateur appuie sur la touche Entrée.
    • click : Cet événement se déclenche quand l’utilisateur clique sur le bouton Envoyer. La fonction send est appelée.

Configurer l’application

  1. Dans Startup.Configure, ajoutez des appels à UseDefaultFiles(IApplicationBuilder) et UseStaticFiles(IApplicationBuilder).

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        
        app.UseRouting();
        app.UseDefaultFiles();
        app.UseStaticFiles();
        
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/hub");
        });
            
    }
    

    Le code précédent permet au serveur de localiser et de servir le fichier index.html. Le fichier est servi si l’utilisateur entre son URL complète ou l’URL racine de l’application web.

  2. À la fin de Startup.Configure, mappez un itinéraire /hub au ChatHub hub. Remplacez le code qui affiche Hello World! par la ligne suivante :

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/hub");
    });
    
  3. Dans Startup.ConfigureServices, appelez AddSignalR.

    services.AddSignalR();
    
  4. Créez un répertoire nommé Hubs dans la racine du projet SignalRWebPack/ pour stocker le hub SignalR.

  5. Créez un hub Hubs/ChatHub.cs avec le code suivant :

    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRWebPack.Hubs
    {
        public class ChatHub : Hub
        {
        }
    }
    
  6. Ajoutez l’instruction using suivante en haut du fichier Startup.cs pour résoudre la référence ChatHub :

    using SignalRWebPack.Hubs;
    

Activer la communication entre le client et le serveur

L’application affiche actuellement un formulaire de base pour envoyer des messages, mais n’est pas encore fonctionnelle. Le serveur écoute une route spécifique, mais ne fait rien avec les messages envoyés.

  1. Exécutez la commande suivante à la racine du projet :

    npm i @microsoft/signalr @types/node
    

    La commande précédente active :

    • Le SignalRclient TypeScript, ce qui permet au client d’envoyer des messages au serveur.
    • Définitions de type TypeScript pour Node.js, qui permet la vérification au moment de la compilation des types Node.js.
  2. Ajoutez le code mis en surbrillance au fichier src/index.ts :

    import "./css/main.css";
    import * as signalR from "@microsoft/signalr";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();
    
    connection.on("messageReceived", (username: string, message: string) => {
        let m = document.createElement("div");
    
        m.innerHTML =
            `<div class="message-author">${username}</div><div>${message}</div>`;
    
        divMessages.appendChild(m);
        divMessages.scrollTop = divMessages.scrollHeight;
    });
    
    connection.start().catch(err => document.write(err));
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
    }
    

    Le code précédent prend en charge la réception de messages du serveur. La classe HubConnectionBuilder crée un générateur pour configurer la connexion de serveur. La fonction withUrl configure l’URL du hub.

    SignalR permet l’échange de messages entre un client et un serveur. Chaque message a un nom spécifique. Par exemple, les messages portant le nom messageReceived peuvent exécuter la logique responsable de l’affichage du nouveau message dans la zone de messages. L’écoute d’un message spécifique peut être effectuée au moyen de la fonction on. N’importe quel nombre de noms de messages peuvent être écoutés. Vous pouvez aussi passer des paramètres au message, comme le nom de l’auteur et le contenu du message reçu. Dès que le client reçoit un message, un élément div est créé avec le nom de l’auteur et le contenu du message dans son attribut innerHTML. Il est ajouté à l’élément div principal qui affiche les messages.

  3. Maintenant que le client peut recevoir un message, configurez-le pour en envoyer. Ajoutez le code mis en surbrillance au fichier src/index.ts :

    import "./css/main.css";
    import * as signalR from "@microsoft/signalr";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();
    
    connection.on("messageReceived", (username: string, message: string) => {
        let messages = document.createElement("div");
    
        messages.innerHTML =
            `<div class="message-author">${username}</div><div>${message}</div>`;
    
        divMessages.appendChild(messages);
        divMessages.scrollTop = divMessages.scrollHeight;
    });
    
    connection.start().catch(err => document.write(err));
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.key === "Enter") {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
        connection.send("newMessage", username, tbMessage.value)
            .then(() => tbMessage.value = "");
    }
    

    L’envoi d’un message au moyen de la connexion WebSocket nécessite l’appel de la méthode send. Le premier paramètre de la méthode est le nom du message. Les données du message se trouvent dans les autres paramètres. Dans cet exemple, un message identifié comme newMessage est envoyé au serveur. Le message se compose du nom d’utilisateur et de l’entrée de l’utilisateur dans une zone de texte. Si l’envoi fonctionne, la valeur de la zone de texte est effacée.

  4. Ajoutez la méthode NewMessage à la classe ChatHub :

    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRWebPack.Hubs
    {
        public class ChatHub : Hub
        {
            public async Task NewMessage(long username, string message)
            {
                await Clients.All.SendAsync("messageReceived", username, message);
            }
        }
    }
    

    Le code précédent diffuse les messages reçus à tous les utilisateurs connectés, une fois que le serveur les reçoit. Vous n’avez pas besoin d’appeler une méthode générique on pour recevoir tous les messages. Il vous suffit d’avoir une méthode du même nom que le message.

    Dans cet exemple, le client TypeScript envoie un message identifié comme newMessage. La méthode C# NewMessage attend les données envoyées par le client. Un appel est effectué pour SendAsync sur Clients.All. Les messages reçus sont envoyés à tous les clients connectés au hub.

Test de l'application

Vérifiez que l’application fonctionne avec les étapes suivantes.

  1. Exécuter Webpack en mode de mise en production. Dans la fenêtre Console du Gestionnaire de package, exécutez la commande suivante à la racine du projet. Si vous ne vous trouvez pas à la racine du projet, tapez cd SignalRWebPack avant d’entrer la commande.

    npm run release
    

    Cette commande génère les ressources côté client à délivrer pendant l’exécution de l’application. Les ressources sont placées dans le dossier wwwroot.

    Webpack a effectué les tâches suivantes :

    • Vide le contenu du répertoire wwwroot.
    • Converti le TypeScript en JavaScript dans un processus appelé transpilation.
    • Troncation du code JavaScript généré pour réduire la taille de fichier dans un processus appelé minimisation.
    • Copie des fichiers JavaScript, CSS et HTML traités à partir de src dans le répertoire wwwroot.
    • Injection des éléments suivants dans le fichier wwwroot/index.html :
      • Balise <link>, référençant le fichier wwwroot/main.<hash>.css. Cette balise est placée immédiatement avant la balise </head> de fermeture.
      • Balise <script>, référençant le fichier wwwroot/main.<hash>.js minifié. Cette balise est placée immédiatement après la balise de fermeture </title>.
  2. Sélectionnez Déboguer>Démarrer sans débogage pour lancer l’application dans un navigateur sans attacher le débogueur. Le fichier wwwroot/index.html est servi à http://localhost:<port_number>.

    Si vous obtenez des erreurs de compilation, essayez de fermer et de rouvrir la solution.

  3. Ouvrez une autre instance de navigateur (n’importe quel navigateur). Copiez l’URL de la barre d’adresse.

  4. Choisissez un navigateur, tapez quelque chose dans la zone de texte Message, puis cliquez sur le bouton Envoyer. Le nom unique de l’utilisateur et le message sont affichés instantanément dans les deux pages.

Message affiché dans les deux fenêtres de navigateur

Ressources supplémentaires

Ce tutoriel montre comment utiliser Webpack dans une application web ASP.NET Core SignalR pour regrouper et générer un client écrit en TypeScript. Webpack permet aux développeurs de regrouper et générer les ressources côté client d’une application web.

Dans ce tutoriel, vous allez apprendre à :

  • Structurer une application de démarrage ASP.NET Core SignalR
  • Configurer le client TypeScript SignalR
  • Configurer un pipeline de build à l’aide de Webpack
  • Configurer le serveur SignalR
  • Activer la communication entre le client et le serveur

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Prérequis

Créer l’application web ASP.NET Core

Configurez Visual Studio pour rechercher npm dans la variable d'environnement PATH. Par défaut, Visual Studio utilise la version de npm qu’il trouve dans son répertoire d’installation. Suivez ces instructions dans Visual Studio :

  1. Accédez à Outils>Options>Projets et solutions>Gestion des packages web>Outils web externes.

  2. Sélectionnez l’entrée $(PATH) dans la liste. Sélectionnez la flèche vers le haut pour déplacer l’entrée à la deuxième position de la liste.

    Configuration de Visual Studio

La configuration de Visual Studio est terminée. Nous allons maintenant créer le projet.

  1. Utilisez l’option de menu Fichier>Nouveau>Projet et choisissez le modèle Application web ASP.NET Core.
  2. Nommez le projet *SignalRWebPack`, puis sélectionnez Créer.
  3. Sélectionnez .NET Core dans la liste déroulante du framework cible, puis ASP.NET Core 2.2 dans la liste déroulante du sélecteur de framework. Sélectionnez le modèle Vide, puis sélectionnez Créer.

Configurer Webpack et TypeScript

Les étapes suivantes configurent la conversion de TypeScript en JavaScript et le regroupement des ressources côté client.

  1. Exécutez la commande suivante dans la racine du projet pour créer un fichier package.json :

    npm init -y
    
  2. Ajoutez la propriété en surbrillance au fichier package.json :

    {
      "name": "SignalRWebPack",
      "version": "1.0.0",
      "private": true,
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    La définition de la propriété private sur true empêche les avertissements d’installation de package à l’étape suivante.

  3. Installez les packages npm nécessaires. À partir de la racine du projet, exécutez la commande suivante :

    npm install -D -E clean-webpack-plugin@1.0.1 css-loader@2.1.0 html-webpack-plugin@4.0.0-beta.5 mini-css-extract-plugin@0.5.0 ts-loader@5.3.3 typescript@3.3.3 webpack@4.29.3 webpack-cli@3.2.3
    

    Détails de commande à prendre en compte :

    • Un numéro de version suit le signe @ pour chaque nom de package. npm installe ces versions de package spécifiques.
    • L’option -E désactive le comportement par défaut de npm consistant à écrire des opérateurs de plage de gestion sémantique des versions dans packagejson. Par exemple, "webpack": "4.29.3" peut être utilisé à la place de "webpack": "^4.29.3". Cette option empêche les mises à niveau involontaires vers des versions de package plus récentes.

    Consultez la documentation npm-install pour plus de détails.

  4. Remplacez la propriété scripts du fichier package.json par le code suivant :

    "scripts": {
      "build": "webpack --mode=development --watch",
      "release": "webpack --mode=production",
      "publish": "npm run release && dotnet publish -c Release"
    },
    

    Explication des scripts :

    • build : Regroupe les ressources côté client en mode de développement et surveille les changements de fichier. L’observateur de fichiers force la regénération du regroupement chaque fois qu’un fichier projet change. L’option mode désactive les optimisations de production, comme la minimisation de l’arborescence (tree shaking). Utilisez uniquement build dans le développement.
    • release : Regroupe les ressources côté client en mode de production.
    • publish : Exécute le script release pour regrouper les ressources côté client en mode de production. La commande appelle la commande publish de CLI .NET Core pour publier l’application.
  5. Créez un fichier nommé *webpack.config.js à la racine du projet avec le code suivant :

    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const CleanWebpackPlugin = require("clean-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    module.exports = {
        entry: "./src/index.ts",
        output: {
            path: path.resolve(__dirname, "wwwroot"),
            filename: "[name].[chunkhash].js",
            publicPath: "/"
        },
        resolve: {
            extensions: [".js", ".ts"]
        },
        module: {
            rules: [
                {
                    test: /\.ts$/,
                    use: "ts-loader"
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader, "css-loader"]
                }
            ]
        },
        plugins: [
            new CleanWebpackPlugin(["wwwroot/*"]),
            new HtmlWebpackPlugin({
                template: "./src/index.html"
            }),
            new MiniCssExtractPlugin({
                filename: "css/[name].[chunkhash].css"
            })
        ]
    };
    

    Le fichier précédent configure la compilation Webpack. Détails de configuration à prendre en compte :

    • La propriété output remplace la valeur par défaut de dist. Le regroupement est émis dans le répertoire wwwroot à la place.
    • Le tableau resolve.extensions inclut .js pour importer le code JavaScript du client SignalR.
  6. Créez un répertoire src à la racine du projet pour stocker les ressources côté client du projet.

  7. Créez src/index.html avec le balisage suivant.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>ASP.NET Core SignalR</title>
    </head>
    <body>
        <div id="divMessages" class="messages">
        </div>
        <div class="input-zone">
            <label id="lblMessage" for="tbMessage">Message:</label>
            <input id="tbMessage" class="input-zone-input" type="text" />
            <button id="btnSend">Send</button>
        </div>
    </body>
    </html>
    

    Le code HTML précédent définit le balisage réutilisable de la page d’accueil.

  8. Créez un répertoire src/css. Son objectif est de stocker les fichiers .css du projet.

  9. Créez src/css/main.css avec le balisage suivant :

    *, *::before, *::after {
        box-sizing: border-box;
    }
    
    html, body {
        margin: 0;
        padding: 0;
    }
    
    .input-zone {
        align-items: center;
        display: flex;
        flex-direction: row;
        margin: 10px;
    }
    
    .input-zone-input {
        flex: 1;
        margin-right: 10px;
    }
    
    .message-author {
        font-weight: bold;
    }
    
    .messages {
        border: 1px solid #000;
        margin: 10px;
        max-height: 300px;
        min-height: 300px;
        overflow-y: auto;
        padding: 5px;
    }
    

    Le fichier main.css précédent définit le style de l’application.

  10. Créez src/tsconfig.json avec le JSON suivant :

    {
      "compilerOptions": {
        "target": "es5"
      }
    }
    

    Le code précédent configure le compilateur TypeScript pour produire du code JavaScript compatible ECMAScript 5.

  11. Créez src/index.ts avec le code suivant :

    import "./css/main.css";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.keyCode === 13) {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
    }
    

    Le code TypeScript précédent récupère les références aux éléments DOM et joint deux gestionnaires d’événements :

    • keyup : Cet événement se déclenche quand l’utilisateur tape des données dans la zone de texte tbMessage. La fonction send est appelée quand l’utilisateur appuie sur la touche Entrée.
    • click : Cet événement se déclenche quand l’utilisateur clique sur le bouton Envoyer. La fonction send est appelée.

Configurer l’application ASP.NET Core

  1. Le code fourni dans la méthode Startup.Configure affiche Hello World!. Remplacez l’appel de méthode app.Run par des appels à UseDefaultFiles(IApplicationBuilder) et UseStaticFiles(IApplicationBuilder).

    app.UseDefaultFiles();
    app.UseStaticFiles();
    

    Le code précédent permet au serveur de localiser et traiter le fichier index.html, que l’utilisateur entre son URL complète ou l’URL racine de l’application web.

  2. Appelez AddSignalR dans Startup.ConfigureServices. Il ajoute les services SignalR au projet.

    services.AddSignalR();
    
  3. Mappez une route /hub au hub ChatHub. Ajoutez les lignes suivantes à la fin de Startup.Configure :

    app.UseSignalR(options =>
    {
        options.MapHub<ChatHub>("/hub");
    });
    
  4. Créez un répertoire Hubs à la racine du projet. Son objectif est de stocker le hub SignalR, qui est créé à l’étape suivante.

  5. Créez un hub Hubs/ChatHub.cs avec le code suivant :

    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRWebPack.Hubs
    {
        public class ChatHub : Hub
        {
        }
    }
    
  6. Ajoutez le code suivant en haut du fichier Startup.cs pour résoudre la référence de ChatHub :

    using SignalRWebPack.Hubs;
    

Activer la communication entre le client et le serveur

Actuellement, l’application affiche un formulaire simple pour envoyer des messages. Rien ne se produit quand vous essayez de le faire. Le serveur écoute une route spécifique, mais ne fait rien avec les messages envoyés.

  1. Exécutez la commande suivante à la racine du projet :

    npm install @aspnet/signalr
    

    La commande précédente installe le client TypeScriptSignalR, ce qui permet au client d’envoyer des messages au serveur.

  2. Ajoutez le code mis en surbrillance au fichier src/index.ts :

    import "./css/main.css";
    import * as signalR from "@aspnet/signalr";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();
    
    connection.on("messageReceived", (username: string, message: string) => {
        let m = document.createElement("div");
    
        m.innerHTML =
            `<div class="message-author">${username}</div><div>${message}</div>`;
    
        divMessages.appendChild(m);
        divMessages.scrollTop = divMessages.scrollHeight;
    });
    
    connection.start().catch(err => document.write(err));
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.keyCode === 13) {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
    }
    

    Le code précédent prend en charge la réception de messages du serveur. La classe HubConnectionBuilder crée un générateur pour configurer la connexion de serveur. La fonction withUrl configure l’URL du hub.

    SignalR permet l’échange de messages entre un client et un serveur. Chaque message a un nom spécifique. Par exemple, les messages portant le nom messageReceived peuvent exécuter la logique responsable de l’affichage du nouveau message dans la zone de messages. L’écoute d’un message spécifique peut être effectuée au moyen de la fonction on. Vous pouvez écouter n’importe quel nombre de noms de message. Vous pouvez aussi passer des paramètres au message, comme le nom de l’auteur et le contenu du message reçu. Dès que le client reçoit un message, un élément div est créé avec le nom de l’auteur et le contenu du message dans son attribut innerHTML. Le nouveau message est ajouté à l’élément principal div affichant les messages.

  3. Maintenant que le client peut recevoir un message, configurez-le pour en envoyer. Ajoutez le code mis en surbrillance au fichier src/index.ts :

    import "./css/main.css";
    import * as signalR from "@aspnet/signalr";
    
    const divMessages: HTMLDivElement = document.querySelector("#divMessages");
    const tbMessage: HTMLInputElement = document.querySelector("#tbMessage");
    const btnSend: HTMLButtonElement = document.querySelector("#btnSend");
    const username = new Date().getTime();
    
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();
    
    connection.on("messageReceived", (username: string, message: string) => {
        let messageContainer = document.createElement("div");
    
        messageContainer.innerHTML =
            `<div class="message-author">${username}</div><div>${message}</div>`;
    
        divMessages.appendChild(messageContainer);
        divMessages.scrollTop = divMessages.scrollHeight;
    });
    
    connection.start().catch(err => document.write(err));
    
    tbMessage.addEventListener("keyup", (e: KeyboardEvent) => {
        if (e.keyCode === 13) {
            send();
        }
    });
    
    btnSend.addEventListener("click", send);
    
    function send() {
        connection.send("newMessage", username, tbMessage.value)
                  .then(() => tbMessage.value = "");
    }
    

    L’envoi d’un message au moyen de la connexion WebSocket nécessite l’appel de la méthode send. Le premier paramètre de la méthode est le nom du message. Les données du message se trouvent dans les autres paramètres. Dans cet exemple, un message identifié comme newMessage est envoyé au serveur. Le message se compose du nom d’utilisateur et de l’entrée de l’utilisateur dans une zone de texte. Si l’envoi fonctionne, la valeur de la zone de texte est effacée.

  4. Ajoutez la méthode NewMessage à la classe ChatHub :

    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRWebPack.Hubs
    {
        public class ChatHub : Hub
        {
            public async Task NewMessage(long username, string message)
            {
                await Clients.All.SendAsync("messageReceived", username, message);
            }
        }
    }
    

    Le code précédent diffuse les messages reçus à tous les utilisateurs connectés, une fois que le serveur les reçoit. Vous n’avez pas besoin d’appeler une méthode générique on pour recevoir tous les messages. Il vous suffit d’avoir une méthode du même nom que le message.

    Dans cet exemple, le client TypeScript envoie un message identifié comme newMessage. La méthode C# NewMessage attend les données envoyées par le client. Un appel est effectué pour SendAsync sur Clients.All. Les messages reçus sont envoyés à tous les clients connectés au hub.

Test de l'application

Vérifiez que l’application fonctionne avec les étapes suivantes.

  1. Exécuter Webpack en mode de mise en production. Dans la fenêtre Console du Gestionnaire de package, exécutez la commande suivante à la racine du projet. Si vous ne vous trouvez pas à la racine du projet, tapez cd SignalRWebPack avant d’entrer la commande.

    npm run release
    

    Cette commande génère les ressources côté client à délivrer pendant l’exécution de l’application. Les ressources sont placées dans le dossier wwwroot.

    Webpack a effectué les tâches suivantes :

    • Vide le contenu du répertoire wwwroot.
    • Converti le TypeScript en JavaScript dans un processus appelé transpilation.
    • Troncation du code JavaScript généré pour réduire la taille de fichier dans un processus appelé minimisation.
    • Copie des fichiers JavaScript, CSS et HTML traités à partir de src dans le répertoire wwwroot.
    • Injection des éléments suivants dans le fichier wwwroot/index.html :
      • Balise <link>, référençant le fichier wwwroot/main.<hash>.css. Cette balise est placée immédiatement avant la balise </head> de fermeture.
      • Balise <script>, référençant le fichier wwwroot/main.<hash>.js minifié. Cette balise est placée immédiatement après la balise de fermeture </title>.
  2. Sélectionnez Déboguer>Démarrer sans débogage pour lancer l’application dans un navigateur sans attacher le débogueur. Le fichier wwwroot/index.html est servi à http://localhost:<port_number>.

  3. Ouvrez une autre instance de navigateur (n’importe quel navigateur). Copiez l’URL de la barre d’adresse.

  4. Choisissez un navigateur, tapez quelque chose dans la zone de texte Message, puis cliquez sur le bouton Envoyer. Le nom unique de l’utilisateur et le message sont affichés instantanément dans les deux pages.

Message affiché dans les deux fenêtres de navigateur

Ressources supplémentaires