"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();
我已经把头撞在这堵砖墙上一天了,所以我想是时候求助于 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();