【问题标题】:Templating with Javascript or Django?使用 Javascript 或 Django 进行模板化?
【发布时间】:2011-05-12 21:48:59
【问题描述】:

我正在构建一个 Django Web 应用程序,它有很多由 ajax 请求动态生成的 html。现在我使用 Django 的模板语言来构建 html,然后将这个新的 HTML 作为 JSON 对象中的字符串传递,然后使用 jQuery 将其注入页面。

这工作得相当好,但由于 Javascript 在现代浏览器中的速度如此之快,并且制作了如此多的 javascript 模板库,我想知道是否应该将所有内容推送到客户端。

所以我的问题是:鉴于我的平均“页面”及其所有请求都必须在其生命周期内编译出大约 300 个模板(每行大约 15 行,大约有 5 个替换)成 HTML在浏览器中做模板是否有显着的性能优势?

此外,任何人都可以推荐一个“快速”的 Javascript 模板库吗?我听说过关于 underscore.js、mustache.js 和 jQuery 模板的好消息。

【问题讨论】:

  • 闭包模板很快,因为它们可以被 google 编译器编译
  • 我也遇到过这个问题,但是发回 HTML 是不合理的,因为涉及的数据量很大(它是用于包含许多条目的图片库)。我用客户端和服务器端的小胡子解决了这个问题 - 我喜欢小胡子。

标签: javascript django django-templates


【解决方案1】:

坚持使用 Django 模板的(巨大)优势是您只需要使用一种模板语言,无论您希望生成什么页面,它都可以保留相同的功能。如果您发现自己遇到性能问题,那么您应该考虑查看caching template fragments

【讨论】:

  • s/Django/Jinja2/g 使它更加庞大;)
  • 当然,如果你小心引用,没有什么说你的 Django 模板不能生成 JSON... 嵌入 HTML...
【解决方案2】:

我不认为混合客户端和服务器模板架构不好。只要您只在其中一种环境中编写模板。

每次生成页面服务器端时,都会消耗一定量的处理时间和一些网络带宽。如果您使用托管服务器,这就是您需要支付的费用。
当用户的浏览器在通常空闲的计算机上等待空闲以获取响应时。

如果您在客户端(HTML + JS)上发送模板,如果用户不删除它们,它们可以被缓存,会话甚至几天。
这减少了传递相同内容的网络流量不同的时间。由于数据通常小于其等效呈现的 HTML。

正如您所指出的,当今的 Javascript 引擎以及它们运行的​​计算机都非常快。每次将渲染工作发送到客户端时,都会为服务器节省一些处理时间并更快地交付数据。

我们处于另一个极端,因为我们在客户端上运行所有内容,这就是我们创建PURE 以实现超快速客户端渲染的原因。由于这种去中心化,我们的应用看起来非常快。

【讨论】:

  • 感谢您的建议,我会检查 PURE。
【解决方案3】:

为什么将 HTML 作为 JSON 传递?只需发回 HTML 并使用 jQuery 的 $.html() 函数将其放入 <div> 或其他任何内容中。

至于 Javascript 中的模板,有Pure。如果您使用 jQuery(我会推荐它),it already has a template engine

【讨论】:

  • 我的响应对象包含其他信息(关于在 dom 和 uids 中附加元素的位置),我确实使用了 $.html 函数,但我只是给它传递 JSON 字典的键包含新的 html。
【解决方案4】:

可以制作具有双重用途的模板 - 可以将它们呈现为占位符以供 js 替换,同时它们可以正常呈现以供服务器输出。只有少数模板需要像这样具有双重用途 - 将被 js 替换的片段。

我同意 Ignacio 的观点,最好只保留每个模板的副本,这样您就不必为 javascript 编写单独的副本,但是我的方法肯定有改进的余地上面已经提到了。

理想情况下,您可能希望将模板编译成强大的 javascript 函数代码以及服务器输出的纯字符串。

Closure templates 叫 Soy,很好地解决了这个问题,但还不能(也许还不能)使用 python,但它们可以使用 Java 和 Javascript。希望有一天会有python支持。

但即使发生这种情况,模板语言也可能会受到更多限制,因为很难让 .get_absolute_url()、过滤器等东西在 python 和 javascript 中都可以自动运行。

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多