Использование предварительно скомпилированных шаблонов с Handlebars.js(среда jQuery Mobile)
Я немного борюсь с предварительной компиляцией шаблонов в Handlebars. Мой проект jQuery Mobile становится довольно большим шаблоном, и я хочу предварительно скомпилировать шаблоны, которые я использую.
Однако я не могу найти хорошее объяснение (например, пошаговое руководство) о том, как это сделать с Handlebars.
У меня все еще есть все шаблоны с встроенными тегами script. У меня есть рули, установленные с помощью NPM. Но теперь я немного потерял, как действовать.
Я предполагаю что-то вроде
handlebars -s event.handlebars > event.compiled
и каким-то образом включать содержимое event.compiled? Но тогда, как это назвать.
Я так называю свои шаблоны
var source = $('#tmpl_profile').html(),
template = Handlebars.compile(source),
context = user.profile()),
html = template(context);
Надеюсь, кто-то может пролить свет на это для меня.
Ответы
Ответ 1
Итак, после долгих проб и ошибок (это лучший способ узнать это) здесь, как это работает для меня.
Сначала вырезайте все свои шаблоны, скажем, у вас есть шаблон внутри тегов script, например
<script id="tmpl_ownevents" type="text/templates">
{{#unless event}}
<div class="notfoundevents"><p>No events for you</p></div>
{{/unless}}
</script>
Создайте новый файл с именем events.tmpl и скопируйте/вставьте в него шаблон.
Обязательно удалите сами элементы script, это запустило меня в a..
Установите командную строку Handlebars script следующим образом
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.
Ответ 2
Еще один отличный вариант - использовать 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.
Действительно рад работать с рулями.
Ответ 3
Вот как я это делаю:
Подготовка
Предположим, что все ваши переменные шаблона находятся в переменной с именем 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, вы даже получаете довольно хорошую поддержку редактора.
Ответ 4
Предварительные компиляции шаблонов ручек с грантом
Предположим, что у вас установлен Node.js. Если вы этого не сделаете, сделайте это.
1) Настройка зависимостей Node:
В ваших корневых каталогах приложений добавьте файл с именем package.json
. Вставьте следующее в этот файл:
{
"devDependencies": {
"grunt-contrib-handlebars": "~0.6.0",
"grunt-contrib-watch": "~0.5.3",
"handlebars": "~1.3.0"
},
}
Этот файл JSON сообщает Node, какие пакеты ему нужно установить. Это помогает ускорить работу других разработчиков, как вы увидите на следующем шаге.
2) Установка Node Зависимости:
В вашем терминале/командной строке /powershell, cd
в корневой каталог проектов и выполните следующие команды:
npm install grunt -g
npm install grunt-cli -g
И для установки зависимостей, перечисленных в вашем пакете. json:
npm install
Теперь вы установили все необходимые зависимости Node. В корневом каталоге ваших проектов вы увидите 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) Настройка на ваш Liking:
Если вы не используете 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
). С запуском в фоновом режиме все изменения в файлах шаблонов будут автоматически скомпилированы, а выходной файл, указанный 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.
Ответ 5
Для Handlebars 2.0.0 alpha Update:
@Macro достаточно четко объяснила, как это работает с 1 частью шаблона, см. этот ответ для того, как сделать работу handlebars.js
Если вы видите, что "TypeError:" undefined "не является функцией" при использовании предварительно скомпилированных шаблонов:
Эта ошибка произошла на строке 4336 "handlebar.runtime.js" при evaluting templateSpec.call(контейнер, Handlebars, context, options.helpers, options.partials, options.data),
потому что установленный компилятор npm не соответствует той, которая используется браузером. Последняя версия стабильной версии - v1.3.0, а если вы используете npm install handlebars, она установит для вас 2.0.0-alpha4.
Пожалуйста, проверьте его, используя
handlebars any_your_template_before_compile.handlebars | grep "compiler"
который вам понравится, если вы действительно установили handlebar 2.0.0-alpha4:
this.compiler = [5, '>=2.0.0']
С первым номером стоит версия для вашего компилятора руля. Введите следующий код в консоли браузера, посмотрите, соответствует ли результат версии.
Handlebars.COMPILER_REVISION
Если у вас есть компилятор 5 с браузером revison 4, у вас возникнет вышеуказанная проблема.
Чтобы исправить это, установите handlebar 1.3.0 со следующей командой
npm install [email protected] -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'].