Babel 7 没有正确转换内置子类

Babel 7 not transforming builtin subclasses properly

Babel 版本:7.6.0

我正在研究 a JavaScript widget meant for browser use, but it depends on a library built for NodeJS ( edtf.js ). Particularly, it extends the Date builtin in this file

到目前为止,它似乎适用于我测试过的所有现代浏览器。但是为了确保它对年长的人来说是防弹的,我想到了 Babelifying the edtf library。这是来自 my Gruntfile.js:

的 browserify 配置
browserify: {
  development: {
    src: [
      "node_modules/edtf/index.js"
    ],
    dest: './dist/js/edtf.js',
    options: {
      browserifyOptions: { standalone: 'edtf' },
      transform: [["babelify", {
        "presets": ["@babel/preset-env"], "plugins": [["@babel/transform-runtime", {"helpers": false}]]
      }]]
    }
  }
},

经过大量修改,此配置至少不会在页面上加载生成的 javascript 文件时触发任何错误,但一旦我开始使用该库,它就会因以下错误而中断:

edtf.js:3040 Uncaught TypeError: this is not a Date object.
   at Date.getUTCFullYear (<anonymous>)
   at Date.get (edtf.js:3040)
   at Date.toEDTF (edtf.js:2960)
   at Date.value (edtf.js:5696)
   at new Date (<anonymous>)

一个 correctly points out that builtin subclasses are only partially supported by Babel, according to their documentation, and suggests using the transform-builtin-extend插件,遗憾的是2年无人维护,只适合Babel 6.

transform classes 不应该这样做吗?我尝试将它包含在我的配置中,但它没有任何改变。

无论如何,如果有人对如何前进有任何建议,here is the github branch to try it for yourself,只需 运行 npm installnpm run build 并打开 index.html 文件在您的浏览器中。欢迎任何建议:我不赞成 Babel 的想法,但我想确保我可以安全地使用这个 edtf 库并让它在大多数浏览器上工作。

根本问题是您 不能 subclass Date 仅使用 ES5 和更早的功能。它根本不起作用(例如 ErrorArray)。

如果您需要使用转译为 ES5 或更早版本的代码,则必须修改您的 class,使其不会尝试子class Date。 (例如,使用 Date 实例作为成员,并将方法调用转发到...)