2015-06-18 17 views
10

tôi quản lý để thực hiện nhiệm vụ của tôi sử dụng một plugin ngụm gọi gulp-insert như thế này:Làm cách nào để chèn nội dung vào tệp trong khi xây dựng 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()); 
}); 

Những gì tôi đang làm là đọc tập tin cấu hình ứng dụng của chúng tôi được quản lý bởi các module config trên NPM. Lấy tập tin cấu hình của chúng tôi từ mã phía máy chủ là một snap sử dụng var config = require('config');, nhưng chúng tôi là một ứng dụng một trang và thường xuyên cần truy cập vào các thiết lập cấu hình ở phía máy khách. Để làm điều đó, tôi đặt đối tượng config vào một dịch vụ Angular.

Đây là dịch vụ Góc trước khi xây dựng gulp.

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

Trình giữ chỗ nằm trong chuỗi để JavaScript hợp lệ cho một số plugin gulp khác xử lý tệp trước. Tiện ích gulpInsert cho phép tôi chèn cấu hình như thế này.

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

Điều này có tác dụng nhưng hơi khó hiểu. Chưa kể rằng nó phải đệm toàn bộ tệp đi kèm để tôi có thể thực hiện thao tác. Có cách nào thanh lịch hơn để thực hiện điều tương tự không? Tốt nhất là cho phép luồng tiếp tục chảy trơn tru mà không phải đệm toàn bộ gói ở cuối? Cảm ơn!

+0

tôi đã lấy cách tiếp cận hơi khác nhau để này. Tôi tạo ra một tập tin json mỗi env. dev.config.js, prod.config.js và trong quá trình xây dựng gulp dev/prod tôi thay thế env.config.js của mình bằng config.js thích hợp và index.html của tôi bao gồm env.config.js. Điều này cảm thấy hơi sạch hơn tìm kiếm và thay thế trong các tập tin – harishr

+0

Xin lỗi, nhưng vấn đề của việc sử dụng bộ đệm là gì? Streaming cũng là một loại đệm, nhưng với kích thước nhỏ hơn. Tuy nhiên, tôi thực sự nghi ngờ rằng toàn bộ bundle.js của bạn vượt quá 1 Mb, hầu như không có gì vào ngày hôm nay. Có thể, bạn không hài lòng với thời gian thực hiện tổng thể của bản dựng. Trong trường hợp đó, bạn nên xem xét sử dụng chức năng 'watch'. –

+0

Đó là một ứng dụng doanh nghiệp lớn Dimitry. Nó chưa quá lớn, nhưng chắc chắn nhất là vậy. Chúng tôi đã đi với gulp cho hiệu suất đạt được mà làm cho thời gian xây dựng có khả năng ngắn hơn nhiều so với cùng một thiết lập với grunt. Tôi đang chăm sóc để làm những việc đúng sớm để cạo bỏ mọi giây có thể đi vào tương lai. – Chev

Trả lời

5

Bạn đã kiểm tra gulp-replace-task?

Something như

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

Tuyệt vời! Có vẻ như [nó làm thay thế luồng giữa] (https://github.com/outaTiME/gulp-replace-task/blob/master/index.js#L26-L54) như mong muốn thay vì chờ đợi tất cả đệm ở cuối. Nice tìm thấy: D – Chev

+0

module này hoạt động tuyệt vời! Rất mạnh mẽ với các biểu thức chính quy + các hàm thay thế. – plong0

2

Phải thừa nhận rằng, điều này cũng hơi khó hiểu, nhưng có thể tốt hơn một chút ... Tôi đang sử dụng envifygulp-env trong dự án React. Bạn có thể làm một cái gì đó như thế này.

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

nhà máy:

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

Không envify vẫn đệm toàn bộ tập tin trước khi thực hiện thay thế? – Chev

+0

Thành thật mà nói, tôi không biết chắc chắn. Tôi đoán "không" bởi vì envify có vẻ nhanh trong dự án của tôi, nhưng đó chỉ là một phỏng đoán. –

+0

Bạn có kết thúc với một biến chứa tất cả nội dung tập tin dưới dạng chuỗi mà sau đó bạn thực hiện công việc thay thế không? Nếu bạn làm vậy thì nó sẽ lưu toàn bộ tập tin vào bộ nhớ.Cách tôi đang thực hiện nó cũng nhanh, chỉ là tôi muốn gắn bó với mô hình luồng gulp và cạo bỏ mọi nano giây mà tôi có thể. Tập tin này sẽ ngày càng lớn hơn khi thời gian trôi qua. – Chev

Các vấn đề liên quan