Ответ 1
Код завернут в IIFE (Expression Exited Function Expression), что означает, что функция выполняется немедленно. Это означает следующее:
(function x() {
console.log('hello');
})();
Вы также можете сделать:
(function() {
console.log('hello');
}());
IIFE обычно используются для создания области "private" для небольшого кода, так что он играет хорошо (не конфликтует) ни с чем другим.
Вторая функция, которую вы предоставили, имеет больше смысла, и, возможно, первая из них должна быть просто примером.
Handlebars позволяет прекомпилировать ваши шаблоны, поэтому вам не нужно их компилировать во время выполнения. Также вам не нужно добавлять дополнительные HTTP-запросы только для загрузки шаблона.
Например, если у меня есть следующая структура проекта - (обратите внимание, что мои модели, коллекции и представления находятся в пределах main.js только для этого примера, и все мои файлы .js
находятся в моем корневой каталог):
├── Gruntfile.js
├── handlebars-v2.0.0.js
├── index.html
├── main.js
├── package.json
└── templates
└── todo.handlebars
Мой todo.handlebars
выглядит так: просто html с синтаксисом Handlebars:
<h3>{{title}}</h3>
<p>Created by: {{author}}</p>
Чтобы предварительно скомпилировать мой шаблон, я бы сделал следующее в командной строке (вам нужно установить предварительный компилятор handle script с помощью: npm install -g handlebars
):
> handlebars templates/todo.handlebars -f todo.tpl.js
Теперь моя структура проекта выглядит так:
├── Gruntfile.js
├── handlebars-v2.0.0.js
├── index.html
├── main.js
├── package.json
├── templates
│ └── todo.handlebars
└── todo.tpl.js
Вы увидите, что файл todo.tpl.js
был добавлен в мой корневой каталог. Я мог бы назвать это чем-то другим, если бы хотел, чтобы расширение было .js
, потому что файл содержит действительный код JavaScript. Также я мог бы указать другой каталог для его вывода. Помните, что файл todo.tpl.js
- это фактический шаблон, который будет использовать ваш Backbone View. Вы пишете свой HTML в todo.handlebars
и скомпилируете его как todo.tpl.js
.
Теперь, когда у меня есть файл todo.tpl.js
, я могу использовать Grunt, чтобы, возможно, соединить все мои файлы шаблонов JS в файле all_templates.js
, или я могу ссылаться на каждый файл непосредственно в моем HTML, например:
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="http://documentcloud.github.io/underscore/underscore-min.js"></script>
<script src="http://documentcloud.github.io/backbone/backbone-min.js"></script>
<script src="handlebars-v2.0.0.js"></script>
<script src="todo.tpl.js"></script> <!-- My Template for a Todo item -->
<script src="main.js"></script>
В моем Backbone View, который в моем случае живет внутри моего файла main.js, я бы получил шаблон следующим образом:
var TodoView = Backbone.View.extend({
tagName: 'li',
className: 'todo-item',
events: {
},
// You can grab your template function with the name you chose when
// you precompiled it from: `Handlebars.templates`
template: Handlebars.templates.todo,
initialize: function(options) {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
this.$el.html(this.template( this.model.toJSON() ));
return this;
}
});
И вы сделали! Подробнее здесь:
- http://handlebarsjs.com/precompilation.html
- https://www.npmjs.org/package/handlebars
- http://code.tutsplus.com/tutorials/introduction-to-handlebars--net-27761 (читайте, где он говорит о предварительной компиляции)