How do I replace the filenames listed in index.html with the output of gulp-rev?

后端 未结 5 1522
一生所求
一生所求 2021-02-04 03:13

I\'m using gulp-rev to build static files that I can set to never expire. I\'d like to replace all references to the generated files in index.html to these renamed files, but I

相关标签:
5条回答
  • 2021-02-04 03:22

    You could do it with gulp-useref like this.

    var gulp = require('gulp'),
        useref = require('gulp-useref'),
        filter = require('gulp-filter'),
        uglify = require('gulp-uglify'),
        minifyCss = require('gulp-minify-css'),
        rev = require('gulp-rev');
    
    gulp.task('html', function () {
        var jsFilter = filter('**/*.js');
        var cssFilter = filter('**/*.css');
    
        return gulp.src('app/*.html')
            .pipe(useref.assets())
            .pipe(jsFilter)
            .pipe(uglify())
            .pipe(rev())
            .pipe(jsFilter.restore())
            .pipe(cssFilter)
            .pipe(minifyCss())
            .pipe(rev())
            .pipe(cssFilter.restore())
            .pipe(useref.restore())
            .pipe(useref())
            .pipe(gulp.dest('dist'));
    });
    

    or you could even do it this way:

    gulp.task('html', function () {
        var jsFilter = filter('**/*.js');
        var cssFilter = filter('**/*.css');
    
        return gulp.src('app/*.html')
            .pipe(useref.assets())
            .pipe(rev())
            .pipe(jsFilter)
            .pipe(uglify())
            .pipe(jsFilter.restore())
            .pipe(cssFilter)
            .pipe(minifyCss())
            .pipe(cssFilter.restore())
            .pipe(useref.restore())
            .pipe(useref())
            .pipe(gulp.dest('dist'));
    });
    

    The problem is updating the asset paths in the html with the new rev file paths. gulp-useref doesn't do that.

    0 讨论(0)
  • 2021-02-04 03:29

    This helped me gulp-html-replace.

     <!-- build:js -->
        <script src="js/player.js"></script> 
        <script src="js/monster.js"></script> 
        <script src="js/world.js"></script> 
    <!-- endbuild -->
        var gulp = require('gulp');
        var htmlreplace = require('gulp-html-replace');
    
        gulp.task('default', function() {
          gulp.src('index.html')
            .pipe(htmlreplace({
                'css': 'styles.min.css',
                'js': 'js/bundle.min.js'
            }))
            .pipe(gulp.dest('build/'));
        });
    
    0 讨论(0)
  • 2021-02-04 03:31

    I've just written a gulp plugin to do this, it works especially well with gulp-rev and gulp-useref.

    The usage will depend on how you've set things up, but it should look something like:

    gulp.task("index", function() {
      var jsFilter = filter("**/*.js");
      var cssFilter = filter("**/*.css");
    
      return gulp.src("src/index.html")
        .pipe(useref.assets())
        .pipe(jsFilter)
        .pipe(uglify())             // Process your javascripts
        .pipe(jsFilter.restore())
        .pipe(cssFilter)
        .pipe(csso())               // Process your CSS
        .pipe(cssFilter.restore())
        .pipe(rev())                // Rename *only* the concatenated files
        .pipe(useref.restore())
        .pipe(useref())
        .pipe(revReplace())         // Substitute in new filenames
        .pipe(gulp.dest('public'));
    });
    
    0 讨论(0)
  • 2021-02-04 03:33

    Rather than trying to solve this problem multiple gulp steps (which gulp-rev seems to want you to do), I've forked gulp-rev to gulp-rev-all to solve this usecase in one gulp plugin.

    For my personal usecase I wanted to rev absolutely everything but as someone else raised an feature request, there should be the ability to exclude certain files like index.html. This will be implemented soon.

    0 讨论(0)
  • 2021-02-04 03:36

    I have confronted the same problem, I tried gulp-rev-all, but it has some path problem, not very free to use.

    So I figure out an solution, use gulp-rev and gulp-replace:



    At first I have a replace symbol in my html(js, css) files

    <link rel="stylesheet" href="{{{css/common.css}}}" />
    
    <script src="{{{js/lib/jquery.js}}}"></script>
    

    in css files

    background: url({{{img/logo.png}}})
    



    Second after some compile task, use gulp-replace to replace all the static files reference:

    take stylus compile in development as example:

    gulp.task('dev-stylus', function() {
       return gulp.src(['./fe/css/**/*.styl', '!./fe/css/**/_*.styl'])
                 .pipe(stylus({
                   use: nib()
                 }))
                 .pipe(replace(/\{\{\{(\S*)\}\}\}/g, '/static/build/$1'))
                 .pipe(gulp.dest('./static/build/css'))
                 .pipe(refresh());
    });
    



    In production environment, use gulp-rev to generate rev-manifest.json

    gulp.task('release-build', ['release-stylus', 'release-js', 'release-img'], function() {
      return gulp.src(['./static/build/**/*.css',
                       './static/build/**/*.js',
                       './static/build/**/*.png',
                       './static/build/**/*.gif',
                       './static/build/**/*.jpg'],
                       {base: './static/build'})
                 .pipe(gulp.dest('./static/tmp'))
                 .pipe(rev())
                 .pipe(gulp.dest('./static/tmp'))
                 .pipe(rev.manifest())
                 .pipe(gulp.dest('./static'));
    });
    

    Then use gulp-replace to replace the refs in static files with rev-manifest.json:

    gulp.task('css-js-replace', ['img-replace'], function() {
      return gulp.src(['./static/tmp/**/*.css', './static/tmp/**/*.js'])
                 .pipe(replace(/\{\{\{(\S*)\}\}\}/g, function(match, p1) {
                   var manifest = require('./static/rev-manifest.json');
                   return '/static/dist/'+manifest[p1]
                 }))
                 .pipe(gulp.dest('./static/dist'));
    });
    
    0 讨论(0)
提交回复
热议问题