Я хотел бы создать загрузчик Webpack (или плагин), который позволил бы заменить вызов определенного метода на результат, возвращаемый этим методом во время компиляции.Например, предположим, у меня есть файл с именем transpile_time.js :
import {SomeUsefullStuff} from 'a_very_cool_lib'; //<-- this should be resolved correctly
module.exports = function{
//let's assume that 'a_very_cool_lib' is used somewhere here
return 'console.log(\'tralala\')';
}
И у меня есть еще один файл с именем App.ts :
import {default as tt} from './transpile-time';
....
function someFunc(){
...
tt(); // <------ I want this code to be replaced to
// 'console.log(\'tralala\')'
// during the compilation process
}
Для App.js используется мой пользовательский загрузчик.С помощью Esprima и Estraverse и Escodegen я могу манипулировать источниками, но в какой-то момент мне нужно разрешить зависимость
import {default as tt} from './transpile-time';
динамически в моем загрузчике в связи с тем, что он может иметь свои собственные зависимости.В приведенном выше примере
import {SomeUsefullStuff} from 'a_very_cool_lib';
должно быть правильно разрешено.Webpack Loader API предлагает метод loadModule , который предоставляет источники и объект модуля.Последний теоретически содержит зависимости с их источниками, и я могу просмотреть их и заменить каждый оператор импорта соответствующим исходным кодом, а затем использовать eval.Но это довольно уродливо, я бы предпочел, чтобы Webpack делал эту работу.Например, есть объект compilation , кажется, что можно вставить несколько хуков, но это не очень хорошо описано.У кого-нибудь есть идея?
PS Я собираюсь использовать все это для разрешения шаблонов и генерации кода.
Обновление : после небольшого исследования того, как Webackработает внутренне ( эта статья была весьма полезна ), я думаю, что было бы лучше использовать плагин вместо загрузчика.И, вероятно, мне не нужны Esprima и другие инструменты, потому что Webpack также создает AST на некотором этапе.Но все же я не знаю, как его использовать.