当前位置:首页 > JavaScript

js 实现tmpl

2026-02-02 05:01:05JavaScript

JavaScript 实现模板引擎 (tmpl)

在 JavaScript 中实现一个简单的模板引擎(tmpl)可以通过多种方式完成,以下是几种常见的实现方法:

字符串替换法

使用字符串替换的方式是最基础的方法,通过正则表达式匹配占位符并替换为实际数据。

js 实现tmpl

function tmpl(template, data) {
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return data.hasOwnProperty(key) ? data[key] : '';
  });
}

// 使用示例
const template = 'Hello, {{name}}! Welcome to {{place}}.';
const data = { name: 'Alice', place: 'Wonderland' };
console.log(tmpl(template, data)); // 输出: Hello, Alice! Welcome to Wonderland.

动态函数构造法

通过 new Function 动态生成函数,利用 JavaScript 的执行能力实现模板渲染。

js 实现tmpl

function tmpl(template, data) {
  const keys = Object.keys(data);
  const values = keys.map(key => data[key]);
  const func = new Function(...keys, `return \`${template}\`;`);
  return func(...values);
}

// 使用示例
const template = 'Hello, ${name}! Welcome to ${place}.';
const data = { name: 'Bob', place: 'JavaScript' };
console.log(tmpl(template, data)); // 输出: Hello, Bob! Welcome to JavaScript.

基于 DOM 的模板引擎

利用 DOM 操作和 document.createElement 实现模板渲染,适合浏览器环境。

function tmpl(template, data) {
  const div = document.createElement('div');
  div.innerHTML = template;
  const walk = (node) => {
    if (node.nodeType === Node.TEXT_NODE) {
      node.textContent = node.textContent.replace(/\{\{(\w+)\}\}/g, (match, key) => {
        return data[key] || '';
      });
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      Array.from(node.childNodes).forEach(walk);
    }
  };
  walk(div);
  return div.innerHTML;
}

// 使用示例
const template = '<p>Hello, {{name}}!</p>';
const data = { name: 'Charlie' };
console.log(tmpl(template, data)); // 输出: <p>Hello, Charlie!</p>

支持条件与循环的模板引擎

扩展模板引擎以支持条件判断和循环逻辑。

function tmpl(template, data) {
  const codes = ['let result = [];'];
  const matcher = /<%([^%>]+)?%>/g;
  let cursor = 0;
  let match;

  const addLine = (line) => {
    codes.push(`result.push(\`${line}\`);`);
  };

  while ((match = matcher.exec(template))) {
    addLine(template.slice(cursor, match.index));
    const code = match[1].trim();
    if (code.startsWith('=')) {
      codes.push(`result.push(${code.slice(1)});`);
    } else {
      codes.push(code);
    }
    cursor = match.index + match[0].length;
  }
  addLine(template.slice(cursor));
  codes.push('return result.join("");');
  const func = new Function(...Object.keys(data), codes.join('\n'));
  return func(...Object.values(data));
}

// 使用示例
const template = `
  <ul>
    <% for (let i = 0; i < users.length; i++) { %>
      <li><%= users[i].name %></li>
    <% } %>
  </ul>
`;
const data = { users: [{ name: 'Dave' }, { name: 'Eve' }] };
console.log(tmpl(template, data));

注意事项

  1. 安全性:动态生成代码(如 new Function)可能存在安全风险,需确保数据来源可信。
  2. 性能:简单的字符串替换性能较好,但复杂逻辑可能需优化。
  3. 兼容性:DOM 方法仅适用于浏览器环境。

以上方法可根据实际需求选择或组合使用。

标签: jstmpl
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…