Как правильно внедрить пересмотренные активы с gulp-inject в шаблоны Jade?

У меня есть node.js приложение с express промежуточное программное обеспечение. Статические страницы сделаны с использованием jade шаблонный движок и получить по запросу с res.render("template-name.jade");

ФайлыSASS и javascript минимизируются и помещаются в /build/js а также /build/css папки соответственно.

Кроме того, используя gulp с gulp-rev каждый файл получает строку ревизии, прикрепленную к его имени с созданным файлом манифеста. Следующий код задачи используется для файлов javascript:

gulp.task( "prepare_js", function() {
    gulp.src( "./js/*.js" )
    .pipe( annotate() )
    .pipe( gulp_if( isDev, uglify() ) )
    .pipe( rev() )
    .pipe( gulp.dest('build/js') )  // write rev'd assets to build dir
    .pipe( rev.manifest() )
    .pipe( gulp.dest('build/js') ) // write manifest to build dir
    .pipe( gulp.dest( "./build/js") )
});

Задача генерирует файл-манифест, например:

{
    "index.js": "index-d41d8cd9.js"
}

Аналогичная задача должна быть для компиляции sass в css.

Вопрос в том, как использовать gulp-inject правильно (в этой задаче или как отдельный) найти и заменить в каждом файле.jade только активы, определенные в этом файле.jade на активы со строкой ревизии?

Я вижу 2 основных подхода, как это решить.

Подход 1

Работайте с одними и теми же шаблонами jade каждый раз и каким-то образом определяйте в каждом файле.jade, какой файл (на основе оригинала, без присоединенной строки ревизии, имя файла) должен быть введен. Затем выполните поиск строк, оставшихся от предыдущего задания, и замените их новыми, имеющими новую строку ревизии.

Например, допустим, у нас есть 2 файла. Каждый из них может использовать как общие активы, так и некоторые конкретные.

// index.jade
script(src="/js/index-xxxxxx.js", type="text/javascript")
script(src="/js/more-js-xxxxxx.js", type="text/javascript")
link(rel="stylesheet", href="/css/index-xxxxxx.css")


// product.jade
script(src="/js/index-xxxxxx.js", type="text/javascript") // <-- here we use index-xxxxxx.js also 
link(rel="stylesheet", href="/css/file1-xxxxxx.css")
link(rel="stylesheet", href="/css/file2-xxxxxx.css")

Давайте предположим, что здесь xxxxxx определяет строки ревизии, оставленные от предыдущей задачи gulp. В нашем случае приведенные выше файлы можно изменить, добавив комментарии для инъекции, например:

// index.jade
<!-- index.js -->
script(src="/js/index-xxxxxx.js", type="text/javascript")
<!-- one-more-js-file.js -->
script(src="/js/one-more-js-file-xxxxxx.js", type="text/javascript")
<!-- styles.css -->
link(rel="stylesheet", href="/css/styles-xxxxxx.css")
<!-- endinject -->


// product.jade
<!-- product.js -->
script(src="/js/index-xxxxxx.js", type="text/javascript")
<!-- file1.css -->
link(rel="stylesheet", href="/css/file1-xxxxxx.css")
<!-- file2.css -->
link(rel="stylesheet", href="/css/file2-xxxxxx.css")
<!-- endinject -->

Это должно сказать gulp-inject, что конкретная строка должна быть изменена на новую, содержащую файлы с новой строкой ревизии.

Подход 2

Имейте 2 папки с шаблонами, одна из которых имеет все исходные шаблоны, другая с шаблонами после запуска задачи внедрения. Экспресс приложение будет указывать на папку 2 как место, где можно взять статику.

Во всех шаблонах в первой папке просто добавьте комментарии, какой файл должен быть добавлен, например:

// index.jade
<!-- index.js -->
<!-- one-more-js-file.js -->
<!-- styles.css -->
<!-- endinject -->


// product.jade
<!-- index.js -->
<!-- file1.css -->
<!-- file2.css -->
<!-- endinject -->

Каково было бы правильное решение здесь? И как написать / изменить задачу gulp, чтобы правильно добавить ресурсы с теми, у которых есть строка ревизии (на основе сгенерированного файла манифеста или как-то без него)?

Спасибо.

1 ответ

Что касается синтаксиса инъекций, я думаю, это должна быть одна пара для одного файла, например

<!-- index.js -->
<script src="index-xxxxxx.js"></script>
<!-- endinject -->

А что касается того, почему он не вводится правильно, то я думаю, вам нужно предварительно обработать файл Jade. Попробуйте тот же подход с вашим тестовым HTML-файлом, и он будет работать. Но Gulpjs нужно предварительно обработать Jade, чтобы сделать инъекцию, и до собственного Jade-компилятора Expressjs. Глоток-нефрит

Другие вопросы по тегам