当前位置:首页 > JavaScript

js 实现tmpl

2026-02-02 05:01:05JavaScript

JavaScript 实现模板引擎 (tmpl)

在 JavaScript 中实现一个简单的模板引擎(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 的执行能力实现模板渲染。

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 方法仅适用于浏览器环境。

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

js 实现tmpl

标签: jstmpl
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableElem…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-contain…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…