Подтвердить что ты не робот

Плагин webpack для замены функции другим

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

class someName {
  constructor(local, domain, translationFile, options) {
  }

  apply(compiler) {

    // exposing ngt function as a global
    compiler.plugin('make', function(compilation, callback) {
      var childCompiler = compilation.createChildCompiler('someNameExpose');
      childCompiler.apply(new webpack.DefinePlugin({
        ngt: function(singular , plural, quantity) {
          return quantity == 1 ? singular : plural;
        }
      }));
      childCompiler.runAsChild(callback);
    });

    // searching for the getValue function
    compiler.parser.plugin(`call getValue`, function someNameHandler(expr) {

      // create a function to replace getValue with
      let results = 'ngt('+ expr.arguments  +')';
      const dep = new ConstDependency(results, expr.range);
      dep.loc = expr.loc;
      this.state.current.addDependency(dep);
      return true;
    });
  }
}

module.exports = someName;

обновить/перефразировать

У меня проблема, когда комментарий compiler.parser.plugin('call getValue', function someNameHandler(expr) {...} комментируется, функция ngt существует как глобальная.

когда он не комментируется, я получаю сообщение об ошибке, ngt undefined.

прокомментировал, что я имею в виду /**/

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

Вы можете увидеть плагин здесь: Github

4b9b3361

Ответ 1

Вы можете переопределить метод, основанный на среде. Скажем, у вас есть метод

function a(){
  //original defination
}

Теперь, основываясь на окружающей среде, если вы можете сделать что-то вроде этого

if (environment.production) {
   function a(){
     //overridden defination
   }
}