我有2个文件, 的 extendableError.js
class ExtendableError extends Error {
constructor(message) {
super(message)
this.name = this.constructor.name
this.message = message
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(this, this.constructor)
} else {
this.stack = new Error(message).stack
}
}
}
module.exports = ExtendableError
duplicatedError.js
const ExtendableError = require('./ExtendableError')
class DuplicatedError extends ExtendableError {
constructor(message) {
super(message)
}
}
module.exports = DuplicatedError
以下是我的测试代码,
const DuplicatedError = require('./duplicatedError');
const ExtendableError = require('./ExtendableError');
const ExtendableError1 = require('./extendableError');
try{
throw new DuplicatedError('hahah');
}catch(err){
console.log(err instanceof ExtendableError); // true
console.log(err instanceof ExtendableError1); // false
}
测试是在我的Mac书上,为什么会这样?只有第一个字符大写有不同的结果。我不明白。
答案 0 :(得分:2)
Mac基于BSD UNIX,因此文件系统区分大小写。
作为附注,通常不使用文件名的文件夹,例如:
var extendableError = require(‘./extendable-error’)
答案 1 :(得分:0)
首先,出于兼容性原因,macOS选择了不区分大小写的文件系统。但这并不意味着您必须承担它,Disk Utility
可用于将分区重新格式化为区分大小写的模式。如果您这样做,node.js
会向您报告错误,因为您尝试require
的模块名称错误。
然后,让我们谈谈你的测试结果。关键问题是require
duplicatedError.js
中的哪一个,如果您稍微更改一下:
//change the required name to lowercase extendableError
const ExtendableError = require('./extendableError')
class DuplicatedError extends ExtendableError {
constructor(message) {
super(message)
}
}
module.exports = DuplicatedError
测试结果将是:
false
true
您甚至可以尝试修改duplicatedError.js
,如下所示:
//change the required name to extENDableError
const ExtendableError = require('./extENDableError')
class DuplicatedError extends ExtendableError {
constructor(message) {
super(message)
}
}
module.exports = DuplicatedError
结果应为
false
false
所以我认为这不是模块缓存,你有两件事需要明确:
extendableError.js
,但是require
两次使用不同的名称,例如:require(./extendableError)
,require(./ExtendableError)
,require(./extENDableError)
,trey将是被视为三个模块。