【问题标题】:Blazor in Internet ExplorerInternet Explorer 中的 Blazor
【发布时间】:2019-04-27 23:01:24
【问题描述】:

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

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

只有在 Internet Explorer 中才能正确回退到 asm.js 模式吗?

【问题讨论】:

标签: internet-explorer webassembly blazor


【解决方案1】:

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

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

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

替代方案

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

【讨论】:

    【解决方案2】:

    WebAssembly 不包含在 Internet Explorer features 中。你可以了解browser compatibility at mozilla.org,不,IE 不支持 WebAssembly。

    记住 IE 是 discontinued, but still maintained:

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

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

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

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

    我猜想和"How can I check if a browser supports 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

    【讨论】:

    • 你写的一切我都知道,但问题仍然存在。在不支持 WebAssembly 的浏览器中回退到 asm.js...
    • 嗨@Fanda,我为你的问题写了一种方法。看一看。我不知道这是否是您的解决方案,现在让我改进或删除我的答案。
    • 您的脚本为我指出了解决方案。可以在github上看到:github.com/frantiseksidak/BlazorWithFallback
    • 您没有解决以下问题:Blazor 承诺它将在 asm.js(在所有浏览器上运行)上运行。如何构建我的 Blazor 应用程序,该应用程序使用 asm.js 构建单声道而不是 WebAssembly 构建?不支持吗?它是否使用了可以即时编译为 WebAssembly 的 mono 版本,而不是使用解释器模式?
    • @binki : 重读我的答案,我看你是对的,这个答案没有集中在问题的主题上。
    【解决方案3】:

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

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

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

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

    参考:

    asm.js fallback not working on IE11

    Polyfills for Blazor (for Internet Explorer 11 support and some other browsers)

    【讨论】:

    • 这是我已经链接的 blazor.pollyfil.js 文件,如问题中所述。
    • @Fanda,如果您检查该链接,您会发现该用户已更新该链接以纠正问题。您可以参考 README.md 文件中的更改。所以你可以检查你是否链接了更新的 polyfill。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2012-09-02
    • 1970-01-01
    • 2023-03-19
    • 2011-05-03
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多