2015-06-18 4 views
10

ich es geschafft, meine Aufgabe mit einem großen Schluck Plugin namens gulp-insert wie folgt zu erreichen:Wie kann ich während eines Kultivierungsvorgangs Inhalte in eine Datei einfügen?

gulp.task('compile-js', function() { 
    // Minify and bundle client scripts. 
    var scripts = gulp.src([ 
    srcDir + '/routes/**/*.js', 
    srcDir + '/shared/js/**/*.js' 
    ]) 
    // Sort angular files so the module definition appears 
    // first in the bundle. 
    .pipe(gulpAngularFilesort()) 
    // Add angular dependency injection annotations before 
    // minifying the bundle. 
    .pipe(gulpNgAnnotate()) 
    // Begin building source maps for easy debugging of the 
    // bundled code. 
    .pipe(gulpSourcemaps.init()) 
    .pipe(gulpConcat('bundle.js')) 
    // Buffer the bundle.js file and replace the appConfig 
    // placeholder string with a stringified config object. 
    .pipe(gulpInsert.transform(function (contents) { 
     return contents.replace("'{{{appConfigObj}}}'", JSON.stringify(config)); 
    })) 
    .pipe(gulpUglify()) 
    // Finish off sourcemap tracking and write the map to the 
    // bottom of the bundle file. 
    .pipe(gulpSourcemaps.write()) 
    .pipe(gulp.dest(buildDir + '/shared/js')); 

    return scripts.pipe(gulpLivereload()); 
}); 

Was ich tue unsere App-Konfigurationsdatei liest, die durch das config Modul auf npm verwaltet wird. Die Verwendung unserer Konfigurationsdatei aus serverseitigem Code ist mit var config = require('config'); ein Kinderspiel, aber wir sind eine Single-Page-App und benötigen häufig Zugriff auf die Konfigurationseinstellungen auf der Client-Seite. Dazu stecke ich das Konfigurationsobjekt in einen Angular-Dienst.

Hier ist der Angular Service vor dem Schluckaufbau.

angular.module('app') 
    .factory('appConfig', function() { 
    return '{{{appConfigObj}}}'; 
    }); 

Der Platzhalter ist in einer Reihe, so dass es für einige der anderen schlucken Plugins gültig JavaScript ist, dass die Datei zuerst verarbeiten. Das gulpInsert Dienstprogramm lässt mich die Konfiguration wie folgt einfügen.

.pipe(gulpInsert.transform(function (contents) { 
    return contents.replace("'{{{appConfigObj}}}'", JSON.stringify(config)); 
})) 

Dies funktioniert, fühlt sich aber ein wenig hacky. Ganz zu schweigen davon, dass es die gesamte gebündelte Datei puffern muss, damit ich die Operation ausführen kann. Gibt es einen eleganteren Weg, um das Gleiche zu erreichen? Vorzugsweise eine, die es dem Strom ermöglicht, fließend weiterzufließen, ohne das ganze Bündel am Ende zu puffern? Vielen Dank!

+0

Ich habe etwas anderen Ansatz dazu gemacht. Ich habe eine JSON-Datei pro env erstellt. dev.config.js, prod.config.js & während des gulp dev/prod build ersetze ich meine env.config.js durch die entsprechende config.js und meine index.html enthält env.config.js. Das fühlt sich etwas sauberer an, als Suchen und Ersetzen in Dateien. – harishr

+0

Entschuldigung, aber was ist das Problem bei der Verwendung von Puffern? Streaming ist auch eine Art Pufferung, aber mit geringerer Größe. Allerdings bezweifle ich wirklich, dass dein ganzes bundle.js sogar 1 Mb überschreitet, was heutzutage fast nichts ist. Vielleicht sind Sie nicht mit der gesamten Ausführungszeit Ihres Builds zufrieden. In diesem Fall sollten Sie die "Watch" -Funktion verwenden. –

+0

Es ist eine große Enterprise-App Dimitry. Es ist noch nicht zu groß, aber es wird definitiv sein. Wir gingen mit dem Schluck für die Leistungssteigerungen, die Bauzeiten möglicherweise viel kürzer als die gleiche Einrichtung mit Grunt machen. Ich kümmere mich darum, Dinge rechtzeitig richtig zu machen, um jede mögliche Sekunde in die Zukunft zu bringen. – Chev

Antwort

5

Haben Sie schon gulp-replace-task?

So etwas wie

[...] 
.pipe(gulpSourcemaps.init()) 
.pipe(replace({ 
    patterns: [{ 
    match: '{{{appConfigObj}}}', 
    replacement: config 
    }], 
    usePrefix: false 
}) 
.pipe(gulpUglify()) 
[...] 
+1

Schön! Sieht so aus, als ob [es ersetzt den Mid-Stream] (https://github.com/outaTiME/gulp-replace-task/blob/master/index.js#L26-L54) wie gewünscht, anstatt auf alles zu warten Puffer am Ende. Netter Fund: D – Chev

+0

dieses Modul funktioniert super! Sehr leistungsfähig mit regulären Ausdrücken + Ersatzfunktionen. – plong0

2

Zugegeben, das fühlt sich ein bisschen hacky an, aber vielleicht etwas besser ... Ich benutze envify und gulp-env in einem React-Projekt. Du könntest so etwas tun.

gulpfile.js:

var config = require('config'); 
var envify = require('envify'); 

gulp.task('env', function() { 
    env({ 
     vars: { 
      APP_CONFIG: JSON.stringify(config) 
     } 
    }); 
}); 

gulp.task('compile-js', ['env'], function() { 
    // ... replace `gulp-insert` with `envify` 
}); 

Fabrik:

angular.module('app') 
    .factory('appConfig', function() { 
    return process.env.APP_CONFIG; 
    }); 
+0

Benetzt envify immer noch die gesamte Datei, bevor die Ersetzung durchgeführt wird? – Chev

+0

Ehrlich gesagt, ich weiß es nicht genau. Ich würde "nein" raten, weil entify in meinem Projekt schnell scheint, aber das wäre nur eine Vermutung. –

+0

Haben Sie am Ende eine Variable, die den gesamten Dateiinhalt als String enthält, an dem Sie dann die Ersetzung vornehmen? Wenn Sie dies tun, wird die gesamte Datei in den Speicher gepuffert.Die Art und Weise, wie ich es mache, ist auch schnell, es ist nur so, dass ich beim Schluck-Streaming-Paradigma bleiben und jede Nanosekunde abrasieren will, die ich kann. Diese Datei wird mit der Zeit immer größer werden. – Chev

Verwandte Themen