首页 > 解决方案 > 为一行阻止 babel 转译器

问题描述

Babel 转译器是一个非常有用的工具,可以让用现代 JavaScript 语法编写的代码在旧浏览器中运行。但是,我发现自己需要解决它而不是使用它。

我有同一个库的两个非常不同的版本(CkEditor4 和 CkEditor5,以防万一)。CkEditor5 不能在 IE11 中运行,即使使用 Babel 和 polyfill。CkEditor4 充满了内联处理程序,所以我们必须在它所在的页面上关闭我们的 CSP。

显然,这里的解决方案是使用 Code-splitting - 在支持它的浏览器上加载 5,在不​​支持它的浏览器上加载 4。我想使用Feature Detection,而不是Browser Detection,因为除了IE11之外还有更多的浏览器无法运行5,其中一些实际上访问了我们的站点。

但是,当我将特征检测行添加到我的代码库中时:

const supports = typeof Symbol === "function" && typeof Symbol() === "symbol";
console.log(supports);

Babel 将其转换为:

"use strict";

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var supports = typeof Symbol === "function" && _typeof(Symbol()) === "symbol";
console.log(supports);

如果 Symbol 是polyfill以及原生支持,则返回 true。所以IE11正在加载CkEditor5,这不起作用。

似乎没有办法在没有 eval 的情况下对 const 关键字进行特征检测(我们的 CSP 也禁止这样做),并且我们的捆绑过程通过 Babel 运行其中的所有文件。

我试过了:

const s = "Symbol";
const supports = typeof self[s] === "function" && typeof self[s]() === s;

和类似的迷惑方法,但巴别塔一直看穿它们。有什么办法可以让它单独留下这一行?

标签: javascriptcross-browserbabeljs

解决方案


推荐阅读