【问题标题】:How to detect if browser is compatible with ES2015 [duplicate]如何检测浏览器是否与 ES2015 兼容 [重复]
【发布时间】:2016-01-04 16:47:39
【问题描述】:

我有一大堆 JS 库需要重写,因为它真的很旧而且过时了。因此,我决定提出一个解决方案,我将只使用大部分 ES2015 功能,例如 rest parameters

问题是,我确信所有客户的浏览器都不会是最新的,我很困惑是否会面临有关他们的浏览器与我的新 JS 库兼容的任何问题。

所以,我想知道是否可以检测客户端浏览器是否与 ES2015 兼容。如果没有,我将只包含我的旧 JS 库。

我正在寻找像 Conditional comments 这样的解决方案,但我无处可去。

感谢您对 HTML、JS 或 PHP 的任何帮助。请提出您的建议。

【问题讨论】:

  • 目前根本没有兼容整个 ES2015的浏览器。见kangax.github.io/compat-table/es6
  • 好问题。对于初学者,我认为这最好用作依赖管理器配置,以便加载脚本的替代版本。至于检测,我想知道最简单的方法是不是像eval("function(a,b,...args) { }");,并检查语法错误。当然,提醒一下“eval 是邪恶的”,但如果您记住只将它用于精确的内联字符串,它可能会更安全一些。
  • 很多 ES6 特性不能简单地填充,因为它是新的语法,所以你需要所有代码的两个版本;一个 ES6 版本和一个 Legacy 版本(可能是使用 Babel 从 ES6 版本编译而来的?)。特征检测必须在 try..catch 中完成,因为如果不支持它抛出错误。不过,您可以改为使用 shim 将代码升级到 ES5,这意味着您只有一个代码库。

标签: javascript ecmascript-6


【解决方案1】:

我想知道我是否可以检测客户端浏览器是否 与 ES2015 兼容。如果没有,我只会包括我的旧 JS 图书馆。

你不能这样做,仅仅因为 AFAIK 没有完全支持 ES2015 的浏览器。此外,您并不想维护两个不同版本的代码,因为这很痛苦,而且很快就会变得混乱。

现在的方法是使用 transpiler,这是一种将 ES2015 代码编译为 ES5(每个浏览器都知道的 JavaScript)的编译器。它仍然有点乱,但至少你只能编写一个版本的代码,那就是 ES2015。

我认为Babel(以前的 6to5)是最流行的转译器。您可以查看他们的网站以开始使用。


至于回答您的实际问题,

如何检测浏览器是否兼容 ES2015

您可以通过多种方式做到这一点。我不确定什么是最可靠的,但例如,您可以简单地在浏览器的控制台上尝试:

'Promise' in window

如果这条语句返回true,那么当前浏览器支持promises,这是ES2015的一个新特性,所以你可以假设它支持ES2015的大部分特性。

但这对于大多数情况来说是不够的;您可能希望 100% 确定您使用的内容不会在任何旧浏览器中抛出 SyntaxError

一种解决方案可能是手动检查您要使用的每个功能。例如,如果您需要 Fetch API,您可以创建一个函数来告诉您当前浏览器是否支持它:

function isFetchAPISupported() {
    return 'fetch' in window;
}

您可以为所需的任何新 API 执行此操作。但是,如果您需要 语法 不同的东西,我认为您唯一的选择是 eval()(如 Katana314 建议的那样)。例如,为了检查对剩余参数的支持,您可以这样做:

function isRestSupported() {
    try {
        eval('function foo(bar, ...rest) { return 1; };');
    } catch (error) {
        return false;
    }
    return true;
}

这在 Firefox 中效果很好,因为支持其余参数。 它在 Safari 上也能正常工作,返回 false 因为那里还支持其余参数。

【讨论】:

  • 如果此语句返回 true,则浏览器与 ES2015 “兼容”。 这是错误的。这只意味着浏览器提供了原生的 Promise。
  • 如果isRestSupported返回true,你会怎么做?在不受支持的浏览器中使用 rest 语法会在 parsed 而不是执行时抛出语法错误
  • @RGraham 在我的评论中,我提到依赖管理器必须为其配置。例如,partOfApp.jspartOfApp_ES5.js。后者可能只是一个警告说“获取更新的浏览器,hick!”如果它不是一个公共访问站点。
  • @Katana314 因此,例如,如果浏览器支持 rest 但不支持 param 默认值和每个排列,则每个附加功能都需要一个文件?在现有代码库上使用 Babel 更容易
  • @RGraham 好吧,我无法谈论 OP 不使用某种转译器的原因;他们显然有一些他们正在考虑的计划。
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 2015-09-08
  • 2011-06-12
  • 2015-10-29
  • 1970-01-01
  • 2011-07-03
  • 2015-05-15
  • 2012-08-15
相关资源
最近更新 更多