当前位置:首页 > JavaScript

js 实现tmpl

2026-04-06 22:16:27JavaScript

在JavaScript中实现一个简单的模板引擎(tmpl)可以通过多种方式完成。以下是几种常见的方法,涵盖基础字符串替换和更高级的解析逻辑:

方法一:基于字符串替换的简单模板引擎

使用正则表达式和字符串替换实现变量插值:

js 实现tmpl

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

// 示例用法
const template = 'Hello, {{name}}!';
const data = { name: 'World' };
console.log(tmpl(template, data)); // 输出: Hello, World!

方法二:支持表达式和条件逻辑

通过Function构造函数动态生成函数,支持更复杂的表达式:

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 = 'Result: ${a + b}';
const data = { a: 1, b: 2 };
console.log(tmpl(template, data)); // 输出: Result: 3

方法三:使用标签模板字面量

利用ES6的标签模板功能实现无依赖模板引擎:

function tmpl(strings, ...values) {
  return strings.reduce((result, str, i) => {
    return result + str + (values[i] || '');
  }, '');
}

// 示例用法
const name = 'World';
console.log(tmpl`Hello, ${name}!`); // 输出: Hello, World!

方法四:支持循环和嵌套对象

通过递归和更复杂的正则匹配处理嵌套数据:

function tmpl(template, data) {
  return template.replace(/\{\{([^{}]+)\}\}/g, (match, path) => {
    const keys = path.trim().split('.');
    let value = data;
    keys.forEach(key => {
      value = value ? value[key] : '';
    });
    return value !== undefined ? value : match;
  });
}

// 示例用法
const template = 'User: {{user.name}}, Age: {{user.age}}';
const data = { user: { name: 'Alice', age: 25 } };
console.log(tmpl(template, data)); // 输出: User: Alice, Age: 25

注意事项

  1. 安全性:避免直接使用evalnew Function处理不可信的模板内容,可能导致XSS攻击。
  2. 性能:复杂模板建议预编译为函数,减少运行时解析开销。
  3. 扩展性:可根据需求添加过滤器、循环控制等特性(如{{#each items}})。

如果需要更完整的解决方案,可参考现有库如lodash.templateejs的实现逻辑。

标签: jstmpl
分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js分组实现

js分组实现

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

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…