Webpack 的 'parser.hooks.callAnyMember' 没有被调用



我正在尝试为webpack构建一个插件,该插件遍历每个文件,分析是否使用了函数t(用于翻译(,然后获取第一个参数(应该是字符串(,并将其和所有结果写入json数组(在构建的同时(。

我已经成功地基于resolverFactory创建了一个"虚拟"依赖项,尽管我很确定以后需要做更多的工作,但我陷入了一个永远不会被调用的钩子中。

compiler.hooks.normalModuleFactory.tap('TranslationsPlugin', (factory) => {
factory.hooks.parser.for('javascript/auto').tap('TranslationsPlugin', (parser) => {
debugger;
parser.hooks.callAnyMember.for(functionName).tap('TranslationsPlugin', (expr) => {
debugger; 

第一个debugger被调用,我检查functionName是"t",但第二个调试器从未被调用。

我的猜测是,可能是webpack在babel transpiling或其他什么之后这样做的,并且函数的调用不相同。但是,在这种情况下,我不知道该怎么办

而且,我几乎找不到好的文档。非常感谢您的帮助!

好吧,我知道这是很久以前问过的,但我遇到了同样的用例和问题,并且能够解决它。

它在文档中有点晦涩,但您可以尝试使用evaluateCallMemberExpression而不是callAnyMember

parser.hooks.evaluateCallExpressionMember.for('t').tap('TranslationPlugin', (expression, param) => {
// TODO - check that the call expression is actually belong to the right object
// then collect the parameters...
});

在花了几个小时试图与callcallAnyMember讲道理但没有成功后,它为我完成了任务。

我认为,这个小差异背后的原因是,从对t的调用返回的值被分配给了一个变量,而不仅仅是对函数的调用。所以我试图收集数据的代码看起来是这样的:

const label = i18next.t('someKey');

我确实希望callAnyMember能够工作,但我仍然认为这是webpack中的一个问题(我在4.19.1版本中使用它(。但现在我会坚持这个解决方案

相关内容

  • 没有找到相关文章

最新更新