JavaScript类如何不传入参数获取构造时所在文件的文件名?
实现方案
__filename是Node.js在模块编译阶段注入的模块级变量,绑定的是当前代码所属文件的路径,写在类定义文件里就永远指向类文件,要无传参拿到实例化所在文件的路径,只能通过Error调用栈解析实现,示例代码如下:
const path = require('path') class CustomCommand { constructor() { // 构造实例时捕获当前调用栈 const stackTrace = new Error().stack // 堆栈第二行对应实例化调用的位置,过滤出文件路径,索引可根据实际堆栈格式调整 const callerLine = stackTrace.split('\n')[2] const filePath = callerLine.match(/\(([^:]+):\d+:\d+\)/)[1] // 预存处理好的命令名,避免每次调用getName重复计算 this._commandName = path.basename(filePath).split('.')[0] } getName() { return this._commandName } }
- 不同Node.js版本的堆栈输出格式可能有细微差异,首次使用建议先打印完整
stackTrace,确认实例化调用对应的行索引,部分环境下可能是stack.split('\n')[1] - 该方案仅适配Node.js环境,完全匹配Discord.js机器人的开发场景
- 若你的代码会经过压缩、打包处理,需要配置构建工具保留文件名、行号信息,否则会导致解析失败
如果能接受极少量的传参代码,更推荐显式传入当前文件的__filename,性能更高且完全不受运行环境、构建配置的影响,实现如下:
// 类定义内构造函数 constructor(fileName) { this._commandName = require('path').basename(fileName).split('.')[0] } // 各个命令文件内实例化时传入当前文件的__filename const command = new CustomCommand(__filename)
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

