"TypeError not a constructor" 将项目从 Babel v5 升级到 v6+ 时

"TypeError not a constructor" when upgrading project from Babel v5 to v6+

我已经把头撞在这堵砖墙上一天了,所以我想是时候求助于 SO 了!我正在尝试从 babel v5 更新一个项目,我从 package.json:

开始
"devDependencies": {
    "babel": "^5.8.21",

"test": "mocha --require babel/register",

我尝试升级到 babel v6 和 v7,但都没有成功。在这两种情况下,当我尝试 运行 与 v5 配合良好的测试时,我最终得到 TypeError: _application.ApplicationClient is not a constructor

import { ApplicationClient } from '../src/wiotp/sdk/application';
...
let client = new ApplicationClient();

以 v6 为例,我在 package.json 中得到以下结果:

  "devDependencies": {
    "babel-cli": "^6.0.0",
    "babel-core": "^6.0.0",
    "babel-preset-env": "^1.7.0",
    "mocha": "6.1.4",

"test": "mocha --require babel-core/register --timeout 5000",

并创建了一个 .babelrc 文件(none 之前存在):

{
    "presets": ["env"]
}

我已经阅读了十几篇或更多文章试图了解这里发生了什么,我已经完成并撤消了许多基于 Google 搜索类似问题的建议 "fixes",但我从零开始,发现很难用简单明了的英语解释实际问题是什么,以及应该如何在此处配置 babel 来解决它。我猜 v5 中默认发生的事情现在需要以某种方式在 .babelrc 中配置,但是 /shrugs/ 现在不知道从这里去哪里。

对于努力绕过 babel 的人有什么建议,更不用说 v5、6 和 7 之间的区别了吗?

编辑:

src/wiotp/sdk/application/index.js 有这个:

import { default as ApplicationClient } from './ApplicationClient';

export default {
  ApplicationClient
}

其中 src/wiotp/sdk/application/ApplicationClient.js 导出了一个 class(我只是想在测试代码中创建一个 class 的实例):

export default class ApplicationClient extends BaseClient {
  constructor(config) {

src/wiotp/sdk/application/index.js has this:

import { default as ApplicationClient } from './ApplicationClient';

export default {
  ApplicationClient
}

这太可怕了,导致了你的问题。该模块执行 default-export 对象文字,而不是仅使用命名导出。这可能是一个错误,他们打算写

import { default as ApplicationClient } from './ApplicationClient';
export { ApplicationClient }

export { default as ApplicationClient } from './ApplicationClient';

建议报告问题并提供补丁。

如果这不是错误而是故意的,您需要将代码更改为

import application from '../src/wiotp/sdk/application';
…
let client = new application.ApplicationClient();
//               ^^^^^^^^^^^^

或者直接从原来的模块导入:

import ApplicationClient from '../src/wiotp/sdk/application/ApplicationClient.js';
//                                                          ^^^^^^^^^^^^^^^^^^^^^
…
let client = new ApplicationClient();