【问题标题】:Precompiled Handlebars templates in Backbone with Requirejs?使用Requirejs在Backbone中预编译Handlebars模板?
【发布时间】:2012-04-10 20:45:19
【问题描述】:

我一直在使用 require.js 和车把模板(我已将 AMD 模块的东西添加到车把)弄乱了一个骨干网应用程序,并且只是阅读了预编译模板可以加快它的速度位。

我想知道如何将预编译的模板包含在 requirejs 中。我有相当多的模板要编译(超过 15 个),所以我不确定它们是否应该都在同一个输出文件中,或者在编译后有自己的。此外,看起来,编译后的模板共享渲染器脚本使用的相同 Handlebars 命名空间,所以我不确定在我的文件中需要模板时如何处理。

任何建议都会很棒!

【问题讨论】:

    标签: backbone.js requirejs handlebars.js


    【解决方案1】:

    看看 Requirejs-Handlebarsjs 插件:https://github.com/SlexAxton/require-handlebars-plugin

    【讨论】:

    • 谢谢!这似乎非常有效。我喜欢它与 r.js 的集成方式
    【解决方案2】:

    一个简单的方法是基于现有文本创建一个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) {
            ...
    

    如果您使用出色的 Backbone.Marionette 框架,您可以 覆盖默认渲染器,使其绕过内置 模板加载器(用于加载/编译/缓存):

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

    【讨论】:

    • 只要你注册他们我看不出它为什么不起作用
    • 我最终使用这种技术取得了巨大的成功,但我添加了一个有助于提高性能的扭曲。如果可能,我们希望使用预编译的模板,因此 Grunt.js 将我们所有的模板编译到一个名为 JST[] 的关联数组中,每个都可以通过文件名获得。很容易在上面的代码中添加一些东西来检查 JST 的存在,然后是该数组中的特定模板。如果存在,则返回预编译的模板。否则如图所示进行加载并编译它。然后您可以使用许多可以随意更改并在运行时使用预编译的模板进行开发。
    • @JohnMunsch 不要以为您有关于上述解决方案的任何代码?这听起来正是我一直在努力的,但是目前我遇到了很多问题,我似乎无法让它发挥作用。你愿意分享吗? :)
    • @JohnMunsch 如果你可以分享的话,我也想在 GitHub 上看到代码作为插件!
    • @JohnMunsch 没关系!在我等待的时候,我推出了我自己的版本——如果你喜欢,请随意评论或使用。 gist.github.com/engram-design/5539338
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多