如何在Webpack解析器中获取文件名?

3
我正在开发一个插件,收集具有特定名称的模块中的导出项。通过解析器导出钩子,我已经从各个文件中获取了数据,但是我似乎找不到如何提取解析器所操作的实际模块。
最初的回答: 我正在编写一个插件,用于从模块中收集特定名称的导出项。我已经通过解析器导出挂钩从各个文件中提取了数据,但是我无法确定如何提取解析器正在操作的实际模块。
// hook into the module factory and get the exports
compiler.hooks.normalModuleFactory.tap(pluginName, factory => {
    factory.hooks.parser.for('javascript/auto').tap(pluginName, parser => {
                    parser.hooks.export.tap(pluginName, (node) => {
                        this.parseMetadataNode(node);
                    });
    });
});

parseMetadataNode是实际提取导出的方法,已经运行良好。

我该如何找到节点操作的模块或userRequest?我需要该节点的文件名!

请注意,该节点的文件名可以通过module或userRequest属性获得。

最初的回答:

您可以在该节点上查找module或userRequest属性,以获取该节点正在操作的模块或用户请求的文件名。


只是猜测,在webpack文档中,这个exportImport钩子似乎是importexport的组合,它似乎可以同时提供节点和源代码--你尝试使用这个钩子了吗? - undefined
获取节点数据很顺利。我可以轻松解析它。问题在于获取文件名,因为据我所理解,节点似乎没有与文件名关联。 - undefined
1个回答

5

您可以检查parser.state

compiler.hooks.normalModuleFactory.tap(pluginName, factory => {
    factory.hooks.parser.for('javascript/auto').tap(pluginName, parser => {
         parser.hooks.export.tap(pluginName, (node) => {
           const { module: { rawRequest } } = parser.state;
           // ..
         });
    });
});

1
我认为parser.state.module.resource更好。它提供了源文件的绝对文件路径,没有任何加载器路径的前缀。此外,parser.state.current === parser.state.current - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接