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>
当然可以!让我们来详细解释一下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>
语法解析
-
<%= ... %>
: 这种语法表示将表达式的值插入到HTML中。例如:<div class="todo <%= done ? 'done' : '' %>"> ... </div>
如果
done
为true
,则生成的HTML将是:<div class="todo done"> ... </div>
-
<% ... %>
: 这种语法表示执行JavaScript代码块。例如:<% if (total) { %> <span class="todo-count"> <span class="number"><%= remaining %></span> <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left. </span> <% } %>
如果
total
为true
,则生成的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”>
感谢两位回复。 原来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 更加方便。
模板引擎的工作原理通常包括以下步骤:
- 定义模板字符串。
- 将模板字符串编译成一个函数。
- 使用数据调用该函数,生成最终的 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 结构。