Невозможно переназначить переменную в плагине webpack с помощью обработчика парсера - PullRequest
0 голосов
/ 13 ноября 2018

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

Идеальным сценарием было бы иметь возможность передать имя файла, имя переменной и значение переменной в плагин (для краткости я оставил конструктор для получения этих аргументов), а затем переопределил / переназначил их в данном файле.

т.е. Index.ts будет иметь let myVariable = false;, и я хотел бы переключить его на true, основываясь на переданных параметрах в webpack.

С помощью приведенного ниже кода я могу использовать синтаксический анализатор для поиска переменной, но я не могу изменить ее. Я пробовал statement.declarations[0].init.raw = "true" и statement.declarations[0].init.value = true, но выходной файл index.js по-прежнему имеет исходное значение false.

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

class MyPlugin {
    apply(compiler) {
        compiler.hooks.beforeCompile.
            tap('MyPlugin', ({ normalModuleFactory }) => {

                normalModuleFactory.hooks.parser.
                    for("javascript/auto").
                    tap("MyPlugin", handler);
                normalModuleFactory.hooks.parser.
                    for("javascript/dynamic").
                    tap("MyPlugin", handler);
                normalModuleFactory.hooks.parser.
                    for("javascript/esm").
                    tap("MyPlugin", handler);
        });

        function handler(parser, options) {
            parser.hooks.statement.tap('MyPlugin', (statement) => {
                const module = parser.state.module;
                if (module.resource 
                    && module.resource.endsWith('index.ts')
                    && statement.type === 'VariableDeclaration'
                    && statement.declarations[0].id.name === 'myVariable') {
                    // Do something here??
                }
            });
        }
    }
}

module.exports = MyPlugin;
...