Nodejs 请教:javascript模板的原理?

Nodejs 请教:javascript模板的原理?

哪位大神帮解释一下javascript的原理?谢了

另外 <%= done ? ‘done’ : ‘’ %> 这种语法怎么理解?

  <script id="item-template" type="text/template">
  <div class="todo <%= done ? 'done' : '' %>">
  <div class="display"><input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %>/>
  <div class="todo-text"></div><span id="todo-destroy"></span></div><div class="edit"><input type="text" value="" class="todo-input"/></div></div>
  </script>
  <script id="stats-template" type="text/template">
  <% if (total) { %>
  <span class="todo-count"><span class="number"><%= remaining %> </span><span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
  </span><% } %>
  <% if (done) { %>
  <span class="todo-clear"><a href="#"> Clear
  <span class="number-done"><%= done %></span> completed
  <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span></a></span><% } %>
  </script>

9 回复

当然可以!让我们来详细解释一下JavaScript模板的原理,并解答你提到的语法问题。

JavaScript 模板的原理

JavaScript模板是一种在HTML中嵌入动态数据的方法。它允许你在HTML中插入变量,并通过JavaScript动态地生成或更新HTML内容。这种技术通常用于前端框架(如React、Vue等)以及简单的模板引擎(如EJS、Handlebars等)中。

模板引擎通常会解析HTML中的特殊标记(如<% %><%= %>),并将这些标记替换为相应的JavaScript表达式的结果。

示例代码解析

在你的示例中,有两个模板脚本标签(<script>),它们包含了模板字符串。这些模板字符串使用了类似于EJS(Embedded JavaScript)的语法:

<script id="item-template" type="text/template">
  <div class="todo <%= done ? 'done' : '' %>">
    <div class="display">
      <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %>/>
      <div class="todo-text"></div><span id="todo-destroy"></span>
    </div>
    <div class="edit"><input type="text" value="" class="todo-input"/></div>
  </div>
</script>

<script id="stats-template" type="text/template">
  <% if (total) { %>
    <span class="todo-count">
      <span class="number"><%= remaining %></span>
      <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
    </span>
  <% } %>
  <% if (done) { %>
    <span class="todo-clear">
      <a href="#">
        Clear
        <span class="number-done"><%= done %></span> completed
        <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span>
      </a>
    </span>
  <% } %>
</script>

语法解析

  1. <%= ... %>: 这种语法表示将表达式的值插入到HTML中。例如:

    <div class="todo <%= done ? 'done' : '' %>">
      ...
    </div>
    

    如果donetrue,则生成的HTML将是:

    <div class="todo done">
      ...
    </div>
    
  2. <% ... %>: 这种语法表示执行JavaScript代码块。例如:

    <% if (total) { %>
      <span class="todo-count">
        <span class="number"><%= remaining %></span>
        <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
      </span>
    <% } %>
    

    如果totaltrue,则生成的HTML将是:

    <span class="todo-count">
      <span class="number">5</span>
      <span class="word">5 items</span> left.
    </span>
    

总结

JavaScript模板引擎通过解析和替换HTML中的特定标记,实现了动态生成或更新HTML内容的功能。这种技术在前端开发中非常常见,尤其是在处理大量动态数据时。

希望这个解释对你有所帮助!如果有任何其他问题,请随时提问。


<%=%>这个是ejs的输出绑定的值的

done? done : “” 是一个三元运算符号,表示当done不为0 false ‘’ undefined null的时候为 done相反则为"" 也可以用 done || ""代替

没有看到哪里引用ejs相关的js,这个语法怎么会被识别呢?跟引用了modernizer有关系么?

<script src=“js/libs/modernizr-2.0.6.min.js” type=“text/javascript”>

Look ejs source.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

感谢两位回复。 原来backbone中引入了underscore,而underscore则实现了template功能,而我的上下文没有提到这一点。

http://learningcn.com/underscore/#template

template_.template(templateString, [data], [settings]) 将Javascript模板编译为可以用于描绘页面的函数。在从JSON数据源中描绘出一些复杂的HTML时十分有用。模板函数中既可以使用“<%= … %>”插入变量,也可以使用“<% … %>”来执行任意的Javascript代码。如果你想插入一个经过HTML转义处理的值,可以使用“<%- … %>”。当你使用模板函数时,传入一个data对象,这个data对象应当拥有对应于模板中的各个自由变量的属性成员。如果你只是想写一个一次性的代码段,你可以将data对象作为template的第二个参数传入以便立即进行描绘,而非返回一个模板函数。setting参数应当是一个哈希表,包含任何应当被覆盖的_.templateSetting的值。

var compiled = _.template(“hello: <%= name %>”); compiled({name: ‘moe’}); => “hello: moe”

var list = “<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>”; _.template(list, {people: [‘moe’, ‘curly’, ‘larry’]}); => “<li>moe</li><li>curly</li><li>larry</li>”

var template = _.template("<b><%- value %></b>"); template({value: ‘<script>’}); => “<b><script></b>”

see https://github.com/brighthas/stuwebfk/blob/master/lib/view.js

EJS simple implement.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

感谢,一目了然~

简单的模板使用正则表达式直接替换自定义区块里面的代码, 复杂点的模板涉及到的东西就多了… 我也在造模板的轮子…所以对模板研究的多一点…

JavaScript 模板引擎是一种用于生成 HTML 的工具。它允许你在字符串中嵌入 JavaScript 表达式,并在运行时将这些表达式替换为实际值。这使得动态生成 HTML 更加方便。

模板引擎的工作原理通常包括以下步骤:

  1. 定义模板字符串。
  2. 将模板字符串编译成一个函数。
  3. 使用数据调用该函数,生成最终的 HTML 字符串。

示例代码

假设我们使用一个简单的模板引擎来解析上述代码中的模板。

<script id="item-template" type="text/template">
  <div class="todo <%= done ? 'done' : '' %>">
    <div class="display">
      <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> />
      <div class="todo-text"></div>
      <span id="todo-destroy"></span>
    </div>
    <div class="edit"><input type="text" value="" class="todo-input"/></div>
  </div>
</script>

<script id="stats-template" type="text/template">
  <% if (total) { %>
    <span class="todo-count">
      <span class="number"><%= remaining %></span>
      <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
    </span>
  <% } %>
  <% if (done) { %>
    <span class="todo-clear">
      <a href="#">
        Clear
        <span class="number-done"><%= done %></span>
        completed
        <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span>
      </a>
    </span>
  <% } %>
</script>

编译函数

function compile(template) {
  return new Function('data', `
    let output = \`${template}\`;
    ${template.match(/<%=(.*?)%>/g).map((match, index) => `
      const _${index} = data.${match.replace(/<%= | %>/g, '')};
      output = output.replace(new RegExp(\`<%= ${index} %>\`, 'g'), _${index});
    `).join('')}
    return output;
  `);
}

const itemTemplate = document.getElementById('item-template').textContent;
const statsTemplate = document.getElementById('stats-template').textContent;

const compiledItemTemplate = compile(itemTemplate);
const compiledStatsTemplate = compile(statsTemplate);

// 使用数据渲染模板
const data = {
  done: true,
  total: 5,
  remaining: 3
};

console.log(compiledItemTemplate(data));
console.log(compiledStatsTemplate(data));

这段代码定义了一个简单的模板引擎,它将模板字符串编译成一个函数,并使用数据填充模板。这样可以动态生成所需的 HTML 结构。

回到顶部