Есть ли способ переписать HTML для использования gulp-minified CSS?

Я борюсь со следующим:

Мой gulpfile.js компилирует все .less, минимизирует его и объединяет весь CSS в ./dist/all.min.css

Есть ли способ переписать файл HTML, удалить все теги стиля и добавить в него только один тег стиля, загружая минимизированный CSS?


person dlaxar    schedule 12.01.2014    source источник


Ответы (3)


Лучший способ справиться с этим — использовать один из HTML-инжекторов с самого начала. Я использую gulp-inject до сих пор с некоторым успехом.

Добавьте gulp-inject в свой проект:

npm i --save-dev gulp-inject

Предполагая, что у вас есть макет папки, подобный этому:

  • строить/
  • src/
    • index.html
    • less/
      • main.less
    • js/
      • app.js

Ваш HTML должен включать это там, где вы хотите вставить файлы CSS или JS, либо заголовок для обоих, либо заголовок для CSS и непосредственно перед телом для ваших файлов JS:

<!-- inject:css -->
<!-- any *.css files among your sources will go here as: <link rel="stylesheet" href="FILE"> -->
<!-- endinject -->

<!-- inject:js -->
<!-- any *.js files among your sources will go here as: <script src="FILE"></script> -->
<!-- endinject -->

Тогда ваш gulpfile выглядит примерно так:

gulp.task('build-styles', function() {
    // the return is important!
    return gulp.src('src/less/main.less')
            .pipe(less())
            .pipe(gulp.dest('build'));
});


gulp.task('build-js', function() {
    // the return is important if you want proper dependencies!
    return gulp.src('src/js/**/*.js')
            // lint, process, whatever
            .pipe(gulp.dest('build'));
});

gulp.task('build-html', function() {
    // We src all files under build
    return gulp.src('build/**/*.*')
            // and inject them into the HTML
            .pipe(inject('src/index.html', {
                        addRootSlash: false,  // ensures proper relative paths
                        ignorePath: '/build/' // ensures proper relative paths
                    }))
            .pipe(gulp.dest('build'));
});

gulp.task('build', ['build-styles', 'build-js'], function(cb) {
    gulp.run('build-html', cb);
});

gulp.task('default', ['build'], function() {
    gulp.watch('src/**/*.less', function() {
        gulp.run('build-styles');
    });
    gulp.watch(['build/**/*.*','!build/index.html', 'src/index.html'], function() {
        gulp.run('build-html');
    });
});

Это всего лишь грубая идея, и вы можете сделать намного больше, используя gulp-watch для инкрементных сборок, но ключ здесь в том, что мы смотрим на каталог build, чтобы выбрать, когда перестраивать файл HTML, и смотрим на каталог src для всего остального.

ПРИМЕЧАНИЕ:

Поскольку это получает много голосов, есть пара других плагинов, которые заменяют ссылки помимо gulp-inject. Вы можете просмотреть их и решить, подходит ли вам один из них лучше, особенно если вы не используете gulp-rev:

Также есть две библиотеки CDN, которые делают то же самое, но для ресурсов CDN

person OverZealous    schedule 21.01.2014
comment
Да, и, конечно же, вам понадобятся отдельные, но похожие шаги для окончательной задачи компиляции, которая обрабатывает конкатенацию, минимизацию и т. д. - person OverZealous; 21.01.2014
comment
Спасибо за это. Один вопрос: я пытался сделать свою задачу по умолчанию «очистить», затем «создать», затем «смотреть», но я продолжаю зацикливаться. Любые указатели? - person defmech; 24.01.2014
comment
Нашел вашу последовательность запуска :) - person defmech; 24.01.2014
comment
@OverZealous, могу ли я решить эту проблему stackoverflow.com/questions/21719526/ . каждый раз, когда файл изменяется, имя файла будет меняться. в любом случае я могу включить соответствующий файл css или js в свой html - person Anam; 28.02.2014
comment
@Anam: Если файлы доступны локально, вы, вероятно, могли бы написать функцию PHP для замены имен файлов в вашем выводе. В последнее время я не особо разбираюсь в PHP. - person OverZealous; 28.02.2014
comment
@OverZealous, можно ли обойтись глотком? - person Anam; 28.02.2014
comment
Я бы не рекомендовал gulp-usemin, он в черном списке: github.com /gulpjs/plugins/blob/master/src/blackList.json. Однако gulp-useref довольно хорош. - person tibalt; 12.08.2014

Вы хотите переписать его во время сборки? Почему бы не заменить все ссылки CSS одной ссылкой на all.min.css в вашем исходном коде? В любом случае, вы можете использовать подключаемый модуль gulp-replace для поиска и замены строки в ваших файлах во время сборка. Вот еще один пример проекта для просмотра:

Шаблон веб-приложения – шаблон интерфейса веб-приложения HTML5 Boilerplate дополнен таблицами стилей LESS и Gulp.js система сборки.

person Konstantin Tarkus    schedule 12.01.2014

См. также gulp-smoosher. Пример:

index.html

<html>
    <head>
        <!-- smoosh -->
        <link rel='stylesheet' href='styles.css'>
        <!-- endsmoosh -->
    </head>

styles.css

body {
    background: red;
}

Gulpfile.js

gulp.task('default', function () {
    gulp.src('index.html')
        .pipe(smoosher())
        .pipe(gulp.dest('dist'));
});

расстояние/index.html

<html>
    <head>
        <style>body {
            background: red;
        }</style>
    </head>
person Gabriel Florit    schedule 03.03.2014
comment
@Gabriel Florit, как минимизировать результаты? - person David Mauricio; 24.06.2015
comment
@DavidMauricio Вы хотите минимизировать поток после того, как он был смазан? Не знаете, как минимизировать html-поток. Вы, вероятно, хотели бы сделать это, прежде чем гладить. - person Gabriel Florit; 25.06.2015