2015-06-18 2 views
10

मैं एक घूंट प्लगइन gulp-insert इस तरह कहा जाता है का उपयोग कर मेरे कार्य को पूरा करने में कामयाब रहे:गलप बिल्ड के दौरान मैं फ़ाइल में सामग्री कैसे सम्मिलित कर सकता हूं?

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

क्या मैं कर रहा हूँ जो NPM पर config मॉड्यूल द्वारा किया जाता है हमारे एप्लिकेशन के विन्यास फाइल पढ़ रहा है। सर्वर-साइड कोड से हमारी कॉन्फ़िगरेशन फ़ाइल प्राप्त करना var config = require('config'); का उपयोग करके एक स्नैप है, लेकिन हम एक सिंगल-पेज ऐप हैं और अक्सर क्लाइंट-साइड पर कॉन्फ़िगरेशन सेटिंग्स तक पहुंच की आवश्यकता होती है। ऐसा करने के लिए मैं एक कोणीय सेवा में कॉन्फ़िगरेशन ऑब्जेक्ट को भरता हूं।

यहां गिल्ड बिल्ड से पहले कोणीय सेवा है। इतना है कि यह अन्य घूंट प्लगइन्स कि पहली फ़ाइल पर कार्रवाई से कुछ के लिए मान्य JavaScript है

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

प्लेसहोल्डर एक स्ट्रिंग में है। gulpInsert उपयोगिता मुझे इस तरह की कॉन्फ़िगरेशन डालने देती है।

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

यह काम करता है लेकिन थोड़ा हैकी लगता है। उल्लेख नहीं है कि इसे पूरी बंडल फ़ाइल को बफर करना है ताकि मैं ऑपरेशन कर सकूं। क्या एक ही चीज़ को पूरा करने के लिए एक और शानदार तरीका है? पसंदीदा रूप से एक जो स्ट्रीम को अंत में पूरे बंडल को बफर किए बिना सुचारू रूप से बहने की अनुमति देता है? धन्यवाद!

+0

मैं यह करने के लिए कुछ अलग दृष्टिकोण अपनाया है। मैंने एक जेएसएन फ़ाइल प्रति एनवी बनाया। dev.config.js, prod.config.js और gulp dev/prod build के दौरान मैं उचित en.confs.js द्वारा env.config.js को प्रतिस्थापित करता हूं और my index.html env.config.js शामिल करता है। यह – harishr

+0

फ़ाइलों में खोज और प्रतिस्थापन से कुछ हद तक साफ महसूस करता है, लेकिन बफर का उपयोग करने की समस्या क्या है? स्ट्रीमिंग भी एक प्रकार का बफरिंग है, लेकिन छोटे आकार के साथ। हालांकि, मुझे सच में संदेह है कि आपका पूरा bundle.js भी 1 एमबी से अधिक है, जो आजकल लगभग कुछ भी नहीं है। शायद, आप अपने निर्माण के समग्र निष्पादन समय से संतुष्ट नहीं हैं। उस स्थिति में आपको 'घड़ी' कार्यक्षमता का उपयोग करना चाहिए। –

+0

यह एक बड़ा उद्यम ऐप डिमिट्री है। यह अभी तक बहुत बड़ा नहीं है, लेकिन यह निश्चित रूप से होगा। हम प्रदर्शन लाभ के लिए गल्प के साथ गए जो कि निर्माण के समय को गड़बड़ी के साथ एक ही सेटअप से काफी कम बनाता है। भविष्य में जाने वाले हर संभव दूसरे को बंद करने के लिए मैं चीजों को ठीक तरह से करने की देखभाल कर रहा हूं। – Chev

उत्तर

5

आप gulp-replace-task जांच की है?

कुछ

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

अच्छा! ऐसा लगता है [यह मध्य-स्ट्रीम को प्रतिस्थापित करता है] (https://github.com/outaTiME/gulp-replace-task/blob/master/index.js#L26-L54) इसके बदले में वांछित के बजाय वांछित अंत में बफर। अच्छा खोज: डी – Chev

+0

यह मॉड्यूल बढ़िया काम करता है! नियमित अभिव्यक्तियों + प्रतिस्थापन कार्यों के साथ बहुत शक्तिशाली। – plong0

2

मान्य है, यह थोड़ा सा हैकी भी लगता है, लेकिन शायद थोड़ा बेहतर ... मैं एक प्रतिक्रिया परियोजना में envify और gulp-env का उपयोग कर रहा हूं। आप कुछ इस तरह कर सकता है।

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

कारखाना:

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

प्रतिस्थापित करने से पहले पूरी फाइल को अभी भी बफर करें? – Chev

+0

ईमानदारी से, मुझे निश्चित रूप से पता नहीं है। मुझे लगता है कि "नहीं" क्योंकि मेरी परियोजना में envify तेजी से लगता है, लेकिन यह सिर्फ एक अनुमान होगा। –

+0

क्या आप एक वेरिएबल के साथ समाप्त होते हैं जिसमें सभी फाइल सामग्री एक स्ट्रिंग के रूप में होती है जिसे आप प्रतिस्थापन कार्य करते हैं? यदि आप करते हैं तो यह पूरी फ़ाइल को स्मृति में बफर कर रहा है।जिस तरह से मैं इसे कर रहा हूं वह भी तेज़ है, यह सिर्फ इतना है कि मैं गलती स्ट्रीमिंग प्रतिमान से चिपकना चाहता हूं और हर नैनोसेकंद को बंद कर सकता हूं जो मैं कर सकता हूं। समय-समय पर यह फ़ाइल बड़ी और बड़ी हो जाएगी। – Chev

संबंधित मुद्दे

 संबंधित मुद्दे