在过去的几天里,这个问题一直让我失去理智。
这是我的目录结构:
[src]
|- cmds/
| |- Gh.js
| \- Help.js
|- commands.js
|...
我正在尝试将 commands.js
导出的类导入 Help.js
和 Gh.js
(以及我将来可能添加的任何其他文件)。但是,我不断收到错误消息:
class Gh extends _commands.Command {
^
TypeError: Class extends value undefined is not a constructor or null
所有文件都使用 Babel 转译,将 env
设置为 "node": "current"
并使用 wildcard
包。我试图将它设置为 "browser"
看看它是否是一个过于“高级”的问题,但我得到了关于超级函数(或其他东西)的不同错误,我认为这是同一个问题.
这是从 commands.js
导出的类:
export class Command {
constructor (msg) {
this.id = msg.author.id
this.msg = msg
}
action () {}
get data () {
return readData().user[this.id]
}
updateUserData (key, val) {
updateUserData(this.id, key, val)
}
sendMsg (data) {
sendMsg(this.msg, data)
}
}
…这里是 cmds/Gh.js
,我要导入的文件之一 Command
到:
import {Command} from '../commands'
export class Gh extends Command {
constructor (msg) {
super(msg)
this.desc = 'Returns GitHub repository link and exits'
}
action () {
this.sendMsg('GitHub link: https://github.com/owm111/knife-wife')
}
}
我尝试将 Command
放入两个 cmds/
中,它们运行良好。但是,当将它移回 commands.js
时,它又坏了。我尝试更改从 ../commands
./../commands
../commands.js
./../commands.js
没有工作。我将 commands.js
移动到 cmds/
,仍然坏了。我试图 console.log(Command)
在两个 cmds/
中,但他们都返回了 undefined
。
所有这一切都让它看起来像是进口问题,但我无法弄清楚我的生活是什么。请帮忙。
原文由 Owen McGrath 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果其他人看到此错误,首先要查找的是 circular dependencies 。将文件 A 导入 B,将 B 导入其他文件 C,依此类推。如果将 C 到 Z 中的任何一个导入到 A 中,那么 JS 将无法确保在另一个文件需要它时定义了一个文件(并且不会尝试返回并稍后填充空白)。
这里很可能就是这种情况,因为显然还有其他代码没有贴出来,而且只有在引入文件依赖项时才会出现。 无论文件结构如何, 问题都存在:保证避免它的唯一结构是一个巨大的 JS 文件。解决方案是确保类之间关系的严格树结构,并使用工厂方法或替代通信(如发射器)来保持耦合松散。
如果您有多个 import / require 语句,我建议定期运行 Madge 之类的检查器,以在循环变得难以撤消之前查找并选择性地可视化任何循环。