12

我正在尝试在 Internet Explorer 中运行 blazor 应用程序。在 blazor 页面上,有一条通知指出,对于不支持 webassembly 的浏览器,可以回退到 asm.js。当我在 IE 中加载页面(链接 blazor.pollyfil.js 脚本)时,我只收到错误“浏览器不支持 WebAssembly”。

我能够在服务器模式下运行应用程序(使用 SignalR 连接到渲染服务器),但它是适用于所有浏览器的解决方案,并且失去了 Web 程序集的好处。

有没有办法正确回退到 asm.js 模式,只在 Internet Explorer 中?

4

3 回答 3

10

在此提交中有意从 Blazor 中删除了对 asm.js 的支持:https ://github.com/aspnet/Blazor/commit/4006cd543900fcc1cf76cd75a1b24007e60c8a67 。如果我理解正确,从现有的 blazor 获取 asm.js 支持将需要 mono 项目开始在其二进制分发中包含 asm.js 构建,并且 Blazor 项目将其添加回其构建/部署工具。

我还没有尝试过,但可以自己为 asm.js 构建 mono 并将其作为您自己的部署过程的一部分注入到您构建的 Blazor 应用程序中。

如果我理解正确,Blazor 仍然使用单声道的解释模式运行,因此用 asm.js 补充单声道的 wasm 构建可能仍然足够。如果 Blazor 将来转而将程序集直接编译为 wasm,事情会变得更加复杂。

备择方案

Blazor 支持服务器端托管模式。你已经在你的问题中提到了这一点,但我在这里讨论这个以防其他人跳过它。在服务器托管模式下,客户端只需要能够运行“传统”JavaScript(尽管它可能需要 polyfills)。这可以在 IE11 和其他缺乏 wasm 支持的客户端中工作。当然,这样会占用服务器更多的资源,使客户端无法支持离线场景,基本上就像一个美化的 telnet 会话。但这对于LOB 应用程序可能已经足够了。

于 2019-05-14T23:55:19.540 回答
3

WebAssembly 不包含在Internet Explorer 功能中。您可以在 mozilla.org了解浏览器兼容性,不,IE 不支持 WebAssembly。

在此处输入图像描述

请记住 IE 已停产,但仍保持不变

Internet Explorer 11 会继续接收更新吗?

最新功能和平台更新仅在 Microsoft Edge 中可用。我们将在 Internet Explorer 11 支持的生命周期内继续为其提供安全更新。为确保跨 Windows 版本的行为一致,我们将根据具体情况评估 Internet Explorer 11 错误以进行服务。

从 WebAssembly 更改为组件模式只需更改几行代码,但部署这两种模式以保持对 IE 的兼容性似乎很奇怪。请记住 Blazor 是实验性的,我想对于真正的部署,您应该等待一段时间......是时候从 IE 更新到其他浏览器了。

真的有办法在(仅)Internet Explorer 中正确地回退到 asm.js 模式吗?

我想这与“如何检查浏览器是否支持 WebAssembly?”是同一个问题。,只需调整 Blazor 的答案:

const isClientSideWebAssemblySupported = (() => {
    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 = (isClientSideWebAssemblySupported)?
             "_framework/blazor.server.js":
             "_framework/blazor.webassembly.js";

请记住将两者都包含js在您的项目中。

于 2018-11-26T10:21:19.650 回答
0

看起来其他用户也面临这个问题。

该用户发现问题出在 polyfills(当然还有 Internet Explorer 11)上,并且出现在 babel / core-js 和其他兼容的 polyfills 上。

似乎 IE11 在 Symbol 上进行深度 setter 递归时遇到了一些困难,并且出现了 Stack memory exceeded 错误。

他还尝试修复 polyfill。您可以尝试使用它进行测试,以检查它是否有助于解决您的问题。

参考:

asm.js 后备在 IE11 上不起作用

适用于 Blazor 的 Polyfills(用于 Internet Explorer 11 支持和其他一些浏览器)

于 2018-11-27T05:32:14.220 回答