如何通过 Babel、Shim 和 Polyfill 将 Javascript 从 ES6 转换为 ES5

How to Convert Javascript from ES6 to ES5 via Babel, Shim, and Polyfill

我一直在尝试使用 Babel 和 shims/polyfills 使我的简单 HTML/JS 网站向后兼容(IE11 及以下版本),但无法正确完成。我当前的站点使用了一些较新的函数,例如 Promise()fetch()document.querySelectorAll().forEach()() => {}.

我尝试在通过 Babel 从 es6 -> es5 转译我的代码的顶部 添加 es6-shim, es5-shim, fetch-polyfill, and promise-polyfill。无论如何,当我使用较旧的浏览器(例如 IE 11 或 10)加载我的网页时,我会收到多个错误。错误说 () => {} 不起作用,并且 .forEach() 不是函数,这没有意义,因为我使用的是垫片和 Babel。

这是我的 JS 的顺序包括:

[... body content ...]

<script src="assets/libs/es5-shim/es5-shim.min.js" type="text/javascript"></script>
<script src="assets/libs/es6-shim/es6-shim.min.js" type="text/javascript"></script>
<script src="assets/libs/promise-polyfill/promise-polyfill.min.js" type="text/javascript"></script>
<script src="assets/libs/fetch-polyfill/fetch.umd.js" type="text/javascript"></script>

[... rest of scripts ..]

为了将我的 es6 代码转换为 es5,我执行了以下操作:

npm install -D babel-cli

npm install -D babel-preset-env

// .babelrc

{
  "presets": ["env"]
}
// package.json
...
"scripts": {
  "build": "babel src -d build",
},
...

npm run build

两个示例错误:"Object doesn't support property or method forEach" (querySelectorAll().forEach()) 和 "Syntax error" (() => {})

您使用的是旧版本的 Babel,切换到 Babel 7 并开始使用 @babel/preset-envNodeList.forEach 在任何 IE 中都不起作用,需要单独进行 polyfill,因为 Babel polyfill 不会填充任何缺失的原型方法。

最短的polyfill大概是

if (!NodeList.prototype.forEach) NodeList.prototype.forEach = Array.prototype.forEach;

您还需要配置 .babelrc 以便为 IE 转换您的代码。 Babel 7 的示例:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "browsers": ["ie >= 10", "last 1 version"]
        }
      }
    ]
  ]
}

P.S.: 那时你可能不需要垫片。