Парсер плагинов Webpack не находит локальные или модульные вызовы функций

Я пишу плагин веб-пакета для анализа кода, который хочет найти все экземпляры имени функции в пакете веб-пакета.

Я сделал репо для этого вопроса: https://github.com/RonPenton/webpack-parser-fail-demo

Итак, синтаксический анализатор действительно прост, просто выглядит так:

    class ParsePlugin {
    apply(compiler) {
        compiler.plugin('compilation', function (compilation, data) {

            data.normalModuleFactory.plugin('parser', function (parser, options) {

                parser.plugin(`call $findme`, function (expr) {
                    console.log("found $findme!");
                });
            });
        });
    }

https://github.com/RonPenton/webpack-parser-fail-demo/blob/master/parse.js

Все, что я хочу сделать, это найти все экземпляры $findme() в коде и записать информацию о них. Позже я, возможно, даже изменю звонки, но это уже другой день.

Когда я предоставляю этот исходный файл, все в порядке: https://github.com/RonPenton/webpack-parser-fail-demo/blob/master/good.js

$findme("Testing");
$findme("Testing too...");

Когда я запускаю webpack, вывод показывает, что оба экземпляра были найдены:

found $findme!
found $findme!
Hash: a6555af5036af17d9320
Version: webpack 3.6.0
Time: 69ms
  Asset     Size  Chunks             Chunk Names
good.js  2.52 kB       0  [emitted]  main
   [0] ./good.js 47 bytes {0} [built]

Но когда я использую другую точку входа, где функция определяется либо локально (https://github.com/RonPenton/webpack-parser-fail-demo/blob/master/bad.js) или во внешнем модуле (https://github.com/RonPenton/webpack-parser-fail-demo/blob/master/bad2.js), вдруг парсер перестает находить эти методы.

function $findme(input) {
    console.log(input);
}
$findme("Testing");
$findme("Testing too...");

====

import { $findme } from './findme';
$findme("Testing");
$findme("Testing too..."); 

Так в чем же дело? Я попытался копаться в исходном коде веб-пакета, и, насколько я могу судить, это кажется преднамеренным. Но нет буквально никакой документации о том, почему это сделано именно так, и не видно комментариев.

Разве это не то, что можно сделать с помощью плагинов?

Спасибо за помощь заранее.


person Ron Penton    schedule 16.09.2017    source источник
comment
Вы когда-нибудь находили решение для этого?   -  person Thinking Sites    schedule 24.01.2019


Ответы (1)


Парсер веб-пакета странно вызывает эти хуки только тогда, когда ваши функции вызываются или извлекаются определенным образом. Вот почему ваш хук работал, когда функция вызывалась одним способом, но не работал, когда она откуда-то импортировалась.

Я пытался найти все вызовы метода объекта и имел ту же проблему.

Эта проблема github, созданная другим человеком, более подробно описана: https://github.com/webpack/webpack/issues/9480

Чтобы решить эту проблему, вам нужно обмануть синтаксический анализатор веб-пакетов, заставив его думать, что вызовы функций/методов, для которых он по какой-то причине не хочет вызывать перехватчики, являются идентификаторами, что-то вроде того, что сделано здесь: https://github.com/aurelia/webpack-plugin/blob/9f6f7983312c66f857e79b744e4ec257cc287b8b/dist/InlineViewDependenciesPlugin.js

Вот соответствующие фрагменты кода веб-пакета: введите здесь описание изображения введите здесь описание изображения

Вам нужно использовать хук парсера «evaluate», чтобы вернуть пользовательский экземпляр BasicEvaluatedExpression, у которого isIdentifier установлено в true для всех вызовов функций, которые вы хотите найти. Тогда хук call будет вызываться с полным выражением. В моем случае мне нужно полное CallExpression, содержащее как функцию, так и ее аргументы.

person Fabis    schedule 24.03.2021