【问题标题】:Client side + Server side templating, feels wrong to me, how to optimize?客户端+服务器端模板,感觉不对,怎么优化?
【发布时间】:2012-04-28 15:19:20
【问题描述】:

在我正在制作的网络应用程序中,我使用经典的 Express+Jade 来呈现客户端页面并公开一些 REST API(比方说:“用户列表 API”)。

这些客户端页面使用提供的 API 来检索“用户列表”并显示它。为了显示它,我在检索到数据后使用车把模板库。

对我来说好像有点脏,用了两个模板引擎,两次解析代码,怎样才能更好?

注意:我已经通过在客户端页面中插入一个脚本变量来发送初始数据来优化这个东西。然后,此变量的显示方式与 API 接收的数据相同。该 API 仅用于数据刷新的情况。

更新:在服务器端和客户端都使用jade是个好主意,但是如何分开/指定呢?渲染模板的哪一部分应该在服务页面时完成,客户端将使用哪一部分?

【问题讨论】:

  • 您可以使用 Jade 模板in the browser。还有许多其他模板引擎也可以在 Node 和浏览器中使用。
  • 我知道jade可以在客户端和服务器端使用,但是如何在文件中分离客户端和服务器端模板?你如何告诉服务器端 Jade 处理器不要计算模板的客户端部分?
  • 我不能告诉你如何组织你的模板,我解决它的方法是尽可能保持模板简单,并在服务器和客户端使用相同的模板。布局只会在服务器上呈现,而部分(资源模板)可以在有意义的地方呈现。
  • Partials 可能是解决问题的好方法。我去看看。

标签: node.js express pug templating handlebars.js


【解决方案1】:

使用http://github.com/flatiron/plates 模板引擎,它可以在客户端和服务器端工作。

【讨论】:

  • Plates 似乎很难与 express 结合使用,我不想在 flatrion 上重写我的应用程序(问题是重写,而不是 flatiron)。
  • 你可以写个快递插件来模仿玉。那么和express结合起来就不是什么大问题了
  • 是的,但无论如何它都不能解决我的问题,我会遇到与客户端和服务器端都使用翡翠相同的问题:如何彻底分离客户端和服务器模板?
  • 我会尝试制作一个 lib 或类似的东西,我已经找到了方法。
  • 好的,我做到了。这很简单,但我不喜欢缺乏逻辑。这里是the github,这里是npm registery link
【解决方案2】:

几周前,我为 Handlebars 模板编写了一个 npm 包,以便在客户端和服务器之间共享它们。这是非常基本的,但到目前为止对我来说效果很好:

https://github.com/jwietelmann/node-handlebars-precompiler

编辑:我单独使用“hbs”作为服务端渲染的包。每当我更新我的 hbs 视图时,预编译器只会将预编译的模板传递到我的公共 javascripts 目录。

【讨论】:

  • 之前没注意你的回答,真有意思!
【解决方案3】:

很容易使用Client端+Server端模板。当我们在构建一些web应用程序时,我们应该使用ajax来获取一些数据并使用回调函数来处理。所以我们应该在客户端渲染这些数据一边。

问题是如何在客户端渲染它们?

现在我们只需要一个客户端jade.js。

关注此文档:https://github.com/visionmedia/jade#readme

第一

git clone https://github.com/visionmedia/jade.git

第二

$ make jade.js ( in fact the project has already compile the file for us )

so we just need to copy this file to the path that we use.

第三

read my demo below :

<script type='text/javascript' language='javascript' src="lib/jquery-1.8.2.min.js"></script>
<script type='text/javascript' language='javascript' src="lib/jade/jade.js"></script>
<script type='template' id='test'>
ul
  li hello world 
  li #{item}
  li #{item}
  li #{item}
</script>
<script>
  var compileText = $("#test").text();
  console.log( typeof( compileText ) );
  var fn = jade.compile( compileText , { layout : false } );
  var out = fn( {item : "this is item " } );
  console.log( out );
  $("body").append( out );
</script>

现在可以在正文中看到输出结果了

hello world
this is item
this is item
this is item

看完这个demo,我想你应该知道jade服务器端和客户端是怎么分开的了。如果你能明白是哪一个编译jade模板,那么问题就简单了。

也许您现在还有一个问题。如何在*.jade中编写一些翡翠模板代码?文档也为我们提供了一种方法。本教程可能会对您有所帮助。

index.jade

!!!5
html
  head
   title hello world
  body
    ul#list

    script#list-template(type='template')
      |- for( var i in data )
      |    li(class='list') \#{ data[i].name }
      |- }

index.js

/* you javascript code */
var compileText = $('#list-template').text();
var compile = jade.compile( compileText , { layout : false } );

var data = [{ "name" : "Ben" } , {"name" : "Jack" } , {"name" : "Rose" }];
var outputText = compile( data );

$("#list").append( outputText );

【讨论】:

  • 我应该对带有“文本/模板”类型的脚本标签有所了解。这个答案其实比我的自动答案好一点。
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多