gulp-rev с useref переименовывает также файл index.html

Я новичок в использовании gulp и пытаюсь создать gulpfile для своего проекта.

Моя первая задача - объединить все теги сценария и ссылки, присутствующие в index.html, и заменить их только одним тегом. Для достижения этой цели я использую gulp-useref, как показано ниже.

gulp.task('useref', ['clean'], function () {
    return gulp.src(config.paths.app.src + 'index.html')    
    .pipe(gulpif('*.js', uglify()))
    .pipe(gulpif('*.css', cleanCSS()))
    .pipe(useref()) 
    .pipe(gulp.dest(config.paths.dist.src))
});

Эта штука просто объединяет и минимизирует все мои файлы JS и CSS и создает для них единый скрипт и тег ссылки. Все хорошо, пока здесь.

Теперь я хочу реализовать хеширование для объединенных файлов JS и CSS. Для этого я использую плагин gulp-rev и gulp-rev-replace, как показано ниже.

gulp.task('useref', ['clean'], function () {
    return gulp.src(config.paths.app.src + 'index.html')    
    .pipe(gulpif('*.js', uglify()))
    .pipe(gulpif('*.css', cleanCSS()))
    .pipe(useref())
    .pipe(rev())
    .pipe(revReplace()) 
    .pipe(gulp.dest(config.paths.dist.src))
});

Это также хорошо работает, но для одной маленькой вещи. Он создает хэшированные имена файлов не только для моих файлов JS и CSS, но и для моего файла index.html, а также ниже.

Есть ли способ избежать переименования файла index.html при сохранении хэшированных имен файлов JS и CSS, потому что мой сервер будет искать файл index.html в папке, а не index-*********. HTML?

Благодарю.

3 ответа

Я не уверен, что это идеальный способ решения проблемы, но мое решение было применить gulpif отфильтровать ресурсы CSS / JS, а затем вызвать rev(), revReplace все равно следует обновить индексный файл, чтобы использовать переименованные ресурсы css/js.

По сути, вы можете добавить следующий канал в ваш поток:

.pipe(gulpif(*.{js,css}, rev()))

Пример на основе вашего кода:

gulp.task('useref', ['clean'], function () {
    return gulp.src(config.paths.app.src + 'index.html')    
    .pipe(gulpif('*.js', uglify()))
    .pipe(gulpif('*.css', cleanCSS()))
    .pipe(useref())
    .pipe(gulpif('*.{js,css}', rev()))
    .pipe(revReplace()) 
    .pipe(gulp.dest(config.paths.dist.src))
});

У меня была такая же проблема, но я использовал gulp-rev-all вместо gulp-rev как ты.

Мое решение (обходной путь) будет по-прежнему работать для вас и других заинтересованных лиц.

По сути, вам нужно запустить еще одно задание gulp после того, как вы "ревизуете" все свои файлы.

я использую gulp-inject чтобы захватить недавно пересмотренные файлы и вставить их в мой файл index.html.

Шаг 1: использовать gulp-rev или же gulp-rev-all в моем случае, чтобы пересмотреть ваши файлы и сохранить их на свой /dist папка.

Пример:

gulp.task('rev', function () {

   var css= gulp
      .src(styles)
        .pipe(concat('main.css'))
     .pipe(RevAll.revision())
      .pipe(gulp.dest('dist/css'));

    var js = gulp
        .src(scripts)
        .pipe(concat('scripts.js'))
        .pipe(RevAll.revision())
        .pipe(gulp.dest('dist/js'));

    return merge(css, js); //merge is from the gulp plugin merge-stream.  It allows me to manipulate multiple streams in 1 task instead of having separate tasks.

});

Шаг 2: Используйте gulp-inject внедрить вновь созданные ссылки на файлы CSS / JS в ваш index.html

Разметьте ваш index.html следующим образом:

  <!-- inject:css -->
  <!-- endinject -->

<!-- inject:js -->
<!-- endinject -->

Шаг 3: Используйте gulp-inject чтобы захватить недавно пересмотренные файлы и внедрить их в ваш index.html

gulp.task('inject',
    function() {
        var jsSource = gulp.src('./dist/js/*.js', { read: false });
        var cssSource = gulp.src('./dist/css/*.css', { read: false });
        return gulp.src('./index.html')
            .pipe(inject(merge(jsSource, cssSource)))
            .pipe(clean({force:true}))
        .pipe(gulp.dest('./'));
    });

В моем проекте я НЕ помещаю index.html в папку dist. Может быть, я должен, но в этом примере / проекте я не.

Структура моей папки

index.html
--/dist
---/js
---/css
---/views

глоток впрыскивать документацию

gulp-rev-all документация

Пожалуйста, дайте мне знать, если есть какие-либо дополнительные вопросы, я хотел бы ответить на них

Пытаться

var ignoreIndexHtml = gulpfilter(['**/*', '!**/index.html'], { restore: true });

return gulp
    .src('......')
    .pipe('......')
    .pipe('......')
    .pipe(ignoreIndexHtml)
    .pipe($.rev())    
    .pipe(ignoreIndexHtml.restore)    
    .pipe($.revReplace())
    .pipe(gulp.dest('......'));
Другие вопросы по тегам