2012-03-27 75 views
16

我一直在使用require.js和一个handlebars模板(我已经添加了AMD模块的东西到handlebars)backbone.js应用程序,只读了预编译模板可以加快它的一个公平的位。Backbone中的Requiremat预编译的Handlebars模板?

我想知道如何去包括带有requirejs的预编译模板。我有一个公平的几个模板来编译(15以上),所以我不知道他们应该都在同一个输出文件或有自己的编译。此外,从看起来,编译的模板共享renderer脚本使用的相同的Handlebars命名空间,所以我不知道如何在我的文件中需要模板时去解决这个问题。

任何意见都会很棒!

回答

17

一个简单的方法是创建一个基于现有文本RequireJS插件!插入。这将加载和编译模板。 RequireJs将缓存并重新使用已编译的模板。

插件代码:

// hbtemplate.js plugin for requirejs/text.js 
// it loads and compiles Handlebars templates 
define(['handlebars'], 
function (Handlebars) { 

    var loadResource = function (resourceName, parentRequire, callback, config) { 
     parentRequire([("text!" + resourceName)], 
      function (templateContent) { 
       var template = Handlebars.compile(templateContent); 
       callback(template); 
      } 
     ); 
    }; 

    return { 
     load: loadResource 
    }; 

}); 

配置在main.js:

require.config({ 
    paths: { 
     handlebars: 'libs/handlebars/handlebars', 
     hb: 'libs/require/hbtemplate', 
    } 
}); 

使用在backbone.marionette观点:

define(['backbone', 'marionette', 
     'hb!templates/bronnen/bronnen.filter.html', 
     'hb!templates/bronnen/bronnen.layout.html'], 
     function (Backbone, Marionette, FilterTemplate, LayoutTemplate) { 
     ... 

如果您在使用大骨干.Marionette框架你可以用 重写默认的渲染器,这样它会绕过t他内置 模板加载器(用于加载/编译/缓存):

Marionette.Renderer = { 
    render: function (template, data) { 
     return template(data); 
    } 
}; 
+0

这很好,但它不处理偏色,是吗? – Leonidas 2012-11-21 03:37:35

+1

只要你注册他们我看不出为什么它不会工作 – 2012-12-03 23:36:31

+4

我最终使用这种技术取得了很好的成功,但我添加了一个有助于性能的转折。如果可能的话,我们希望使用预编译的模板,所以Grunt.js将我们所有的模板编译成一个名为JST []的关联数组,每个模板都由文件名提供。向上面的代码添加一些东西是很容易的,它检查JST的存在,然后检查该数组中的特定模板。如果它在那里,则返回预编译的模板。否则,按照图示进行加载并编译它。然后,您可以开发使用许多模板,您可以随意更改并在运行时使用预编译模板。 – 2012-12-19 21:19:03

相关问题