web-dev-qa-db-ja.com

Internet ExplorerのBlazor

Internet Explorerでblazorアプリケーションを実行しようとしています。ブレザーページには、webassemblyサポートのないブラウザーのasm.jsへのフォールバックが記述されています。しかし、IE(blazor.pollyfil.jsスクリプトがリンクされている)でページをロードすると、「ブラウザはWebAssemblyをサポートしていません」というエラーが表示されます。

サーバーモード(レンダリングサーバーへのSignalR接続)でアプリケーションを実行できますが、これはすべてのブラウザーのソリューションであり、主な利点(WebAssembly)が消えます。

Internet Explorer(のみ)でasm.jsモードに正しくフォールバックする方法は本当にありますか?

9
Fanda

WebAssemblyは Internet Explorerの機能 に含まれていません。 mozilla.orgでのブラウザの互換性 について学習できますが、IEはWebAssemblyをサポートしていません。

enter image description here

覚えているIE is 廃止されましたが、まだ維持されています:

Internet Explorer 11は引き続きアップデートを受信しますか?

最新の機能とプラットフォームの更新は、Microsoft Edgeでのみ利用できます。 Internet Explorer 11のサポートされている有効期間を通じて、引き続きセキュリティ更新プログラムを提供します。 Windowsバージョン全体で一貫した動作を保証するために、サービスごとにケースバイケースでInternet Explorer 11のバグを評価します。

WebAssemblyからコンポーネントモードへの変更は、ほんの数行のコード変更ですが、IEの互換性を維持するために両方のモードをデプロイするのはおかしいようです。 Blazorは実験的なものであることを思い出してください。実際の展開では、しばらく待つ必要があります... IEから他のブラウザに更新するまでの時間。

Internet Explorer(のみ)でasm.jsモードに正しくフォールバックする方法は本当にありますか?

"ブラウザがWebAssemblyをサポートしているかどうかを確認するにはどうすればよいですか?" と同じ質問だと思います。

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";

両方のjsをプロジェクトに含めることを忘れないでください。

2
dani herrera

Asm.jsのサポートは、このコミットでBlazorから意図的に削除されました: https://github.com/aspnet/Blazor/commit/4006cd543900fcc1cf76cd75a1b24007e60c8a67 。私が正しく理解している場合、在庫のblazorからasm.jsのサポートを取得するには、monoプロジェクトがasm.jsビルドをバイナリディストリビューションに含め始め、Blazorプロジェクトがそのビルド/デプロイツールに追加する必要があります。

まだ試していませんが、asm.jsのモノラルを自分で作成し、独自のデプロイプロセスの一部として、それをビルド済みのBlazorアプリケーションに挿入することは可能かもしれません。

私が正しく理解していれば、Blazorは引き続きmonoのインタープリターモードを使用して実行されるため、monoのwasmビルドをasm.jsで補足するだけで十分な場合があります。 Blazorが将来実際にアセンブリをwasmに直接コンパイルするように切り替えると、事態はさらに複雑になります。

代替案

Blazorは サーバー側ホスティングモード をサポートしています。あなたの質問ですでにこれを述べましたが、他の人がそれをスキップした場合に備えて、ここでこれについて議論しています。サーバーホスティングモードでは、クライアントは「従来の」JavaScriptを実行できれば十分です(ただし、ポリフィルが必要になる場合があります)。これは、IE11やwasmサポートのない他のクライアントで機能するように作成できます。もちろん、これはサーバーでより多くのリソースを必要とし、クライアントがオフラインシナリオをサポートするのを防ぎ、基本的には栄光のtelnetセッションのようなものです。しかし、これは LOBアプリケーション には十分です。

6
binki

他のユーザーもこの問題に直面しているようです。

そのユーザーは、問題がポリフィル(そしてもちろんInternet Explorer 11)にあることを発見し、それはbabel/core-jsおよびその他の互換性のあるポリフィルで発生します。

IE11はSymbolでの深いセッター再帰に関していくつかの問題を抱えているようで、スタックメモリ超過エラーを受け取ります。

また、ポリフィルの修正も試みます。それを使用してテストを行い、問題の解決に役立つかどうかを確認できます。

参照:

asm.jsフォールバックがIE11で機能しない

Blazorのポリフィル(Internet Explorer 11のサポートと他の一部のブラウザーの場合)

0
Deepak-MSFT