【问题标题】:js get filename of file containing class definitionjs 获取包含类定义的文件的文件名
【发布时间】:2017-12-16 17:56:34
【问题描述】:

我需要获取导入类的文件名:

文件A.js

export default class User {
}

fileB.js

import User from './fileA'

function getClassFilename(constructor) {
    // do something like __filename, but to get the filename where User is defined rather than the current filename
}

console.log(getClassFilename(User.constructor)) // fileA.js

这是一般的想法。然而实际用例是基于装饰器的:

文件A.js

import someDecorator from './decorator'

@someDecorator
class User {
}

装饰器.js

export default function (target) {
    // can I somehow get the target filename without passing it as a property?
}

【问题讨论】:

    标签: javascript filenames


    【解决方案1】:

    默认情况下您无法获得该信息,相关模块必须提供访问该信息的方法。

    您提到了__filename,所以我假设您使用的是 Node.js。提供User 的模块可以提供这样的信息:

    export const SourceFilename = __filename;
    

    请注意,如果没有 Node 的 __filename,则没有符合规范的方法来做到这一点(但有一个 under consideration 并且在被添加的道路上相当远)。


    更新问题的更新答案:提供此信息的类(构造函数)User 上没有存储任何内容。同样,定义User 的代码需要提供该信息(作为User 上的属性,作为您可以从模块中获取并单独传递给装饰器的东西等)。否则,您根本无法使用它。

    【讨论】:

    • 感谢您的建议。不幸的是,我现在不得不意识到我试图过多地概括我的用例,因为我试图在应用于类的装饰器中获取文件名。我会更新这个问题。很抱歉
    • @Chris:基本上相同的答案(我已经更新):除非模块使信息可用,否则您将无法使用它。
    • 很好的提示。我可以将文件名作为属性添加到类中,然后我可以访问它而无需显式地导出/导入它。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2012-02-24
    相关资源
    最近更新 更多