首页 > 解决方案 > 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 转译之后执行此操作,并且该函数的调用方式不同。但是,在那种情况下,我不知道该怎么办。

而且,我几乎找不到很好的文档。任何帮助是极大的赞赏!

标签: webpackhookwebpack-plugin

解决方案


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

它在docs中有点晦涩难懂,但您可以尝试使用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...
});

在花了几个小时试图推理成功call和失败之后,它为我完成了这项工作。callAnyMember

我认为这种微小差异背后的原因是从调用返回的值t被分配给一个变量,而不是简单地调用一个函数。所以我试图收集数据的代码如下所示:

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

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


推荐阅读