2013-03-04 9 views
6

Ich fange mit beiden und . Ich habe einen Debug-Flag in der App wie:Set/Unset ein Debug-Flag während Grunt/Requirejs Build

var debugEnabled = true; 

Gibt es eine Möglichkeit, dies zu false eingestellt werden kann, automatisch aus der requirejs Optimierung innerhalb eines grunt Build ausgeführt werden?

EDIT: Um zu klären, ich habe nur eine Standardaufgabe, die die requirejs Optimierer läuft. Die Variable debugEnabled ist innerhalb eines der Module in meiner App selbst, sagen wir AppLogger, die eine Abhängigkeit zu main ist.

Gibt es eine Möglichkeit die requirejs Build diese Variable auf false gesetzt, so dass die verkleinerte Version von AppLoggerconsole.log usw.

Antwort

6

tun würde aufhören Angenommen, Sie haben zwei Aufgaben:

  • Entwicklung
  • Produktion

development tut das alles yo Zeug u müssen in der Entwicklung, wie jshint, Coffeescript Kompilation, ... production tut requirejs Optimierung, css minification, ...

Dann könnten Sie eine build Aufgabe registrieren, die Ihre Debug-Flag überprüft:

grunt.registerTask('build', 'run build', function() { 
     var task = debugEnabled ? 'development' : 'production'; 

     // run the targetted task 
     grunt.task.run(task); 
    }); 

Auf der Kommandozeile wird grunt build es ausführen.

Alternativ können Sie die option Parameter in Grunzen verwenden:

grunt.registerTask('build', 'run build', function() { 
     // start development build by default 
     var target = grunt.option('target') || 'development'; 

     // run the targetted task 
     grunt.task.run(target); 
    }); 

auf der Kommandozeile, grunt build --target=production es ausgeführt wird.

Edit:

Misunderstood die Frage ein wenig. Der einzige Weg, ich sehe, ist Ihr Debug-Flag in einem separaten Modul zu trennen:

path/to/debug.js

define(function() { 
    return true; 
}); 

Dann Sie eine Fertigungsversion erstellen (in der Nähe Ihrer Grunzen Aufgaben):

Pfad/zu/Grunt/Aufgaben/Debug.js

define(function() { 
    return false; 
}); 

Und in Ihrem requirejs Aufgabe, geben Sie diese Version:

requirejs: { 
    options: { 
     paths: { 
     debug: 'path/to/grunt/tasks/debug.js' 
     } 
    } 
} 
+0

Danke für Ihre Antwort. Was ich suchte, ist etwas anders und ich habe versucht, es mit einem Update auf die Frage zu klären. –

+0

Bearbeitete meine Antwort. Sehen Sie, ob das hilft. – asgoth

+0

Dies würde definitiv funktionieren, aber es wurde eine andere Möglichkeit gefunden, 'pragmas' aus der [r.js Beispiel-Build-Datei] (https://github.com/jburburke/r.js/blob/master/build/example.build) zu erstellen .js). Dies ist anscheinend das, was 'jquery.mobile' ebenfalls verwendet (https://github.com/jquery/jquery-mobile/blob/master/js/jquery.mobile.events.js). Ich habe deine Antwort akzeptiert, werde aber noch eine eigene hinzufügen mit dem, was für mich funktioniert. Vielen Dank! –

15

@asgoth ‚s answer würde auf jeden Fall arbeiten, aber herausgefunden paar andere Optionen als auch zu 'injizieren' (oder entferne lieber) Code während des Buildprozesses.

Wie in der example build.js file dokumentiert, könnten wir den Build pragmas Code-Snippets während des Build-Prozesses ein-/ausschließen.

//Specify build pragmas. If the source files contain comments like so: 
//>>excludeStart("fooExclude", pragmas.fooExclude); 
//>>excludeEnd("fooExclude"); 
//Then the comments that start with //>> are the build pragmas. 
//excludeStart/excludeEnd and includeStart/includeEnd work, and the 
//the pragmas value to the includeStart or excludeStart lines 
//is evaluated to see if the code between the Start and End pragma 
//lines should be included or excluded. If you have a choice to use 
//"has" code or pragmas, use "has" code instead. Pragmas are harder 
//to read, but they can be a bit more flexible on code removal vs. 
//has-based code, which must follow JavaScript language rules. 
//Pragmas also remove code in non-minified source, where has branch 
//trimming is only done if the code is minified via UglifyJS or 
//Closure Compiler. 
pragmas: { 
    fooExclude: true 
}, 

//Same as "pragmas", but only applied once during the file save phase 
//of an optimization. "pragmas" are applied both during the dependency 
//mapping and file saving phases on an optimization. Some pragmas 
//should not be processed during the dependency mapping phase of an 
//operation, such as the pragma in the CoffeeScript loader plugin, 
//which wants the CoffeeScript compiler during the dependency mapping 
//phase, but once files are saved as plain JavaScript, the CoffeeScript 
//compiler is no longer needed. In that case, pragmasOnSave would be used 
//to exclude the compiler code during the save phase. 
pragmasOnSave: { 
    //Just an example 
    excludeCoffeeScript: true 
}, 

ich ein guter Ort für das Lernen AMD und requirejs in Aktion auf den jquery.mobilecode, die wohl sehen könnte. Hier

ist das, was für mich gearbeitet:

AppLogger.js:

/* global console: false */ 
define(function() { 

    var debugEnabled = false; 
//>>excludeStart('appBuildExclude', pragmas.appBuildExclude); 
    debugEnabled = true; 
//>>excludeEnd('appBuildExclude'); 
    return { 
    log:function (message) { 
     if (debugEnabled && console) { 
     console.log('APP DEBUG: ' + message); 
     } 
    } 
    }; 

}); 

Gruntfile.js:

requirejs:{ 
    compile:{ 
    options:{ 
     baseUrl:"js/", 
     mainConfigFile:"js/main.js", 
     name:'main', 
     out:'js/main.min.js', 
     pragmas:{ appBuildExclude:true } 
    } 
    } 
} 

Mit dieser Konfiguration für die requirejs in meinem Gruntfile , der Abschnitt innerhalb der Pragmas von excludeStart und excludeEnd wurden aus der kompilierten/erstellten Datei entfernt.

Ich lerne immer noch requirejs, also behauptet nicht, dass dies die beste Praxis für diese Art von Sache ist, aber das hat sicherlich für mich gearbeitet.

+2

ist es nicht besser (aus Sicht der Optimierung), jede Protokollnachricht in solche Kommentare zu verpacken, nicht die Flagge? – shabunc

Verwandte Themen