当前位置:首页 > JavaScript

js 实现tmpl

2026-04-06 22:16:27JavaScript

在JavaScript中实现一个简单的模板引擎(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构造函数动态生成函数,支持更复杂的表达式:

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!

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

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

js 实现tmpl

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实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js 进度条的实现

js 进度条的实现

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…