【问题标题】:Best strategy to use HAML template with Backbone.js将 HAML 模板与 Backbone.js 一起使用的最佳策略
【发布时间】:2011-07-12 09:10:27
【问题描述】:

我正在进入 Backbone.js 为我的项目构建 javascript 代码,我喜欢 HAML 在后端(rails)上进行模板化,所以我想将它用于 Backbone Views 模板化。我知道 Javascript 有几个 HAML 端口,比如 https://github.com/creationix/haml-js 和主干轻松支持 JST 和 mustache。

改用haml模板的最佳方法是什么。

在客户端使用 HAML 有什么缺点吗?性能、额外的脚本加载时间(由 jammit 等资产打包工具负责)

【问题讨论】:

    标签: javascript templates haml backbone.js


    【解决方案1】:

    我知道你已经提到过它,但我建议将 haml-js 与 Jammit 一起使用。只需在您的 javascripts 和 assets.yml 中包含 haml.js 添加template_function: Haml 以及将您的模板文件包含到一个包中。例如

      javascript_templates:
        - app/views/**/*.jst.haml
    

    然后在您的视图中,您可以包含此包 (= include_javascripts :javascript_templates),Jammit 会将任何 .jst.haml 文件打包到 window.JST['file/path']。 (如果您查看页面源代码,您应该会看到一个类似 <script src="/assets/javascript_templates.jst" type="text/javascript"></script> 的 javascript 文件)

    要使用这些模板,只需调用 Jammit 创建的其中一个 JST。即

    $('div').html(JST['file/path']({ foo: 'Hello', bar: 'World' }));
    

    并且Jammit会使用Haml-js模板函数函数来渲染模板。

    注意:请务必在 Gemfile 中指向 Jammit 的 github 存储库,以获取支持 haml-js 工作所需的换行符的最新版本。

    【讨论】:

    • 谢谢,我会测试一下,如果可行,将其标记为答案
    • Jammit not supporting newline characters的问题已经解决,应该会包含在下一个版本中。
    • 有使用 .jst 文件的教程吗?我不明白您在打包后将如何使用它们。我习惯了$("#template_name").tmpl(data,helper)。您如何获得 jammit 打包的模板?
    • 我详细阐述了我的原始答案。让我知道这是否有帮助。
    【解决方案2】:

    我要试一试haml-coffee。 (没有双关语)我对咖啡脚本的赞美还不够;再加上它现在是 Rails 3.1 中的默认设置。现在我可以将 coffeescript 嵌入到我最喜欢的模板语言中,并进行预编译。

    哦,真高兴……现在开始工作了。

    【讨论】:

    • 我最近给了haml-coffee 很多爱,并使其完全符合 HAML。此外,我创建了haml_coffee_assets,用于在 Rails 3.1 资产管道中使用 haml-coffee 模板。
    • 现在这比“官方”答案要好得多,看看它是如何与资产管道开箱即用的(据我所知?)。我只是短暂地玩过它,但到目前为止,这看起来正是我所需要的。与 Backbone、Haml、Coffeescript、资产管道配合得很好。喜欢它!
    【解决方案3】:

    我知道这在某种程度上会绕过这个问题,但我们开始吧:)

    我的 Rails 应用程序使用 haml 来处理后端的所有视图。太棒了。由于某些原因(主要是 i18n),我不喜欢在客户端使用模板。我就是这样做的:

    • 在 ruby​​ haml 中创建所有模板并将它们存储到具有时髦类型的脚本标记中(我使用 text/js-template)。这将创建可以与 jquery 和骨干一起使用的预渲染 html。
    • 创建主干视图时,加载存储的模板并将其附加到文档中
    • 通过更改预先存在的模板呈现您的视图

    您只处理 html,而 jQuery 非常棒。对于一些不需要 i18n 的视图,我使用下划线模板,因为它已经存在了。

    至于 haml 模板性能,似乎 mustache 和 handlebars 更快。

    【讨论】:

    • 我之前使用过这种策略,我将预渲染的 html 模板存储在我的 html 内的隐藏元素中,然后克隆它并用数据填充它,但它是一个丑陋且不是 DRY 的代码,因此我很感兴趣在模板中。我喜欢胡须的无逻辑前提,但我喜欢 HAML 语法。我希望有办法以某种方式在客户端上使用它
    • 你的 AJAX 模板会不会和部分模板一样吗?
    【解决方案4】:

    我一直在开发 Rails 3/Backbone 应用程序,在评估了 hamlbarshaml_assets 和使用 haml-js 之后,我采取了不同的方法。

    这些都是为问题提供解决方案的可靠宝石,每个都有一定的权衡取舍。例如,Haml-js 需要在客户端渲染模板(这没有什么问题,这只是一种权衡)。 Hamlbars 和 haml_assets 都插入到资产管道中,但是因为它们存在于请求对象之外,所以一些助手将无法工作。两者都为此做了一些调整,包括 url 帮助器和 ActionView 帮助器,但不要期望与在视图中编写 haml 具有相同的功能。

    我的方法有点笨重(我计划将其放入引擎中),但它运行良好且易于复制。它会尽可能使用 haml_assets,但会退回到通过“显示”操作从“模板”控制器提供模板

    • 把你的视图放到view/templates/目录中
    • 您可以添加一个布局,将此视图呈现到 JST 函数中
    • 您可以指定显示操作以返回“application/javascript”作为其内容类型
    • 您可以在编写模板时访问所有助手
    • 您可以为“/template/whatever”添加脚本标签以呈现任何模板,或使用路由通配符来更好地组织视图。

    这种方法的好处是,因为您的视图可以从控制器访问,您可以选择将它们呈现为 jst 模板(通过模板控制器)或通过其他控制器作为部分。这将允许您直接从 url 提供对 seo 友好的页面(如 /products/widgets/super-cool-widget),如果用户可以获得缓存的模板化 /templates/widgets/super-cool-widget。

    【讨论】:

    • 能否请您解释一下您是如何实现对所有助手的访问的?
    【解决方案5】:

    我无法在 Craig 的线程上内联回答(我猜我需要某种声誉来发布现有答案),但您不再需要获取 jammit 的分支来使用 haml-js - 提交进入了jammit的主要分支。详情见这里:https://github.com/documentcloud/jammit/commit/b52e429f99cac3cd1aa2bf3ab95f1bfaf478d50d

    编辑:上一次 gem 发布是在 1 月,提交是在 3 月添加的,因此您需要设置 bundler 以针对 github 存储库运行或在本地构建它。如果您不使用 HEAD of jammit,您将无法正确解析模板,因为换行符已被剥离。

    我需要做的就是:

    1) 将以下内容添加到我的“assets.yml”文件中:

    模板函数:“Haml”

    2) 将我想要加载的 haml-js 源代码和模板添加到我的资产文件中: javascript: 核: - public/javascripts/vendor/haml.js 模板: - app/views/events/_form.haml.jst

    3) 确保我在 application.html.erb 中同时加载了核心和模板

    4) 通过 JST[filename](即,在本例中为 JST['_form'])访问我的源文件中的模板。一个值得一提的问题—— jammit 会查看你所有的模板并将它们命名为公共路径,所以如果你有 app/views/foo/file.jst 和 app/views/bar/file.jst,你可以访问使用 JST['foo/file.jst'] 和 JST['bar/file.jst']。如果您有 app/views/foo/file1.jst 和 app/views/foo/file2.jst,它们将直接位于 JST['file1.jst'] 和 JST['file2.jst'] - 这是刚开始使用前几个模板时很容易忘记。

    一切都很顺利。我不确定 Craig 为什么需要定义一个函数——我只是使用了 haml.js 提供的默认 Haml 函数,但也许我遗漏了一些东西。

    【讨论】:

    • 很高兴知道这一点。我想我在 YC 关于骨干的讨论中见过你(我实际上是从那里了解到的)
    • 感谢您的详细说明。我更新了我原来的帖子。我最初创建了一个函数,因为我遵循了关于使用 Mustache 模板的 jammit 帮助。没想到我可以直接打电话给Haml :-P
    【解决方案6】:

    看起来https://github.com/netzpirat/haml_coffee_assets 可以满足您的需求。 (window.JST 模板,用 HAML 编写,支持内联 coffescript)

    【讨论】:

      【解决方案7】:

      查看中间人。它包括 haml、sass、coffee、slim 等。它像 rails 一样使用 gems,并具有许多其他很棒的功能。

      http://middlemanapp.com/

      他们甚至有一个自定义的骨干扩展, https://github.com/middleman/middleman-backbone

      它还允许您将其构建为静态 html、css 和 js 以实现超快速加载。

      【讨论】:

        【解决方案8】:

        您可以尝试 Express with Jade(类似 Haml 的模板)。 Express 基于 Connect 构建,用于路由静态文件。 Jade 是我用 Node.js 尝试过的更快的模板引擎之一

        http://expressjs.com/

        【讨论】:

        • 我的问题是关于 HAML 和 Backbone。
        • 我认为这篇文章回答了你的问题fzysqr.com/2011/02/28/…
        • 那个页面甚至没有提到 HAML,所以我不认为它回答了这个问题。
        • Jade 模板使用 HAML,换句话说 Jade 是 HAML 到 javascript 的一个端口
        • @Raynos 我明白你的意思,我的错误。我认为如果在 Rails 中实现 Backbone,这不是一个不同的问题。对不起大家,我想这不是太有帮助:O
        猜你喜欢
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多