当前位置:首页 > 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实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js实现放大缩小

js实现放大缩小

使用 CSS transform 实现缩放 通过修改元素的 transform 属性实现平滑缩放效果。CSS 的 scale() 函数可以轻松调整元素大小。 const element = docu…