前端模板

需求

以博客站点为例,其页面仍然存在重复,譬如多篇博文的详细页面,其结构、样式和行为几乎是完全一样,只是博文内容不同。但如果开发者想改变博文详情页的页面结构,哪怕一点点的改动,都必须去编辑多个博客页面文件,完全无必要

设计思路

  • 页面 = 页面模板(结构) + json数据(内容)
  • 内容:json形式,譬如博文:"{title:'我的博文',content:'博文内容'}"
    • 动态,多个实例
  • 结构:页面模板形式,即刨去内容后的html页面
    • 静态,单个

如何将内容填入页面模板呢?

基本实现思路

  • 将页面模板视作一个字符串,在字符串里放一些占位符
  • 使用ajax方式将页面模板和json内容文件都读入内存
  • 使用正则表达式等方式,将页面模板字符串里的占位符替换为json对象中的相应值

代码示例

<!-- tpl/post.tpl -->
<h1> :title </h1>  <p>:content </p>
<!-- show.html -->
<html><body>
<div id="main"></div>
<script>
var post = {title:'我的博文',content:'博文内容'};
$.get("./tpl/post.tpl", function(result){      
      result.replace(':title', post.title);
      result.replace(':content', post.content);
      $("#main").html(result);
    });
</script></body></html>

模板引擎

  • 由于前述需求在前端项目中如此常见,社区开发了模板引擎,即通用的模板化代码,使得开发者无需关注内容与模板的绑定细节
  • 模板引擎同时提供了强大的模板语言机制,如条件判断、循环等程序设计机制,可以实现复杂的模板功能和内容绑定

ejs 模板引擎

注意:在前端项目中,一般会给出两种代码引用方式

声明模板:基于 ejs 模板引擎

<!-- tpl/post.tpl -->
<h1> <%= title %> </h1>
<p> <%= content %> </p>
<ul>
<% links.forEach(function(link){ %>
  <li><%= link %></li>
<% }) %>
</ul>

绑定数据:基于 ejs 模板引擎

<!-- show.html -->
<html><body><script src="https://unpkg.com/ejs@3.1.6/ejs.min.js"></script>
<div id="main">  </div>
<script>
  var post = { title:'我的博文',content:'博文内容', 
    links:['<a href="./posts/32"> 相关文章一<a>','...'] };
    $.get("./tpl/post.tpl", function(result){
      var html = ejs.compile(result)(post);
      $("#main").html(html);
  });
</script></body></html>

深入应用

  • 将上述代码中的内容数据独立为json文件
  • 设计你的url,根据查询参数的不同,载入不同的json,生成不同的内容页面,譬如:posts/show.html#id=3 将生成id编号为3的博客
  • 将你的站点代码中的html文件的个数精简到最少

客户端渲染

  • 服务端渲染: html页面由服务端脚本生成,然后经由网络传输到客户机的浏览器中进行显示
  • 客户端渲染,两种方式:
    • 浏览器从服务端获取是数据(如json)而不是页面,通过客户端的脚本,将这些数据转化成html页面后在浏览器中进行渲染显示
    • 浏览器无需要从服务端获取任何数据,仅基于客户端的状态,例如用户输入,动态生成或动态更新html页面

其它模板引擎

results matching ""

    No results matching ""