Я пишу плагин веб-пакета для анализа кода, который хочет найти все экземпляры имени функции в пакете веб-пакета.
Я сделал репо для этого вопроса: 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...");
Так в чем же дело? Я попытался копаться в исходном коде веб-пакета, и, насколько я могу судить, это кажется преднамеренным. Но нет буквально никакой документации о том, почему это сделано именно так, и не видно комментариев.
Разве это не то, что можно сделать с помощью плагинов?
Спасибо за помощь заранее.