Предварительная компиляция
Используя предварительный компилятор Handlebars, вы можете предварительно скомпилировать свои шаблоны Handlebars, чтобы сэкономить время на клиенте и уменьшить необходимый размер библиотеки handlebars во время выполнения.
Начало работы
Сначала вам нужно установить node и npm. В ОС X:
$ brew install node
Предполагается, что у вас уже установлен Homebrew. Если нет, установите его сначала.
Далее, установите пакет npm Handlebars.
$ npm install handlebars -g
Использование флага
-g устанавливает пакет глобально, так что он может использоваться в любом проекте.Теперь вы готовы использовать предварительный компилятор:
$ handlebars <input> -f <output>
Компилятор вставит шаблоны в
Handlebars.templates. Если ваш входной файл person.handlebars, компилятор вставит его в Handlebars.templates.person. Этот шаблон будет функцией, которую можно непосредственно выполнить так же, как и шаблоны, скомпилированные локально. То есть, Handlebars.templates.person(context, options);
Если вы работаете со скомпилированными шаблонами, вам не нужно поставлять компилятор с вашим развернутым приложением. Вместо этого вы можете использовать более компактную «runtime» сборку.
<script src="/libs/handlebars.runtime.js"></script>
Помимо уменьшения размера загрузки, исключение компиляции на стороне клиента значительно ускорит время запуска, так как компиляция является самой дорогой частью Handlebars.
Оптимизации
Поскольку вы предварительно компилируете шаблоны, вы также можете применить несколько оптимизаций к компилятору. Первая позволяет указать список известных помощников компилятору
handlebars <input> -f <output> -k each -k if -k unless
Компилятор Handlebars оптимизирует доступ к этим помощникам для повышения производительности.
Когда все помощники известны во время компиляции, опция
--knownOnly обеспечивает наименьший сгенерированный код, который также обеспечивает самую быструю работу.Использование
Usage: node ./bin/handlebars [template|directory]...
Options:
-f, --output Output File
--map Source Map File [string] [default: undefined]
-a, --amd Exports amd style (require.js)
-c, --commonjs Exports CommonJS style, path to Handlebars module [default: null]
-h, --handlebarPath Path to handlebar.js (only valid for amd-style) [default: ""]
-k, --known Known helpers
-o, --knownOnly Known helpers only
-m, --min Minimize output
-n, --namespace Template namespace [default: "Handlebars.templates"]
-s, --simple Output template function only.
-N, --name Name of passed string templates. Optional if running in a simple mode. Required when operating
on multiple templates.
-i, --string Generates a template from the passed CLI argument.
"-" is treated as a special value and causes stdin to be read for the template value.
-r, --root Template root. Base value that will be stripped from template names.
-p, --partial Compiling a partial template
-d, --data Include data when compiling
-e, --extension Template extension. [default: "handlebars"]
-b, --bom Removes the BOM (Byte Order Mark) from the beginning of the templates.
-v, --version Prints the current compiler version
--help Outputs this message
Если используется обычный режим предварительного компилятора, результирующие шаблоны будут сохранены в объекте
Handlebars.templates с использованием относительного имени шаблона без расширения. Эти шаблоны можно выполнить так же, как и шаблоны.Если используется упрощенный режим, предварительный компилятор сгенерирует один javascript метод. Для выполнения этого метода он должен быть передан методу
Handlebars.template, и полученный объект может использоваться как обычно.Предварительная компиляция шаблонов внутри NodeJS
Если вы хотите предварительно скомпилировать шаблоны изнутри NodeJS — без вызова «handlebars» из командной строки — это можно сделать с помощью Handlebars.precompile. Передайте строковый результат этой функции своим клиентам, и они, в свою очередь, смогут обработать его с помощью Handlebars.template.
var template = "<div>whatever {{ name }}</div>";
var Handlebars = require("handlebars");
var compiled = Handlebars.precompile(template);
На стороне клиента у вас есть JavaScript, подобный следующему.
var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
Handlebars.partials["test1"] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
var helper;
return "<div>whatever "
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"name","hash":{},"data":data}) : helper)))
+ "</div>";
},"useData":true});
Наконец, вы можете динамически ссылаться на эти шаблоны в своем JavaScript.
var result = Handlebars.partials["test1"]({name : "yourname"});
//do whatever you want with the result
© 2011–2017 by Yehuda Katz
Licensed under the MIT License.
https://handlebarsjs.com/precompilation.html