2017-06-01 16 views
12

Próbuję utworzyć wtyczkę do przeglądarki internetowej, która przeanalizuje kod dla określonej funkcji i zastąpi ją inną funkcją, ta wtyczka również narazi nową funkcję jako globalną.Wtyczka internetowa do zastąpienia funkcji inną wersją

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; 

aktualizacja/rephrase

Mam problem tutaj, kiedy compiler.parser.plugin('call getValue', function someNameHandler(expr) {...} bloku skomentował funkcję ngt występować jako globalny.

kiedy nie jest komentowany, pojawia się błąd, ngt jest niezdefiniowany.

skomentował to znaczy /**/

znalazłem obejście tego, ale daleko jej wtedy pojęcia. teraz, co robię, to eksportuję anonimową funkcję, która robi to, co chcę.

Widać wtyczki tutaj: Github

+0

Hi, czy jest możliwe, aby zwrócić uwagę na następujące punkty? W jaki sposób znacznik "reactjs' jest trafny? Czy jest to pakiet internetowy 1 czy 2? (może być oczywiste dla eksperta, ale lepiej wyjaśnić) Czy mógłbyś powtórzyć dwa ostatnie zdania z dodatkowymi szczegółami? (przepraszam, mogę być ja, ale mam problem ze zrozumieniem, jaki jest problem) –

+0

@Hugues Moreau nie ma bezpośredniego związku z reactjs, ale jest używany do reactjs, webpack 1. i zaktualizowałem pytanie o więcej szczegółów. –

+1

dlaczego nie pisać/używać wtyczki babel do tego? jest o wiele łatwiejsze, a babel jest przecież transpilerem. – Bamieh

Odpowiedz

-1

można zastąpić metodę opartą na środowisko. Powiedzmy, że masz sposób

function a(){ 
    //original defination 
} 

teraz oparte na środowisko, jeśli jest to produkcja mogłaby zrobić coś takiego

if (environment.production) { 
    function a(){ 
    //overridden defination 
    } 
} 
Powiązane problemy