如何使用 underscore.js 作为模板引擎?

IT技术 javascript node.js functional-programming underscore.js template-engine
2021-01-25 11:09:53

我正在尝试了解 javascript 作为服务器端语言和功能语言的新用法。几天前我听说了 node.js 和 express 框架。然后我看到 underscore.js 是一组实用函数。在 stackoverflow 上看到了这个问题 它说我们可以使用 underscore.js 作为模板引擎。任何人都知道关于如何使用 underscore.js 进行模板制作的好教程,尤其是对于高级 javascript 经验较少的大人物。谢谢

6个回答

您需要了解的有关下划线模板的所有信息都在这里只需要记住3件事:

  1. <% %> - 执行一些代码
  2. <%= %> - 在模板中打印一些值
  3. <%- %> - 打印一些 HTML 转义值

这就是全部。

简单的例子:

var tpl = _.template("<h1>Some text: <%= foo %></h1>");

然后tpl({foo: "blahblah"})将被渲染到字符串<h1>Some text: blahblah</h1>

-1,文档在很多方面都存在缺陷。几乎可以肯定,用户是在查阅文档后来到这里的。不好回答。
2021-03-14 11:09:53
我认为他们会投反对票,因为他们提供的文档几乎没有说明如何在单一示例之外混合 <% 和 <%= 以及从 <%= 切换到 print() 如何改变这种模式。此外,当使用“插值”时,有一些奇怪的行为可能会用更多的解释来制作场景。同样,没有提供。虽然我同意,但拒绝投票是一件愚蠢的事情。
2021-03-25 11:09:53
我没有反对,但你的回答没有做任何事情(除了提供链接)来解释如何使用 underscore.js 作为模板引擎。您的答案可能为那些已经得到它的人提供了一个快速的“备忘单”,但就其本身而言,它并不是问题的答案。我很惊讶它有和它一样多的赞成票。
2021-03-26 11:09:53
我不明白为什么有人会反对票这一点,对项目的主页规范答案,并指向的指令,这是经典的“授人以鱼”。
2021-03-30 11:09:53
3. <%- %> - 打印一些带有 HTML 转义的值
2021-03-30 11:09:53
<!-- Install jQuery and underscore -->

<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="http://documentcloud.github.com/underscore/underscore-min.js"></script>

<!-- Create your template -->
<script type="foo/bar" id='usageList'>
<table cellspacing='0' cellpadding='0' border='1' >
    <thead>
      <tr>
        <th>Id</th>
        <th>Name</th>
      </tr>
    </thead>
    <tbody>
      <%
        // repeat items 
        _.each(items,function(item,key,list){
          // create variables
          var f = item.name.split("").shift().toLowerCase();
      %>
        <tr>
          <!-- use variables -->
          <td><%= key %></td>
          <td class="<%= f %>">
            <!-- use %- to inject un-sanitized user input (see 'Demo of XSS hack') -->
            <h3><%- item.name %></h3>
            <p><%- item.interests %></p>
          </td>
        </tr>
      <%
        });
      %>
    </tbody>
  </table>
</script>

<!-- Create your target -->

<div id="target"></div>

<!-- Write some code to fetch the data and apply template -->

<script type="text/javascript">
  var items = [
    {name:"Alexander", interests:"creating large empires"},
    {name:"Edward", interests:"ha.ckers.org <\nBGSOUND SRC=\"javascript:alert('XSS');\">"},
    {name:"..."},
    {name:"Yolando", interests:"working out"},
    {name:"Zachary", interests:"picking flowers for Angela"}
  ];
  var template = $("#usageList").html();
  $("#target").html(_.template(template,{items:items}));
</script>
感谢您在示例中明确使用“text/html”脚本标签;我是 underscore.js 的新手,很遗憾地误读了文档——很高兴知道 templateString 并不总是必须内联编写。
2021-03-13 11:09:53
让我们知道 XSS 演示不再有效,因为浏览器拒绝使用错误的 mimetype 执行 JS
2021-03-21 11:09:53
模板实际上并不是text/htmltype="text/html"是谎言,谎言会导致问题。您最好使用准确的类型,例如text/x-underscore.
2021-04-01 11:09:53
mu,我认为指出这无关紧要很好。让我们面对现实吧,你放的任何东西都是谎言。text/x-underscore 是一个更大的谎言,因为我使用 lodash,lol :) 在我添加的最后一个 JsFiddle 中,type="foo/bar"因为我希望每个人都知道只要浏览器/服务器不识别它并尝试用它做点什么。由于 html 不是一种脚本,我觉得 text/html 相当安全(John Resig 使用它) foo/bar 也能工作:)
2021-04-07 11:09:53
人们总是不同意我的观点,我尽力不把它放在个人身上(即使是个人的:)。我一遍又一遍地被轻微的草率带来的意想不到的副作用所困扰,所以我的习惯是在严格方面是错误的。MIME 类型规范实际上*/x-*为“虚构”用途保留了类型,我认为text/underscore官方注册表中没有类型,所以我使用它text/x-underscore是因为我很偏执,而且他们真的很想找我。
2021-04-11 11:09:53

以最简单的形式,您可以像这样使用它:

var html = _.template('<li><%= name %></li>', { name: 'John Smith' });
//html is now '<li>John Smith</li>'   

如果您打算多次使用模板,则需要对其进行编译以使其更快:

var template = _.template('<li><%= name %></li>');

var html = [];
for (var key in names) {
    html += template({ name: names[i] });
}

console.log(html.join('')); //Outputs a string of <li> items

我个人更喜欢 Mustache 风格的语法。您可以调整模板标记标记以使用双花括号:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

var template = _.template('<li>{{ name }}</li>');
要使用视图中的模板,您可以在页面标记中包含以下内容:<script type="text/template" id="my-template"><div><%- name %></div></script > 然后在您的 JS 中执行以下操作: var html = _.template($('#my-template').html(), {name: "John Smith"});
2021-03-16 11:09:53
@evilcelery - 你的interpolate小费没有用,但这样做了:_.templateSettings = { interpolate: /\{\{\=(.+?)\}\}/g, escape: /\{\{\-(.+?)\}\}/g, evaluate: /\{\{(.+?)\}\}/g };
2021-03-26 11:09:53
Mustache 插值技巧在使用使用 ejs 呈现的 express3 视图时帮助了我。谢谢!
2021-03-27 11:09:53

模板的文档是部分的,我看了源。

_.template函数有3个参数:

  1. String text : 模板字符串
  2. 对象数据:评价数据
  3. 对象设置:本地设置,_.templateSettings是全局设置对象

如果没有给出数据(或空值),则将返回渲染函数。它有 1 个参数:

  1. 对象数据:相同的数据上述

设置中有 3 个正则表达式模式和 1 个静态参数:

  1. RegExp评估:模板字符串中的“<%code%>”
  2. RegExp插值:模板字符串中的“<%=code%>”
  3. 正则表达式转义:“<%-code%>”
  4. 字符串变量:可选,模板字符串中数据参数的名称

评估部分中的代码将被简单评估。您可以使用__p+="mystring"命令将此部分中的字符串添加到评估模板,但不推荐这样做(不是模板界面的一部分),请使用 interpolate 部分而不是。这种类型的部分用于将 if 或 for 之类的块添加到模板中。

插值部分中的代码结果将添加到评估模板中。如果返回 null,则将添加空字符串。

逃逸部分逃脱HTML与_.escape在给定的代码的返回值。因此,它的比类似_.escape(代码)中的内插部分,但它与逃逸\的空白字符等\ n它传递的代码到前_.escape我不知道为什么这很重要,它在代码中,但它与interpolate_.escape配合得很好——它也不会转义空白字符。

默认情况下,数据参数由with(data){...}语句传递,但这种评估比使用命名变量评估要慢得多。所以可变参数命名数据是件好事......

例如:

var html = _.template(
    "<pre>The \"<% __p+=_.escape(o.text) %>\" is the same<br />" +
        "as the  \"<%= _.escape(o.text) %>\" and the same<br />" +
        "as the \"<%- o.text %>\"</pre>",
    {
        text: "<b>some text</b> and \n it's a line break"
    },
    {
        variable: "o"
    }
);

$("body").html(html);

结果

The "<b>some text</b> and 
 it's a line break" is the same
as the "<b>some text</b> and 
 it's a line break" and the same
as the "<b>some text</b> and 
 it's a line break"

您可以在此处找到更多示例如何使用模板并覆盖默认设置:http : //underscorejs.org/#template

通过模板加载,您有很多选择,但最后您总是必须将模板转换为字符串。你可以把它作为像例如正常的字符串以上,或者你可以从一个脚本标签加载它,使用的.html()的jQuery的功能,也可以从与一个单独的文件中加载第三方物流插件require.js .

使用简洁而不是模板构建 dom 树的另一种选择

我举一个非常简单的例子

1)

var data = {site:"mysite",name:"john",age:25};
var template = "Welcome you are at <%=site %>.This has been created by <%=name %> whose age is <%=age%>";
var parsedTemplate = _.template(template,data);
console.log(parsedTemplate); 

结果是

Welcome you are at mysite.This has been created by john whose age is 25.

2)这是一个模板

   <script type="text/template" id="template_1">
       <% _.each(items,function(item,key,arr) { %>
          <li>
             <span><%= key %></span>
             <span><%= item.name %></span>
             <span><%= item.type %></span>
           </li>
       <% }); %>
   </script>

这是 html

<div>
  <ul id="list_2"></ul>
</div>

这是包含 json 对象并将模板放入 html 的 javascript 代码

   var items = [
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       },
       {
          name:"name1",
          type:"type1"
       } 
   ];
  $(document).ready(function(){
      var template = $("#template_1").html();
      $("#list_2").html(_.template(template,{items:items}));
  });