web-dev-qa-db-fra.com

Blazor dans Internet Explorer

J'essaie d'exécuter l'application blazor dans Internet Explorer. Sur la page Blazor écrite, il y a un repli dans asm.js pour les navigateurs sans prise en charge de l'assemblage Web. Mais lorsque je charge une page dans IE (avec le script blazor.pollyfil.js lié), je reçois simplement l'erreur "Le navigateur ne prend pas en charge WebAssembly".

Je peux exécuter l'application en mode serveur (connexion SignalR au serveur de rendu), mais c'est une solution pour tous les navigateurs et le principal avantage (WebAssembly) disparaît.

Existe-t-il vraiment un moyen de revenir correctement au mode asm.js dans (uniquement) Internet Explorer?

7
Fanda

WebAssembly n'est pas inclus sur fonctionnalités d'Internet Explorer . Vous pouvez en savoir plus sur Compatibilité du navigateur sur mozilla.org , et non, IE ne prend pas en charge WebAssembly.

enter image description here

Rappelez-vous IE est abandonné, mais toujours maintenu:

Internet Explorer 11 continuera-t-il de recevoir des mises à jour?

Les dernières fonctionnalités et mises à jour de la plateforme ne seront disponibles que dans Microsoft Edge. Nous continuerons à fournir des mises à jour de sécurité à Internet Explorer 11 tout au long de sa durée de vie prise en charge. Pour garantir un comportement cohérent dans toutes les versions de Windows, nous évaluerons les bogues d'Internet Explorer 11 pour la maintenance au cas par cas.

Le passage de WebAssembly au mode composant n'est que quelques lignes de changement de code, mais il semble étrange de déployer les deux modes pour conserver la compatibilité pour IE. Rappelez-vous que Blazor est expérimental, je suppose que pour un vrai déploiement, vous devez attendre un moment ... le temps de mettre à jour depuis IE vers un autre navigateur.

Existe-t-il vraiment un moyen de revenir correctement au mode asm.js dans (uniquement) Internet Explorer?

Je suppose que c'est la même question que "Comment puis-je vérifier si un navigateur prend en charge WebAssembly?" Il suffit d'adapter la réponse pour Blazor:

const supported = (() => {
    try {
        if (typeof WebAssembly === "object"
            && typeof WebAssembly.instantiate === "function") {
            const module = new WebAssembly.Module(
                               Uint8Array.of(0x0, 0x61, 0x73, 0x6d,
                                             0x01, 0x00, 0x00, 0x00));
            if (module instanceof WebAssembly.Module)
                return new WebAssembly.Instance(module) 
                           instanceof WebAssembly.Instance;
        }
    } catch (e) {
    }
    return false;
})();

var script = document.createElement('script');
script.src = (supported)?
             "_framework/blazor.server.js":
             "_framework/blazor.webassembly.js";

N'oubliez pas d'inclure les deux js dans votre projet.

2
dani herrera

La prise en charge de asm.js a été intentionnellement supprimée de Blazor dans ce commit: https://github.com/aspnet/Blazor/commit/4006cd543900fcc1cf76cd75a1b24007e60c8a67 . Si je comprends bien, obtenir le support asm.js de stock blazor nécessiterait que le projet mono commence à inclure une génération asm.js dans sa distribution binaire et que le projet Blazor ajoute cela à son outil de génération/déploiement.

Je ne l'ai pas essayé, mais il pourrait être possible de créer vous-même du mono pour asm.js et de l'injecter dans votre application Blazor intégrée dans le cadre de votre propre processus de déploiement.

Si je comprends bien, Blazor fonctionne toujours en utilisant le mode interprété mono, donc compléter la construction wasm de mono avec un asm.js pourrait être suffisant. Si Blazor passe à la compilation d'assemblages réels vers wasm directement à l'avenir, les choses deviendront plus compliquées.

Alternatives

Blazor prend en charge mode d'hébergement côté serveur . Vous l'avez déjà mentionné dans votre question, mais j'en discute ici au cas où d'autres l'ignoreraient. En mode d'hébergement de serveur, le client doit seulement pouvoir exécuter du JavaScript "traditionnel" (bien qu'il puisse avoir besoin de polyfills). Cela peut être fait pour fonctionner dans IE11 et d'autres clients manquant de support wasm. Bien sûr, cela prend plus de ressources sur le serveur, empêche le client de prendre en charge les scénarios hors ligne, et est essentiellement comme une session telnet glorifiée. Mais cela peut être suffisant pour applications LOB .

6
binki

Il semble que d'autres utilisateurs soient également confrontés à ce problème.

Cet utilisateur trouve que le problème est avec les polyfills (et Internet Explorer 11 bien sûr), et cela se produit avec babel/core-js et d'autres polyfills compatibles.

Il semble qu'IE11 ait quelques difficultés avec la récursion profonde du setter sur Symbol, et il obtient une erreur de dépassement de la mémoire de la pile.

il essaie également de réparer le polyfill. Vous pouvez essayer de faire un test avec lui pour vérifier s'il aide à résoudre votre problème ou non.

Référence:

le remplacement asm.js ne fonctionne pas sur IE11

Polyfills pour Blazor (pour la prise en charge d'Internet Explorer 11 et de certains autres navigateurs)

0
Deepak-MSFT