Плагин 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 не определено.

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

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

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

2 ответа

Вы можете использовать плагин webpack-merge, очень полезно делать именно то, что вы хотите.

https://github.com/survivejs/webpack-merge

Вы можете переопределить метод в зависимости от среды. Допустим, у вас есть метод

function a(){
  //original defination
}

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

if (environment.production) {
   function a(){
     //overridden defination
   }
}
Другие вопросы по тегам