Fermer

décembre 9, 2021

Angulaire sur le bureau


Les développeurs ont la possibilité d'apporter la bonté angulaire aux applications de bureau.

Parlons Angular—l'une des plates-formes de développement d'applications Web modernes les plus populaires. Avec une longue histoire, des outils matures et un écosystème de développeurs riche, il n'est pas difficile de comprendre pourquoi Angular est le framework SPA de choix pour la création d'applications Web/mobiles modernes.

Cependant, comment Angular fonctionne-t-il pour les applications de bureau ? La réponse logicielle classique s'applique, cela dépend. Il existe des stratégies de partage de code avec le Web, mais cela dépend également beaucoup du type d'application en cours de création et des intégrations de bureau souhaitées.

Les PWA et Electron.JS sont des moyens établis d'apporter du code Web aux applications de bureau, et ce sont tous les deux bonnes options pour Angular. Pour les développeurs .NET, .NET MAUI est la plate-forme de nouvelle génération pour la création d'applications multiplateformes natives pour mobile et ordinateur de bureau. Et avec les applications hybrides Blazor, le code Blazor pour les applications Web est le bienvenu dans .NET MAUI pour mobile/bureau. applications avec JS sur le front-end – l'un de ces investissements peut-il être transféré à .NET MAUI ? Parlons d'Angular, mais les moyens d'activer les applications de bureau avec les technologies Web devraient être à peu près les mêmes quel que soit le framework JS, donc React, Vue et d'autres devraient également se sentir les bienvenus.

Bonté angulaire sur le bureau, faisons-le. Cet article a été écrit et publié dans le cadre de l'2021 C# Advent.

Commencer correctement

Si vous êtes nouveau dans le monde Angular, l'un des meilleurs moyens de commencer est le CLI angulaire. Les conditions préalables à la construction avec Angular sont une version LTS Node.js pour le runtime et npm pour les dépendances. Il est facile d'installer globalement l'outil Angular CLI, comme ceci :

npm install -g @angular/cli

Nous pouvons ensuite lancer une nouvelle application Angular. Le modèle vous guide à travers quelques paramètres avant de créer le projet.

L'outil Angular CLI installe les packages npm angulaires nécessaires et d'autres dépendances. Une fois cela fait, nous pouvons naviguer à l'intérieur du projet et voir tout le code/les configurations.

AngularProject Angular CLI > src > test.ts" title="AngularProject"/></p data-recalc-dims=

Prêt à exécuter votre application Angular localement ? La commande Serve compile l'application en mémoire, se lance le serveur et surveille les fichiers locaux pour déployer les composants modifiés de l'application.

AngularCLI" title="AngularCLI" data-openoriginalimageonclick="true"/></a data-recalc-dims=

Voilà. C'est comme ça qu'il est facile de commencer à créer des applications Web modernes avec Angular. Et pendant que vous commencez, cela peut valoir la peine d'obtenir des munitions d'interface utilisateur pour offrir une bonne expérience utilisateur et de bonnes performances : Kendo UI for Angular peut vous aider.

KUIAngular" title="KUIAngular"/></p data-recalc-dims=

Kendo UI for Angular fournit des composants pour répondre aux exigences des applications en matière de gestion des données, de performances, d'UX, de conception, d'accessibilité et bien plus encore : plus de 100 composants entièrement natifs pour créer une interface utilisateur angulaire moderne de haute qualité en un rien de temps.

KUIComponents" title="KUIComponents"/></p data-recalc-dims=

Maintenant que nous avons une application Web Angular de base en cours d'exécution, parlons des options pour obtenir cette qualité angulaire sur les applications de bureau.

Angular as PWA[19659008]L'un des moyens les plus simples pour qu'une application Web fonctionne sur un ordinateur de bureau est PWA : les applications Web peuvent devenir progressivement de meilleurs citoyens sur les plates-formes mobiles/de bureau. fonctionnalités : être installable sur le bureau et demander aux techniciens d'assistance d'apporter une assistance hors ligne, des notifications push, un accès au matériel, etc. quelques éléments dans une application Angular existante : un nouveau fichier manifeste est déposé et indique au navigateur comment l'application doit se comporter lorsqu'elle est installée par l'utilisateur. L'ensemble de démarrage contient une variété d'icônes d'application à épingler sur l'écran d'accueil, la barre tactile et plus encore – les icônes par défaut sont ajoutées à un répertoire Assets.[19659022]{
"nom": "angularpwa",
"short_name": "angularpwa",
"theme_color": "#1976d2",
"background_color": "#fafafa",
"afficher": "autonome",
"portée": "./",
"start_url": "./",
"icônes": [
{
« src »: « assets/icons/icon-72×72.png »,
« sizes »: « 72×72 »,
« type »: « image/png »,
« purpose »: « maskable any »
},
{
« src »: « assets/icons/icon-96×96.png »,
« sizes »: « 96×96 »,
« type »: « image/png »,
« purpose »: « maskable any »
},


]
}

La page de démarrage index.html contient désormais une référence au nouveau fichier manifeste Web.




  
  Angularpwa
  
  
  
  
  


  
  

Un agent de service de mise en cache par défaut est également déposé, avec le fichier de configuration à savoir ngsw-config.json—cela indique quels types d'actifs peuvent être mis en cache.

{
  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
  "index": "/index.html",
  "assetGroups" : [
    {
      "name": "app",
      "installMode": "prefetch",
      "resources": {
        "files": [
          "/favicon.ico",
          "/index.html",
          "/manifest.webmanifest",
          "/*.css",
          "/*.js"
        ]
      }
    },
    {
      "nom": "actifs",
      "installMode": "paresseux",
      "updateMode": "prélecture",
      "Ressources": {
        "fichiers": [
          "/assets/**",
          "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"
        ]
      }
    }
  ]
}

Le fichier de configuration ServiceWorker doit être référencé dans le fichier angular.json—le ngswConfigPath relie le ServiceWorker, permettant la configuration de la production dans les schémas de construction.

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version 1,
  "newProjectRoot": "projets",
  "projets": {
    "angularpwa": {
      "projectType": "application",
      "schémas": {
        "@schematics/angular:application": {
          "strict": vrai
        }
      },
      "racine": "",
      "sourceRoot": "src",
      "préfixe": "application",
      "architecte": {
        "construire": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/angularpwa",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "actifs": [
              "src/favicon.ico",
              "src/assets",
              "src/manifest.webmanifest"
            ],
            "styles": [
              "src/styles.css"
            ],
            "scénarios": [],
            "serviceWorker": vrai,
            "ngswConfigPath": "ngsw-config.json"
          },
          "configurations": {
            "production": {
              « budgets » : [
                {
                  "type": "initial",
                  "maximumWarning": "500kb",
                  "maximumError": "1mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "2kb",
                  "maximumError": "4kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "outputHashing": "all",
              "serviceWorker": vrai,
              "ngswConfigPath": "ngsw-config.json"
            },
            ...
            ...
          }
        }
      }
    }
  }
}

Et enfin, le app.module.ts importe désormais dans ServiceWorkerModule et enregistre le ServiceWorker.

import { NgModule } de '@angular/core' ;
importer { BrowserModule } depuis '@angular/platform-browser' ;

importer { AppRoutingModule } de './app-routing.module';
importer { AppComponent } de './app.component' ;
importer { ServiceWorkerModule } de '@angular/service-worker' ;
importer { environnement } de '../environments/environment' ;

@NgModule({
  déclarations : [
    AppComponent
  ],
  importations : [
    BrowserModule,
    AppRoutingModule,
    ServiceWorkerModule.register('ngsw-worker.js', {
      enabled: environment.production,
      registrationStrategy: 'registerWhenStable:30000'
    })
  ],
  fournisseurs : [],
  bootstrap : [AppComponent]
})
export class AppModule { }

C'est un aperçu de toutes les pièces en mouvement qui commencent à transformer une application angulaire régulière en une PWA. Cependant, nous ne pouvons pas simplement exécuter l'application avec la commande Angular Serve – les techniciens de maintenance ne fonctionnent pas avec les compilations en mémoire. Nous avons besoin d'une version de production, comme ceci :

Une fois la construction terminée avec la configuration de production, nous pouvons voir les artefacts dans le répertoire de distribution – tout est compilé en HTML/JS/CSS déployable.

 PWABuild" title ="PWABuild"/></p data-recalc-dims=

Ensuite, nous avons besoin d'un petit serveur HTTP pour exposer les fichiers construits au navigateur en tant qu'application et lancer les choses.

 npm i -g http-server
http-server -p 8080 -c-1

Excellent—nous pouvons accéder à l'adresse IP du serveur HTTP local et voir notre PWA en action ! Notez l'option d'installation qui indique que l'utilisateur peut installer et exécuter cette application sur le bureau sans le navigateur Chrome.

AngularPWA" title="AngularPWA"/></p data-recalc-dims=

Si nous ouvrons les outils de développement sur notre navigateur, nous pouvons également voir le Service Worker de mise en cache par défaut enregistré et en cours d'exécution. Ce n'est que le début : les développeurs peuvent maintenant commencer à ajouter toutes les personnalisations pour créer une belle PWA moderne avec Angular.

ServiceWorker" title="ServiceWorker"/><p data-recalc-dims= 

Angular dans Electron

Un autre concurrent sérieux pour amener les applications Angular sur le bureau est Electron—la méthode open source populaire et éprouvée pour héberger des applications Web sur le bureau.

Electron aide à créer des applications de bureau multiplateformes robustes qui sont essentiellement HTML/CSS/JS, mais avec de fortes intégrations avec le système d'exploitation hôte lors de l'exécution en tant qu'application de bureau. Electron contient deux éléments pour fournir un environnement d'exécution et un canevas de rendu cohérents : Node.js et le moteur Chromium.

À partir d'une application CLI Angular standard, il n'est pas difficile d'ajouter la prise en charge Electron. dev dependance.

npm install electron@latest --save-dev

Maintenant, pour configurer toutes les choses Electron dans un projet Angular, ajoutons un simple fichier App.js. Pour démarrer Electron afin qu'il s'exécute sur le bureau, nous devons essentiellement ouvrir une nouvelle fenêtre de navigateur avec des dimensions spécifiées et charger l'URL de notre application Angular. Nous avons également besoin d'écouteurs pour l'ouverture/la fermeture des fenêtres de l'application. Voici le code :

const {
    application,
    Fenêtre du navigateur
    } = require('électron')
  const url = require("url");
  const chemin = require("chemin");

  laisser appWindow

  function initWindow() {
    appWindow = new BrowserWindow({
      largeur: 1000,
      hauteur : 800,
      Préférences Web : {
        nodeIntegration : vrai
      }
    })

    appWindow.loadURL(
      url.format({
        chemin d'accès : chemin.join(__dirname, `/dist/index.html`),
        protocole : "fichier : ",
        barres obliques : vrai
      })
    );

    appWindow.on('fermé', fonction () {
      appWindow = null
    })
  }

  app.on('prêt', initWindow)

  app.on('fenêtre-tout-fermé', fonction () {
    if (process.platform !== 'darwin') {
      app.quit()
    }
  })

  app.on('activer', fonction () {
    if (gagner === null) {
      initWindow()
    }
  })

Ensuite, nous devons configurer notre application Angular pour se construire elle-même et Bootstrap à partir du fichier App.js. Voici la configuration dans package.json avec le point d'entrée principal et un script de construction pour démarrer Electron :

{
  "nom": "électron angulaire",
  "version": "0.0.0",
  "main": "app.js",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "watch": "ng build --watch --configuration development",
    "test": "ng test",
    "start:electron": "ng build --base-href ./ && electron ."
  },
  ...
  ...
}

C'est tout : nous pouvons maintenant lancer notre application et voir Angular hébergé dans le shell Electron.

AngularElectron" title="AngularElectron"/></p data-recalc-dims=

Nous avons un moteur Chromium complet intégré à l'application, nous pouvons donc faire des choses comme ouvrir Chrome DevTools à partir du code :

appWindow.webContents.openDevTools()

ElectronDevTools" title="ElectronDevTools"/></p data-recalc-dims=

 

Angular with .NET MAUI

.NET MAUI est l'évolution de Xamarin.Forms et représente une solution .NET multiplateforme moderne pour atteindre les plateformes mobiles et de bureau. Blazor est le bienvenu dans .NET MAUI—essentiellement .NET MAUI amorçant l'application et le rendu du code Blazor dans BlazorWebView. C'est évidemment une bonne histoire pour la modernisation des applications : Blazor et .NET MAUI fonctionnent tous deux sur .NET 6 et les développeurs peuvent désormais partager du code entre le Web/le bureau.

Mais que se passe-t-il si vous avez déjà investi dans JavaScript ? Et si vous créiez déjà des applications Web modernes avec des frameworks JS SPA ? Tout cela serait-il transféré vers .NET MAUI ? Jetons un coup d'œil à l'histoire d'Angular.

Comme nous l'avons vu pour commencer avec Angular CLI, les applications Web Angular dépendent des modules Node.js et Node, ce qui n'est pas quelque chose que nous avons avec .NET MAUI s'exécutant sur . NET 6. Cependant, compilons notre application Angular CLI, comme suit :

Si nous regardons dans le dossier distles artefacts de la construction sont des actifs Web purs – tous les dépendances TypeScript, Node et autres les choses sont compilées en HTML/JS/CSS de base.

AngularBuild" title="AngularBuild"/></p data-recalc-dims=

Si nous regardons le fichier index.html, il référence simplement tout le JavaScript et sait comment afficher le composant racine de l'application.


  
  Angularcli
  
  
  


    

Commençons un projet .NET MAUI avec le modèle Maui-Blazor—essentiellement une application hybride avec des fonctionnalités natives complètes, mais avec l'interface utilisateur Blazor rendue via une WebView moderne pour mobile et les plates-formes de bureau.

Cependant, pourrions-nous remplacer Blazor par Angular ? Ce sont tous deux des frameworks Web modernes qui rendent l'interface utilisateur pour le navigateur, mais avec des temps d'exécution différents – peut-être que WebView ne s'en souciera pas ? Introduisons les fichiers d'application Angular CLI compilés dans notre application .NET MAUI-Blazor et déposons-les dans le répertoire wwwroot en tant que fichiers statiques, comme ceci :

AngularInMaui" title="AngularInMaui"/></p data-recalc-dims=

Les fichiers index.html servent de point de départ pour l'application Blazor dans .NET MAUI – et si nous le remplaçons par celui que nous obtenons de l'application Angular ? Allons chercher dans le fichier MainPage.xaml :



    
        <!-- 
            
         -->
    

C'est là que le caoutchouc rencontre la route : l'application .NET MAUI lance le gros composant BlazorWebView pour que Blazor fasse son travail. BlazorWebView est essentiellement un wrapper—rendant Webiew2 sur Windows, WKWebView sur macOS ou selon le dernier composant WebView pertinent basé sur la plate-forme sur laquelle l'application s'exécute.

Ici, dans MainPage.xaml, nous pouvons toujours le diriger pour aller rendre le fichier wwwroot/index.htmlmais nous l'avons maintenant échangé avec le fichier Angular. Et nous empêchons Blazor de rendre son composant racine de base, donc tout devrait être angulaire pour piloter l'interface utilisateur dans WebView. Nous effectuons avec hésitation une version .NET MAUI :

dotnet build -t:Run -f net6.0-ios

Voilà—nous obtenons l'application Angular CLI qui s'exécute maintenant dans .NET MAUI sur iOS !

MauiAngular" title="MauiAngular"/></p data-recalc-dims=

Faisons une compilation de bureau :

dotnet build -t:Run -f net6.0-maccatalyst

Fonctionne sur macOS, et Windows ne devrait pas être différent.

MauiAngularMac" title="MauiAngularMac"/></p data-recalc-dims=

Puisque nous avons alimenté le BlazorWebView avec HTML/CSS/JS, il ne se souciait pas que nous n'ayons rendu aucune interface utilisateur Blazor – l'interface utilisateur Web est l'interface utilisateur Web. Et maintenant, il est le bienvenu dans les applications multiplateformes .NET MAUI. Le code angulaire aurait besoin d'un interopérabilité JS pour communiquer avec le code .NET, mais la promesse d'apporter Angular aux applications de bureau/mobiles .NET ne fait que commencer.

Conclusion

Angular est merveilleux et permet aux développeurs de créer des applications Web modernes. Mais une grande partie de la bonté angulaire – les composants, la liaison de données, le routage et plus encore, peuvent être transférés vers les applications de bureau. Alors que les PWA et ElectronJS sont la réalité actuelle, .NET MAUI représente la promesse de demain d'apporter Angular au bureau Windows/macOS. Réutilisons le code !




Source link

Revenir vers le haut