JavaScript构建轻量级模板引擎的两种实现方式

作者:半夏时间:2026-10-22 19:40:06浏览:578

本文介绍如何在不依赖Handlebars或jQuery tmpl等大型库的情况下,使用JavaScript构建轻量级模板引擎。通过对比硬编码字符串替换与基于正则表达式的自动变量识别两种方案,演示如何将数据绑定至HTML模板。文章提供了完整的代码示例,帮助开发者实现灵活且高效的简单模板功能。

引言与背景

本文通过具体实例,详细解析如何利用JavaScript开发一个轻量级的自定义模板引擎。内容旨在为读者提供可参考的实现思路与代码示例。

在实际开发中,许多场景并不需要引入jQuery tmpl或Handlebars.js等重量级模板引擎。当仅需在简单模板中绑定少量基础字段时,采用轻量级技巧即可高效完成任务。本文将介绍一种简易实现方案。

首先,我们需要定义模板结构。具体做法是在HTML中创建一个id为template的script标签块,用于存放模板内容。

模板定义与数据准备

接下来展示HTML部分的具体结构。


<!doctype html>
<html>
<head>
  <meta charset=utf-8>
  <title>Simple Templating</title>
</head>
<body>
 <div class="result"></div>
 <script type="template" id="template">
  <h2>
   <a href="{{href}}" rel="external nofollow" >
    {{title}}
   </a>
  </h2>
  <img src="{{imgSrc}}" alt="{{title}}">
 </script>
</body>
</html>

随后定义配套的CSS样式,以确保页面渲染效果符合预期。


a:link, a:visited {
  color: #3D81EE;
}

获取数据的方式通常包括Ajax请求或其他接口,为便于演示,此处直接使用预定义的数组作为数据源。


var data = [
  {
   title: "HTML5+SVG实现的圣诞夜棒棒糖山林雪景动画效果",
   href: "https://www.jb51.net/jiaoben/649311.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181205/162543361311.jpg"
  },
  {
   title: "微信小程序实战入门(内含完整实例解析) 刘明洋著",
   href: "https://www.jb51.net/books/648114.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181128/1H13HM103.jpg"
  },
  {
   title: "JavaScript开发框架权威指南",
   href: "https://www.jb51.net/books/636104.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/180910/1H9462K325.jpg"
  }
],

将数据绑定到模板主要有两种策略:一是较为直接的硬编码替换方式,二是通过正则表达式自动识别并替换变量的灵活方式。

方案一:硬编码替换实现

首先分析第一种硬编码方法。该方法通过手动指定替换规则,将模板中花括号内的特定占位符逐一替换为data数组中对应的属性值。


template = document.querySelector('#template').innerHTML,
result = document.querySelector('.result'),
i = 0, len = data.length,
fragment = '';
for ( ; i < len; i++ ) {
  fragment += template
   .replace( /\{\{title\}\}/, data[i].title )
   .replace( /\{\{href\}\}/, data[i].href )
   .replace( /\{\{imgSrc\}\}/, data[i].imgSrc );
}
result.innerHTML = fragment;

以下是第一种方案完整的JavaScript代码实现。


;(function() {
 // simulates AJAX request
 var data = [
  {
   title: "HTML5+SVG实现的圣诞夜棒棒糖山林雪景动画效果",
   href: "https://www.jb51.net/jiaoben/649311.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181205/162543361311.jpg"
  },
  {
   title: "微信小程序实战入门(内含完整实例解析) 刘明洋著",
   href: "https://www.jb51.net/books/648114.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181128/1H13HM103.jpg"
  },
  {
   title: "JavaScript开发框架权威指南",
   href: "https://www.jb51.net/books/636104.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/180910/1H9462K325.jpg"
  }
 ],
   template = document.querySelector('#template').innerHTML,
   result = document.querySelector('.result'),
   i = 0, len = data.length,
   fragment = '';
 for ( ; i < len; i++ ) {
  fragment += template
   .replace( /\{\{title\}\}/, data[i].title )
   .replace( /\{\{href\}\}/, data[i].href )
   .replace( /\{\{imgSrc\}\}/, data[i].imgSrc );
 }
 result.innerHTML = fragment;
})();

读者可使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.jb51.net/code/WebCodeRun 对上述代码进行实际测试与效果验证。

引言与背景

方案二:正则表达式自动绑定

第二种方式具备更高的灵活性,它利用正则表达式一次性匹配并替换模板中所有花括号包裹的变量。这种方式无需逐个指定字段,但需注意处理数据中可能缺失模板标签的情况。


template = document.querySelector('#template').innerHTML,
result = document.querySelector('.result'),
attachTemplateToData;
// 将模板和数据作为参数,通过数据里所有的项将值替换到模板的标签上(注意不是遍历模板标签,因为标签可能不在数据里存在)。
attachTemplateToData = function(template, data) {
    var i = 0,
      len = data.length,
      fragment = '';
    // 遍历数据集合里的每一个项,做相应的替换
    function replace(obj) {
      var t, key, reg;
       //遍历该数据项下所有的属性,将该属性作为key值来查找标签,然后替换
      for (key in obj) {
        reg = new RegExp('{{' + key + '}}', 'ig');
        t = (t || template).replace(reg, obj[key]);
      }
      return t;
    }
    for (; i < len; i++) {
      fragment += replace(data[i]);
    }
    return fragment;
  };
result.innerHTML = attachTemplateToData(template, data);

第二种方案对应的完整JavaScript代码如下。


;(function() {
 // simulates AJAX request
 var data = [
  {
   title: "HTML5+SVG实现的圣诞夜棒棒糖山林雪景动画效果",
   href: "https://www.jb51.net/jiaoben/649311.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181205/162543361311.jpg"
  },
  {
   title: "微信小程序实战入门(内含完整实例解析) 刘明洋著",
   href: "https://www.jb51.net/books/648114.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/181128/1H13HM103.jpg"
  },
  {
   title: "JavaScript开发框架权威指南",
   href: "https://www.jb51.net/books/636104.html",
   imgSrc: "//img.jbzj.com/do/uploads/litimg/180910/1H9462K325.jpg"
  }
 ],
    template = document.querySelector('#template').innerHTML,
    result = document.querySelector('.result'),
    attachTemplateToData;
  // 将模板和数据作为参数,通过数据里所有的项将值替换到模板的标签上(注意不是遍历模板标签,因为标签可能不在数据里存在)。
  attachTemplateToData = function(template, data) {
    var i = 0,
      len = data.length,
      fragment = '';
    // 遍历数据集合里的每一个项,做相应的替换
    function replace(obj) {
      var t, key, reg;
      for (key in obj) {
        reg = new RegExp('{{' + key + '}}', 'ig');
        t = (t || template).replace(reg, obj[key]);
      }
      return t;
    }
    for (; i < len; i++) {
      fragment += replace(data[i]);
    }
    return fragment;
  };
  result.innerHTML = attachTemplateToData(template, data);
})();

同样建议使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.jb51.net/code/WebCodeRun 来测试第二种代码的运行效果。

总结与扩展资源

通过上述方法,开发者可以无限制地自定义模板标签及item属性,而无需修改核心JavaScript代码,实现了模板与逻辑的解耦。

若需了解更成熟的模板引擎方案,可参考以下两个知名项目,它们均提供了强大的功能支持。

HandleBars.js Mustache.js

本文内容参考自:http://net.tutsplus.com/tutorials/javascript-ajax/create-a-makeshift-javascript-templating-solution/

如需深入探索JavaScript相关知识,可查阅本站系列教程,包括《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。

希望本文提供的JavaScript程序设计思路能对读者有所帮助。

作者最新文章