.NET 7 RC 1 introduit une interopérabilité avec JavaScript via WebAssembly

Par:
fredericmazue

ven, 14/10/2022 - 13:23

Microsoft a publié .NET 7 RC1, une mouture riche qui introduit notamment un nouveau mécanisme de bas niveau pour l'utilisation de .NET dans les applications basées sur JavaScript. Avec cette nouvelle capacité d'interopérabilité JavaScript, vous pouvez appeler du code .NET à partir de JavaScript à l'aide du runtime .NET WebAssembly ainsi qu'appeler la fonctionnalité JavaScript à partir de .NET sans aucune dépendance au modèle de composant d'interface utilisateur Blazor.

Le moyen le plus simple de voir la nouvelle fonctionnalité d'interopérabilité JavaScript en action consiste à utiliser les nouveaux modèles expérimentaux dans le workload wasm-experimental :

dotnet workload install wasm-experimental

Ce workload contient deux modèles de projet : WebAssembly Browser App et WebAssembly Console App. Ces modèles sont expérimentaux, ainsi, par exemple, ces modèles ne s'exécutent pas encore dans Visual Studio. Mais les API .NET et JavaScript utilisées dans ces modèles sont prises en charge dans .NET 7 et fournissent une base pour l'utilisation de .NET sur WebAssembly à partir de JavaScript.

Vous pouvez créer une application de navigateur WebAssembly en exécutant la commande suivante :

dotnet new wasmbrowser

Ce modèle crée une application Web simple qui illustre l'utilisation conjointe de .NET et de JavaScript dans un navigateur. L'application WebAssembly Console est similaire, mais s'exécute comme une application console Node.js au lieu d'une application Web basée sur un navigateur.

Le module JavaScript dans main.js dans le projet créé montre comment exécuter du code .NET à partir de JavaScript. Les API pertinentes sont importées de dotnet.js . Ces API vous permettent de configurer des modules nommés pouvant être importés dans votre code C#, ainsi que d'appeler des méthodes exposées par votre code .NET, notamment Program.Main :

import { dotnet } from './dotnet.js'

const is_browser = typeof window != "undefined";
if (!is_browser) throw new Error(`Expected to be running in a browser`);

// Setup the .NET WebAssembly runtime
const { setModuleImports, getAssemblyExports, getConfig, runMainAndExit } = await dotnet
    .withDiagnosticTracing(false)
    .withApplicationArgumentsFromQuery(
    .create();

// Set module imports that can be called from .NET
setModuleImports("main.js", {
    window: {
        location: {
            href: () => globalThis.window.location.href
        }
    }
});

const config = getConfig();
const exports = await getAssemblyExports(config.mainAssemblyName);
const text = exports.MyClass.Greeting(); // Call into .NET from JavaScript
console.log(text);

document.getElementById("out").innerHTML = `${text}`;
await runMainAndExit(config.mainAssemblyName, ["dotnet", "is", "great!"]); // Run Program.Main 

Pour importer une fonction JavaScript afin qu'elle puisse être appelée depuis C#, utilisez le nouvel attribut JSImport sur une signature de méthode correspondante :

[JSImport("window.location.href", "main.js")]
internal static partial string GetHRef(); 

Le premier paramètre de l'attribut JSImport est le nom de la fonction JavaScript à importer et le second paramètre est le nom du module.

Dans la signature de méthode importée, vous pouvez utiliser des types .NET pour les paramètres et les valeurs de retour.

Les autres nouveautés introduites par .Net 7 RC 1 sont nombreuses. En voici un résumé :

  • Requêtes d'authentification dynamiques dans Blazor WebAssembly
  • Gestion les événements de changement de lieu
  • Améliorations du débogage de Blazor WebAssembly
  • Outils de génération .NET WebAssembly pour les projets .NET 6
  • Améliorations complètes de la chaîne de certificats Kestrel
  • Téléchargements HTTP/2 plus rapides
  • Améliorations HTTP/3
  • Prise en charge expérimentale de Kestrel pour WebTransport sur HTTP/3
  • Prise en charge expérimentale d'OpenAPI pour le transcodage gRPC JSON
  • Améliorations du middleware limitant le débit
  • Améliorations des certificats de développement macOS