webpack - 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 转译之后执行此操作,并且该函数的调用方式不同。但是,在那种情况下,我不知道该怎么办。
而且,我几乎找不到很好的文档。任何帮助是极大的赞赏!
解决方案
好的,我知道很久以前有人问过这个问题,但是我遇到了相同的用例和相同的问题,并且能够解决。
它在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
)。但现在我会坚持这个解决方案
推荐阅读
- android - Flutter - 在自动完成搜索位置 - 参数类型“列表”
?不能分配给参数类型“列表” ' - java - 创建返回谓词集的方法
- sql-server-2008 - 为什么谷歌脚本 jdbc 相同的代码但几天后无法工作?
- c# - 如何将值传递给 . Angular 中的网络控制器
- php - 如何排序有关系的记录在查询结果中排在最后
- c++ - 以下代码中的 lamda capture 中的 0=1 和以下代码中的 0++ % xy 是什么?
- function - 将条目相关函数应用于 MATLAB 中矩阵的每个条目
- php - 如何检索旧选定复选框的数组以在 laravel 中编辑刀片?
- javascript - 如何将 Firestore 承诺直接解析为 Vue reactive() 代理?
- heroku - ERR_NAME_NOT_RESOLVED 在 peerjs 涉及的网站中收到此错误