Использование предварительно скомпилированных шаблонов с Handlebars.js (среда jQuery Mobile) - PullRequest
67 голосов
/ 28 декабря 2011

Я немного борюсь с предварительной компиляцией шаблонов в Handlebars. Мой проект jQuery Mobile становится довольно большим по шаблонам, и я хочу предварительно скомпилировать используемые мной шаблоны.

Однако я не могу найти хорошее объяснение (например, пошаговое руководство), как это сделать с помощью Handlebars.

У меня все еще есть встроенные шаблоны, использующие теги сценария. У меня установлены рули с помощью NPM. Но теперь я немного заблуждаюсь.

Я предполагаю, что буду делать что-то вроде

handlebars -s event.handlebars > event.compiled

а как-то включая содержимое события event.com? Но тогда как это назвать.

Я так называю свои шаблоны

var source = $('#tmpl_profile').html(),
template = Handlebars.compile(source),
context = user.profile()),
html    = template(context);

Надеюсь, кто-то может пролить свет на это для меня.

Ответы [ 5 ]

115 голосов
/ 29 декабря 2011

Итак, после долгих проб и ошибок (это лучший способ научиться этому), вот способ, который мне подходит.

Сначала - экстернализуйте все ваши шаблоны, скажем, у вас есть шаблон внутри тегов скрипта, как

<script id="tmpl_ownevents" type="text/templates">
    {{#unless event}}
        <div class="notfoundevents"><p>No events for you</p></div>    
    {{/unless}}
</script>

Создайте новый файл с именем events.tmpl и скопируйте / вставьте в него шаблон. Обязательно удалите сами элементы скрипта, этот укусил меня в a ..

Установите скрипт командной строки Handlebars примерно так

npm install -g handlebars

перейдите в папку, в которую вы сохранили events.tmpl, и запустите

handlebars events.tmpl -f events.tmpl.js

Включите скомпилированный JavaScript в ваш HTML после того, как вы включили Handlebars.js

<script src="events.tmpl.js"></script>

Теперь все, что осталось, это заменить ваш обычный код шаблона на что-то похожее на следующее

var template = Handlebars.templates['events.tmpl'], // your template minus the .js
    context = events.all(), // your data
    html    = template(context);

И вот, супер быстрые скомпилированные шаблоны Handlebars.

15 голосов
/ 30 ноября 2013

Еще один отличный вариант для этого - использовать GruntJS . После установки:

npm install grunt-contrib-handlebars --save-dev

Тогда внутри вашего gruntfile.js

grunt.initConfig({
    dirs: {
      handlebars: 'app/handlebars'
    },
    watch: {
      handlebars: {
        files: ['<%= handlebars.compile.src %>'],
        tasks: ['handlebars:compile']
      }
    },
    handlebars: {
      compile: {
        src: '<%= dirs.handlebars %>/*.handlebars',
        dest: '<%= dirs.handlebars %>/handlebars-templates.js'
      }
    }
});


grunt.loadNpmTasks('grunt-contrib-handlebars');

Затем вы просто набираете grunt watch с консоли, и grunt автоматически скомпилирует все файлы * .handlebars в ваш файл handlebars-templates.js.

Действительно рад способ работы с рулем.

10 голосов
/ 19 февраля 2014

Вот как я это делаю:

Подготовка

Мы просто будем предполагать, что все ваши переменные шаблона находятся в переменной с именем context:

var context = {
    name: "Test Person",
    ...
};

Где разместить ваши шаблоны

Создайте каталог, содержащий все ваши шаблоны (назовем его templates/) Добавьте сюда ваши шаблоны, называемые filename.handlebars.

Структура вашего каталога:

.
└── templates
    ├── another_template.handlebars
    └── my_template.handelbars

Компиляция шаблонов

Сначала перейдите в корневой каталог, затем скомпилируйте шаблоны с помощью программы CLI npm:

handlebars templates/*.handlebars -f compiled.js

Новый каталогструктура:

.
├── compiled.js
└── templates
    ├── another_template.handlebars
    └── my_template.handlebars

Использование

Включите compiled.js в вашу HTML-страницу после включения среды выполнения:

<script src="handlebars.runtime.js"></script>
<script src="compiled.js"></script>

Визуализируйте ваши шаблоны с использованием глобального Handlebars объект:

// If you used JavaScript object property conform file names
// Original filename: "my_template.handlebars"
Handlebars.templates.my_template(context)

// if you used special characters which are not allowed in JavaScript properties
// Original filename: "my-template.handlebars"
Handlebars.templates["my-template"](context)

Примечания

Обратите внимание на расширение файла .handlebars.Он автоматически удаляется при компиляции шаблонов.

Дополнительно: если вы используете одну из IDE Jetbrains вместе с плагином Handlebars / Mustache , вы даже получаете довольно хорошую поддержку редактора.

6 голосов
/ 22 января 2014

Предварительная компиляция шаблонов руля с Grunt

Предполагается, что у вас установлен Node.js. Если нет, то иди и сделай это.

1) Настройка зависимостей узлов:

В корневой каталог приложений добавьте файл с именем package.json. Вставьте в этот файл следующее:

{
  "devDependencies": {
   "grunt-contrib-handlebars": "~0.6.0",
    "grunt-contrib-watch": "~0.5.3",
    "handlebars": "~1.3.0"
  },
}

Этот JSON-файл сообщает Node, какие пакеты ему нужно установить. Это помогает очень быстро начать работу других разработчиков, как вы увидите на следующем шаге.

2) Установка зависимостей узла:

В вашем терминале / командной строке / powershell cd в корневой каталог проектов и выполните следующие команды:

npm install grunt -g
npm install grunt-cli -g

И для установки зависимостей, перечисленных в вашем package.json:

npm install

Теперь вы установили все необходимые вам зависимости узлов. В корневом каталоге ваших проектов вы увидите node_modules folder.

3) Настройка Grunt:

В корневом каталоге ваших проектов создайте файл с именем Gruntfile.js. Вставьте в этот файл следующее:

module.exports = function(grunt) {

    var TEMPLATES_LOCATION        = "./src/templates/",       // don't forget the trailing /
        TEMPLATES_EXTENSION       = ".hbs",
        TEMPLATES_OUTPUT_LOCATION = TEMPLATES_LOCATION,       // don't forget the trailing /
        TEMPLATES_OUTPUT_FILENAME = "compiled_templates.js";  // don't forget the .js

    grunt.initConfig({
        watch: {
            handlebars: {
                files: [TEMPLATES_LOCATION + '**/*' + TEMPLATES_EXTENSION],
                tasks: ['handlebars:compile']
            }
        },
        handlebars: {
            compile: {
                src: TEMPLATES_LOCATION + '**/*' + TEMPLATES_EXTENSION,
                dest: TEMPLATES_OUTPUT_LOCATION + TEMPLATES_OUTPUT_FILENAME,
                options: {
                    amd: true,
                    namespace: "templates"
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-handlebars');
    grunt.loadNpmTasks('grunt-contrib-watch');

}

4) Настройка по вашему вкусу:

Если вы не используете Require.js , вам нужно изменить handlebars.compile.options.amd на false. Вы также можете настроить параметр namespace по своему вкусу. Если вы используете модули require / amd, свойство namespace не имеет значения (по умолчанию это "JST", если вы его удалите).

Поскольку все структуры проекта немного отличаются, вам нужно немного настроить Gruntfile. Измените константы TEMPLATES_LOCATION, TEMPLATES_EXTENSION, TEMPLATES_OUTPUT_LOCATION, TEMPLATES_OUTPUT_FILENAME в соответствии с вашим проектом.

Если ваши шаблоны разбросаны по всему приложению, вам нужно изменить TEMPLATES_LOCATION на самый низкий каталог. Убедитесь, что ваши шаблоны изолированы от ваших node_modules, bower_components или любых других сторонних каталогов, потому что вы не хотите, чтобы Grunt компилировал сторонние шаблоны в скомпилированные шаблоны ваших приложений. Если вы включите весь свой собственный код в каталог ./src, ./js, ./app, все будет в порядке.

5) Компиляция шаблонов с Grunt:

Чтобы запустить grunt в фоновом режиме, откройте свой терминал и cd в корневом каталоге своих проектов и выполните команду: grunt watch:handlebars (также работает grunt watch). При grunt, работающем в фоновом режиме, все изменения в ваших файлах шаблонов будут автоматически скомпилированы, а выходной файл, указанный handlebars.compile.dest, будет переписан по мере необходимости. Вывод будет выглядеть примерно так:

Running "watch" task
Waiting...

Чтобы запустить задачу компиляции в одиночку, откройте свой терминал и cd в корневом каталоге своих проектов и выполните команду: grunt handlebars:compile (также работает grunt:handlebars). Вывод будет выглядеть примерно так:

Running "handlebars:compile" <handlebars> task
File "./src/templates/compiled_templates.js" created.

Done, without errors.
3 голосов
/ 30 июля 2014

Альфа-обновление Handlebars 2.0.0:

@ Макрос довольно четко объяснил, как он работает с 1 частью шаблона, см. этот ответ о том, как заставить handlebars.js работать

Если вы видите «TypeError:« undefined »не является функцией» при использовании предварительно скомпилированных шаблонов:

Эта ошибка произошла в строке 436 «handlebar.runtime.js» при вычислении templateSpec.call (container, Handlebars, context, options.helpers, options.partials, options.data),

, поскольку установленный компилятор npm не соответствует используемому браузером.Последняя загруженная стабильная версия v1.3.0, в то время как если вы используете рули установки npm, она установит 2.0.0-alpha4 для вас.

Пожалуйста, проверьте ее, используя

handlebars any_your_template_before_compile.handlebars | grep "compiler"

, котораяесли вы действительно установили руль 2.0.0-alpha4:

this.compiler = [5, '>=2.0.0']

с первым номером будет указана версия для вашего компилятора руля.Введите следующий код в консоли браузера, посмотрите, соответствует ли результат версии.

Handlebars.COMPILER_REVISION

Если у вас есть компилятор 5 с браузером версии 4, у вас возникнет описанная выше проблема.

Чтобы исправить это, установите руль 1.3.0 с помощью следующей команды

npm install handlebars@1.3.0 -g

Затем попробуйте скомпилировать его снова, вы увидите это время, оно дает вам соответствующую информацию о версии, и вы можете использовать предварительно скомпилированные шаблоны.

this.compilerInfo = [4, '>=1.0.0']


Просто объясните, если у вас есть тонны шаблонов:

Сначала извлеките каждую часть ваших шаблонов в скобках: event.handlebars, item.handlebars и т. Д. Вы можете поместить их всев одной папке произнесите «/ templates»

Скомпилируйте все файлы и объедините их в 1 файл с помощью следующей команды:

handlebars *.handlebars -f templates.js

И включите этот файл handlebars.runtime в ваш HTML

<script src="/lib/handlebars.runtime.js"></script>
<script src="templates.js"></script>

Шаблоны будут вставлены в Handlebars.templates по их имени.Например, event.handlebars может быть доступен из Handlebars.tempaltes ['event'].

...