gpt4 book ai didi

javascript - 如何使用dust.js在服务器和客户端上编写模板

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:43 27 4
gpt4 key购买 nike

我正在尝试创建一个现代网站,它使用 ajax 加载数据,在模板中呈现数据,并使用 jQuery 和 Pushstate 来显示它,再加上服务器端渲染,以便初始页面加载速度很快,蜘蛛可以按预期爬行。当然,我读了关于linkedin使用dust.js来实现这一点的文章。

现在,dust.js声称具有以下优点:

  1. 可组合:设计人员应该能够将表示标记分解为可管理的组件,并在运行时组合这些组件。无需静态链接模板或在应用程序代码中手动组装“布局”。

  2. 与格式无关:虽然 HTML 生成和 DOM 操作在特定情况下很有用,但通用模板系统不应与特定输出格式绑定(bind)。

听起来不错,但是我如何才能真正实现我想要的呢?我制作了在服务器上渲染完整页面的模板,但它们使用 block 和内联部分 - 这意味着如果没有包装器存在,内部位根本无法渲染(它只是返回一个错误,表明它找不到包装器模板)。我不明白如何在客户端上避免编写内部应用程序代码(而不是上面的卖点#1)。

我不明白上面的#2 是什么意思。我想这意味着您获得字符串形式的输出,并且可以用它做任何您想做的事情?

文档非常清晰。

那我该怎么办?现在有比dust.js更好的选择吗?我编写的模板是否必须由应用程序代码组成?如果是这样,我通过什么机制将它们组合到应用程序代码中?

好吧,由于理解我的问题存在困难(这本身是可以理解的),我只是将这个(未经测试的)示例放在一起显示问题:

包装模板:

<html>
<head><title>{+title/}</title>
{+styles/}
</head>
<body>
header header header
<div id="pagecontent">{+content/}</div>
footer footer footer
<script src="jquery"></script>
<script src="dust"></script>
<script src="see 'Client side script' below"></script>
</body>
</html>

“时间”模板:

{>wrap/}
{<title}Time in millis{/title}
{<styles}
<style>
body {
background-color: {bgcolor};
}
</style>
{/styles}
{<content}
The time: {time}<br />
<a href="{link}">Switch format</a>
{/content}

服务器端代码:

app.get('/millis',function(req,res) {
res.render('time',{millis:new Date().getTime(),link:'/time',bgcolor:'lightgreen'});
}
app.get('/time',function(req,res) {
res.render('time',{millis:new Date().toString(),link:'/millis',bgcolor:'lightpink'});
}

所以,服务器可以很好地渲染页面,但是客户端呢?继续阅读。

客户端脚本:

//load the 'time' template into dust somewhere up here
$(function(){
$('a').click(function(e){
var newcontent;
switch($(this).attr('href')) {
case '/time':
//FAILS: can't find the wrapper. We need logic to get the title and styles from the template and fill it in in-place in the DOM
newcontent = dust.render('time',{millis:new Date().toString(),link:'/millis',bgcolor:'lightpink'});
case '/millis':
//FAILS: can't find the wrapper. We need logic to get the title and styles from the template and fill it in in-place in the DOM
newcontent = dust.render('time',{millis:new Date().getTime(),link:'/time',bgcolor:'lightgreen'});
default: return;
}
e.preventDefault();
$('#pagecontent').fadeOut(1000,function(){
//use pushstate and stuff here
$(this).html(newcontent);
$(this.fadeIn(1000);
});
});
});

最佳答案

我也想知道同样的事情,然后发现了这个。您可能也看过这个,但我将其留在这里,以防对其他人有帮助。

http://spalatnik.com/blog/?p=54

我还没有实现这个,所以我下面的推论是基于上面的文章和一些(希望)有根据的假设。如果以下内容不正确,我当然想继续讨论,因为我也在学习。

我怀疑您有两种类型的包装模板。一种是您上面提供的包装模板(用于服务器端渲染)。第二个包装模板将完全不同(如下所示)。在下面的示例中,我从上面的博客中逐字复制。我假设您编译的所有 DustJS 模板都位于下面的文件dust-full-0.3.0-min.js 中。

<html>
<head>
<script src="dust-full-0.3.0.min.js"></script>
<script type="text/javascript">
//example showing client-side compiling and rendering
var compiled = dust.compile("Hello {name}!", "index");
dust.loadSource(compiled);

dust.render("index", {name: "David"}, function(err, out) {
if(err != null)
alert("Error loading page");
//assume we have jquery
$("#pageContainer").html(out);
});
</script>
</head>

<body>
<div id="pageContainer"></div>
</body>
</html>

我怀疑在您的 Express 服务器中,您会检查用户代理并决定渲染哪个模板。如果它是机器人用户代理,请在示例中使用服务器端生成。否则,请使用上面的客户端模板。

关于javascript - 如何使用dust.js在服务器和客户端上编写模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409329/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com