我正在尝试为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...
});
在花了几个小时试图与call
和callAnyMember
讲道理但没有成功后,它为我完成了任务。
我认为,这个小差异背后的原因是,从对t
的调用返回的值被分配给了一个变量,而不仅仅是对函数的调用。所以我试图收集数据的代码看起来是这样的:
const label = i18next.t('someKey');
我确实希望callAnyMember
能够工作,但我仍然认为这是webpack
中的一个问题(我在4.19.1
版本中使用它(。但现在我会坚持这个解决方案