【问题标题】:Detect if ES2015 code was transpiled by babel or is running native?检测 ES2015 代码是被 babel 转译还是在本地运行?
【发布时间】:2017-03-12 19:21:09
【问题描述】:

由于 babel 操作的某些限制,我需要编写解决方法代码以使我的项目的一部分在被它转译时能够正常工作。我想让这段代码有条件,所以它只有在被 babel 转译后才运行(因为在本机 ES6 环境中它是不必要的)。有没有办法做到这一点?

【问题讨论】:

  • 你想使用特征检测(检查它是否是一个真正的ES6环境)还是你想让babel在编译时插入一些特殊的代码?也许您应该发布您的解决方法(甚至可能是代码本身),以便我们更好地帮助您。
  • @Bergi 我正在尝试解决 eval 函数无法访问在模块范围内定义的符号的错误。
  • @PeriataBreatta:通常你必须假设变量会被重命名。如果您必须使用某种 eval,请使用 Function:var f = new Function('var1, var2', '<code>'); f(var1, var2)。这样一来,Babel 对 var1var2 所做的事情就无关紧要了。
  • 为什么不使用eval() 发布实际问题,然后您可以征求实际问题的答案而不是解决方法。
  • @jfriend00 - 问题是我有许多类被导入到我使用import { name1, name2, ... } from "source" 语法调用eval 的模块中。 eval 正在执行的代码需要能够引用那些,但不能因为它们(正如上面的 Felix 有用地评论)被 Babel 重命名,而 eval 不知道重命名。我没有发布关于eval 问题的问题,因为已经有另一个问题,Babel 开发人员基本上表示没有实际的解决方案。

标签: javascript ecmascript-6 babeljs feature-detection


【解决方案1】:

来自Babel plugins docs

现在,开箱即用的 Babel 什么都不做。它基本上就像const babel = code => code;,通过解析代码然后再次生成相同的代码。

所以通常你无法检测代码是否已被 Babel 转译,因为没有任何插件,它是无操作的。但是,您也许可以通过 Babel 使用一些插件或预设来检测代码是否已被转译。

由于您在谈论转译 ES2015 代码,我假设您使用的是 es2015 预设。例如,此预设转译 ES2015 类。从you can easily detect if something is a native ES2015 class开始,你可以检查代码是否已经被 Babel 转译了。

例如,现代浏览器中的以下代码 sn-p 应该输出false

const isBabel = !(class {}.toString().indexOf('class ') === 0);
console.log(isBabel);

虽然这个输出true(我检查了代码sn-p选项中的“使用BabelJS / ES2015”选项):

const isBabel = !(class {}.toString().indexOf('class ') === 0);
console.log(isBabel);

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2014-07-10
    • 2019-09-22
    • 1970-01-01
    • 2010-11-09
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多