2017-06-01 5 views
12

Ich versuche ein Webpack-Plugin zu erstellen, das den Code für eine bestimmte Funktion analysiert und durch eine andere Funktion ersetzt. Dieses Plugin wird auch die neue Funktion als global verfügbar machen.webpack plugin, um eine Funktion durch eine andere zu ersetzen

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; 

Aktualisierung/umformulieren

Ich habe ein Problem hier, wenn compiler.parser.plugin('call getValue', function someNameHandler(expr) {...} Block die ngt Funktion kommentiert wird existieren als global.

wenn es nicht kommentiert, bekomme ich einen Fehler, NGT ist undefiniert.

kommentiert i /**/ bedeuten

ich eine Abhilfe für das gefunden, aber seine weit dann Idee. Genau jetzt, was ich tue, ich exportiere eine anonyme Funktion, die tut, was ich will.

können Sie das Plugin hier sehen: Github

+0

Hallo tun konnte, ist es möglich, die folgenden Punkte zu klären? Wie ist das 'reactjs'-Tag relevant? Ist es Webpack 1 oder 2? (könnte für einen Experten offensichtlich sein, aber besser es explizit machen) Können Sie die letzten 2 Sätze mit mehr Details umformulieren? (Entschuldigung, vielleicht bin ich es, aber ich habe Probleme zu verstehen, was das Problem ist) –

+0

@Hugues Moreau es hat keine direkte Beziehung zu reactjs, aber es wird für reactjs, webpack 1. verwendet und ich habe die Frage mit weiteren Details aktualisiert. –

+1

Warum schreibe/benutze ich kein babel Plugin? es ist viel einfacher und babel ist schließlich ein transpiler. – Bamieh

Antwort

-1

Sie die Methode auf die Umwelt basiert außer Kraft setzen kann. Angenommen, Sie haben eine Methode

haben
function a(){ 
    //original defination 
} 

nun auf die Umwelt basiert, wenn es sich um eine Produktion ist man so etwas wie dieses

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