Blazor webassembly应用程序和检测浏览器功能

Blazor webassembly应用程序和检测浏览器功能,blazor,webassembly,blazor-client-side,Blazor,Webassembly,Blazor Client Side,我是Blazor/WebAssembly新手,喜欢这项技术,但不理解某些实现细节背后的原因 例如,如果用户使用不支持WebAssembly(即IE 11)的浏览器导航到由Visual Studio向导创建的客户端Blazor/WebAssembly应用程序,则网站将仅显示 Loading... 永远 原因很清楚,但微软为什么要这样实施呢?尝试检测浏览器是否支持WebAssembly以及是否支持WebAssembly不是更好、信息更丰富吗?将用户重定向到另一个解释原因的静态页面(例如,有人说“您

我是Blazor/WebAssembly新手,喜欢这项技术,但不理解某些实现细节背后的原因

例如,如果用户使用不支持WebAssembly(即IE 11)的浏览器导航到由Visual Studio向导创建的客户端Blazor/WebAssembly应用程序,则网站将仅显示

Loading...
永远


原因很清楚,但微软为什么要这样实施呢?尝试检测浏览器是否支持WebAssembly以及是否支持WebAssembly不是更好、信息更丰富吗?将用户重定向到另一个解释原因的静态页面(例如,有人说“您的浏览器不支持WebAssembly,请使用Chrome v.XX或更高版本、Edge v.XX或更高版本等”)?

我不是微软的员工,但在我看来,他们之所以这么做是因为以下原因

a) MS是工具和技术的提供商,使开发人员能够使用这些工具和技术。因此,他们不会为开发人员做什么决策。它们通常不会创建“意见化”框架。而显示“不受支持”的信息则是他们的明确意见。并不是所有的客户都有这样的信息。如果有人愿意在IE11上实现这一点,并阻止他们怎么办

b) 像那样实现它需要零努力。这本身就是好处。如果他们心中有防弹的解决方案,我毫不怀疑,如果他们想支持的话,他们会实施它。现在,由于它不受支持,开发人员有责任为最终用户提供适当的UX。由开发人员决定如何处理IE。在消息中提供不支持IE11的声明,添加支持IE11的poilyfills,或者切换到不同的技术。如果微软给出的解决方案能够显示消息,那么它需要其他想要使用polyfill的开发人员,或者切换到不同的技术来主动禁用此类检查,并且它需要实现更多的活动部件,仅针对未受支持的平台。这根本没有意义


c) 对IE11的支持需求正在下降,投资支持这个市场可能不值得他们去关注。WebAssembly的技术还不够成熟,他们只能在2020年上半年发布一些东西,届时IE11将是多少?这只是第一次迭代,其他重要的里程碑甚至推得更晚,因此IE11可能不值得努力。

我同意你的观点,但谁知道他们可能会在主版本中包含此功能。目前Blazor.wasm正在预览verison。 现在,您可以在index.html中使用这样一个简单的解决方案:

<script>
  var ua = window.navigator.userAgent;
  var isIE = /MSIE|Trident/.test(ua);

  if ( isIE ) {
    alert("Internet Explorer browser is not supported. Please use a more modern browser like Google Chrome, Microsoft Edge, Mozilla Firefox, Opera, Safari, etc.");
  }
</script>

var ua=window.navigator.userAgent;
变量isIE=/MSIE | Trident/.test(ua);
如果(isIE){
警报(“不支持Internet Explorer浏览器。请使用更现代的浏览器,如Google Chrome、Microsoft Edge、Mozilla Firefox、Opera、Safari等”);
}
希望有帮助:)
另外,如果你不想使用脚本,我想这也可以通过CSS来实现

不久前,我偶然发现了一篇关于这一点的博客文章(忘记了来源,没有为这项工作获得荣誉),下面是解决这一问题的方法-检测Webassembly是否受支持,如果不受支持,则重定向到“浏览器不受支持”html页面。它正是按照您上面概述的方式工作的

下面是要在WASM服务工作者注册之前添加的JavaScript片段,例如,
navigator.serviceWorker.register('service-worker.js')

const webassemblySupported=(函数(){
试一试{
if(typeof WebAssembly==“object”&&typeof WebAssembly.instantiate==“function”){
const module=新的WebAssembly.module(Uint8Array.of(0x0、0x61、0x73、0x6d、0x01、0x00、0x00、0x00));
if(WebAssembly.module的模块实例)
返回WebAssembly.Instance的新WebAssembly.Instance(模块)instanceof WebAssembly.Instance;
}
}捕获(e){
console.error('验证webassembly是否受支持失败,假设不受支持');
}
返回false;
})();
//现代浏览器,如Edge/Chrome/Safari/Firefox等。
如果(支持WebAssembly){
Blazor.start({});
}
//较旧的浏览器,如IE11
否则{
window.location=window.location+“NotSupported.html”;
}

您还需要考虑较旧版本的现代浏览器。例如,从2017年开始运行Chrome 63。原因很可能是(至今)