Задача Gulp для объединения JSON и Handlebars из партиалов в HTML

Я делаю простой веб-сайт для проверки концепции, используя JSON в качестве источника данных и Handlebars для механизма шаблонов, чтобы "объединить" эти две вещи в статический HTML-файл.

Веб-сайт будет очень модульным, поэтому каждый компонент будет построен с использованием "частичного" Handlebars, каждый из которых будет использовать данные из своего собственного файла JSON.

Структура разработки, которая у меня есть, выглядит примерно так:

src/
    models/
        header.json
        article.json
        footer.json

    partials/
        header.hbs
        article.hbs
        footer.hbs

    index.hbs

Содержимое файла index.hbs выглядит примерно так:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test App</title>
</head>
<body>
    {{> header}}
    {{> article}}
    {{> footer}}
</body>
</html>

Частицы пока очень просты. например header.hbs содержит:

<header>{{header}}</header>

У меня есть следующий файл gulp gulpfile.js что идет частично к тому, чего я хочу достичь:

var gulp = require('gulp');
var data = require('gulp-data');
var handlebars = require('gulp-compile-handlebars');
var rename = require('gulp-rename');

gulp.task('default', function () {
    var templateData = {
        header: 'Welcome'
    },
    options = {
        batch : ['./src/partials']
    }

    return gulp.src('src/index.hbs')
        .pipe(handlebars(templateData, options))
        .pipe(rename('index.html'))
        .pipe(gulp.dest('dist'));
});

До сих пор он объединяет мои партиалы и выводит все красиво, как HTML, в файл с именем dist/index.html,

Чего не хватает, так это части данных JSON. В настоящее время данные JSON, используемые частями, определены в файле gulp (переменная templateData) но я хочу, чтобы каждый частичный использовался данные из src/models JSON-файлы для обеспечения четкого разделения. Имя файла JSON будет идентично имени .hbs частичное потребление.

Мне неясно, как это сделать. Документация https://www.npmjs.com/package/gulp-compile-handlebars предполагает, что использование gulp-data будет поддерживать то, что мне нужно, но я изо всех сил пытаюсь собрать воедино что-нибудь из документации gulp-data, которая работает для моего конкретного варианта использования.

Может ли кто-нибудь предложить, как я могу изменить свой файл gulp для достижения этой цели?

Большое спасибо.

1 ответ

Если я понимаю вопрос, вы можете использовать gulp-data для возврата объекта из вашего файла моделей.json, и он будет добавлен в ваш объект tempateData.

Используйте gulp-data для передачи объекта данных в шаблон на основе обрабатываемого файла handlebars. Если вы передадите данные шаблона, они будут расширены объектом из gulp-data.

Так что это сработало для меня.

gulp.task('default', function () {
    var templateData = {
        header: 'Welcome'
    },
    options = {
        batch : ['./src/partials']
    }

    return gulp.src('src/index.hbs')
        .pipe(data(function(file) {
            return require('./src/models/test.json');
        }))
        .pipe(handlebars(templateData, options))
        .pipe(rename('index.html'))
        .pipe(gulp.dest('dist'));
});

И вы можете изменить путь к вашему файлу.json в соответствии с именем файла src.hbs.

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