2015-06-18 13 views
10

udało mi się zrealizować moje zadanie za pomocą wtyczki haustem nazwie gulp-insert tak:Jak mogę wstawić zawartość do pliku podczas budowania gulp?

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()); 
}); 

Co robię czyta plik konfiguracyjny naszej aplikacji, która jest zarządzana przez moduł config na KMP. Pobieranie naszego pliku konfiguracyjnego z kodu po stronie serwera jest łatwe dzięki użyciu var config = require('config');, ale jesteśmy aplikacją składającą się z jednej strony i często potrzebujemy dostępu do ustawień konfiguracyjnych po stronie klienta. W tym celu wciskam obiekt konfiguracyjny do usługi Angular.

Oto usługa kątowa przed budową łyka.

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

zastępczy jest w ciąg tak, że jest to ważny JavaScript dla niektórych innych wtyczek haustem, które przetwarzają plik w pierwszej kolejności. Narzędzie gulpInsert pozwala mi wstawić taką konfigurację.

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

To działa, ale wydaje się nieco hacky. Nie wspominając już o tym, że musi buforować cały dołączony plik tylko po to, abym mógł wykonać operację. Czy istnieje bardziej elegancki sposób na osiągnięcie tego samego? Korzystnie taki, który pozwala na płynne płynięcie strumienia bez buforowania całego pakietu na końcu? Dzięki!

+0

I miały nieco inne podejście do tego. Stworzyłem jeden plik json na env. dev.config.js, prod.config.js i podczas gulp dev/prod build zamieniam plik env.config.js na odpowiedni plik config.js, a mój plik index.html zawiera plik env.config.js. To wydaje się nieco czystsze niż wyszukiwanie i zamiana w plikach. – harishr

+0

Niestety, ale jaki jest problem z używaniem buforów? Strumieniowanie to także rodzaj buforowania, ale o mniejszym rozmiarze. Jednak naprawdę wątpię, że całe twoje bundle.js przekracza nawet 1 Mb, co jest prawie niczym w dzisiejszych czasach. Być może nie jesteś zadowolony z całkowitego czasu wykonania swojej kompilacji. W takim przypadku powinieneś spojrzeć na funkcję 'watch'. –

+0

To duża aplikacja dla przedsiębiorstw Dimitry. Nie jest jeszcze zbyt duży, ale zdecydowanie będzie. Wybraliśmy się z łykiem na wzrost wydajności, który sprawia, że ​​czasy budowy są potencjalnie znacznie krótsze niż te same ustawienia z chrząkaniem. Zajmuję się robieniem rzeczy odpowiednio wcześnie, aby zgolić każdą możliwą sekundę idącą w przyszłość. – Chev

Odpowiedz

5

Czy sprawdziłeś gulp-replace-task?

Coś

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

Nice! Wygląda na to, że [robi zastępczy strumień pośredni] (https://github.com/outaTiME/gulp-replace-task/blob/master/index.js#L26-L54) zamiast czekać na wszystko bufor na końcu. Nice find: D – Chev

+0

ten moduł działa świetnie! Bardzo potężny z wyrażeniami regularnymi + funkcje zastępcze. – plong0

2

Oczywiście jest to trochę hacky, ale może trochę lepiej ... Używam envify i gulp-env w projekcie React. Możesz zrobić coś takiego.

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` 
}); 

fabryczne:

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

Czy envify nadal buforuje cały plik przed wykonaniem zamiany? – Chev

+0

Szczerze mówiąc, nie wiem na pewno. Zgaduję, że "nie", ponieważ zazdrość wydaje się szybka w moim projekcie, ale to byłby tylko domysł. –

+0

Czy kończy się na zmiennej, która zawiera całą zawartość pliku jako ciąg, który następnie należy zastąpić pracy? Jeśli to zrobisz, buforuje cały plik do pamięci.Sposób, w jaki to robię, jest szybki, po prostu chcę trzymać się paradygmatu strumieniowania i golić każdą nanosekundę, jaką potrafię. Ten plik będzie się powiększał tylko z biegiem czasu. – Chev

Powiązane problemy