6

在我的应用程序中,我需要提供一个 API(类似于 Google Maps javascript API),通过它我可以发送一些自定义 javascript(带有一些会话和请求相关信息)作为响应。然后使用 javascript 在 UI 上绘制一些图形。我使用 Express with Jade 作为我的模板引擎。我目前使用的代码是:

app.use('/graph',function(req, res){
   //send out graph data
   var var_name = req.session.var_name //fetch something from session
   var graphData = fetchGraphData(req.query.graph); //function that fetches graph data
   res.contentType("text/javascript");
   res.render(__dirname + '/views/graph.jade', {
     title: "Title", queryStr: JSON.stringify({var_name: var_name, graphData: graphData  })
   });
});

和玉文件:

|  some_var_name = {
|       initGraph : function(divId){
|       //some code here
|       var graphData = !{graphData}
|       // do something                               

作为一种解决方法,我已经开始使用 玉文件的每一行|,以便玉将文本解析为纯文本,并且不添加任何 html 标记!它工作正常,但有没有更清洁的方法来做到这一点?该解决方案可能使用也可能不使用 Jade!

4

3 回答 3

6

您应该查看下划线模板。我认为生成任意文本输出会更干净一些。Jade 是专门为呈现 HTML 而构建的。

您也可以尝试MustacheHandlebars

根据您的评论,我看到您希望继续使用它res.render来呈现模板。consolodate.js为 Express 添加了对所有主要模板引擎的支持。包括 @TheHippo 提到的 Underscore 模板、Handlebars、Mustache 和 Dust。

于 2013-05-06T23:01:55.277 回答
1

您可以尝试在模板之外的单独模块中定义需要发送到浏览器的 JavaScript 函数,从“关注点分离”的角度来看,这可能是更正确的方法。此外,如果函数在单独的模块中定义,它们可以在服务器和浏览器中使用。

然后,您可以在调用模板的函数中或在模板内部使用其 toString() 方法将函数转换为字符串,前提是它支持纯 JavaScript,下划线、EJS 和 doT 模板就是这种情况(我尝试了下划线和EJS 并最终使用了 doT,它不仅速度最快,而且用途广泛——看看):

JS代码:

// if you send the same functions you may want to convert them to strings in advance
var data = {
    funcStr: func.toString();
};
res.render(view, data);

模板(点):

<script type="text/javascript">
    func = {{= it.funcStr }};

    // now you can call it here if you want but I would use 
    // separate JavaScript files
    func();
</script>

我使用它将预编译的模板与第一页加载时的页面一起发送到浏览器,但我认为它也可以用于您的情况。

作为一个附带问题,为什么不能将所有这些函数捆绑在一个单独的 JavaScript 模块中并将它们作为普通脚本文件加载?

于 2013-05-07T19:11:52.507 回答
1

您可以使用https://www.npmjs.com/package/rendercustomjs包,它工作正常,但在 ejs 模板中

于 2021-10-27T09:06:12.003 回答