当前位置:首页 > JavaScript

js实现模板引擎

2026-04-04 13:56:20JavaScript

实现模板引擎的基本思路

模板引擎的核心是将模板字符串中的占位符替换为实际数据。常见的占位符格式如{{name}},通过正则表达式匹配替换。

简单字符串替换

使用正则表达式匹配占位符并用实际数据替换:

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

const template = 'Hello, {{name}}!';
const data = { name: 'World' };
console.log(render(template, data)); // 输出: Hello, World!

支持嵌套对象

扩展正则表达式以支持嵌套对象路径如{{user.name}}

function render(template, data) {
  return template.replace(/\{\{([\w\.]+)\}\}/g, (match, path) => {
    const keys = path.split('.');
    return keys.reduce((obj, key) => (obj && obj[key]) || '', data);
  });
}

const template = 'Hello, {{user.name}}!';
const data = { user: { name: 'Alice' } };
console.log(render(template, data)); // 输出: Hello, Alice!

支持条件语句

通过自定义语法实现简单的条件判断:

function render(template, data) {
  const ifPattern = /\{\{if\s+(\w+)\}\}(.*?)\{\{\/if\}\}/gs;
  return template.replace(ifPattern, (match, key, content) => 
    data[key] ? render(content, data) : ''
  );
}

const template = '{{if show}}Hello!{{/if}}';
const data = { show: true };
console.log(render(template, data)); // 输出: Hello!

支持循环语句

实现数组遍历功能:

function render(template, data) {
  const loopPattern = /\{\{each\s+(\w+)\}\}(.*?)\{\{\/each\}\}/gs;
  return template.replace(loopPattern, (match, key, content) => 
    data[key].map(item => render(content, item)).join('')
  );
}

const template = '{{each items}}<li>{{name}}</li>{{/each}}';
const data = { items: [{name: 'A'}, {name: 'B'}] };
console.log(render(template, data)); // 输出: <li>A</li><li>B</li>

安全转义

防止XSS攻击,对输出进行HTML转义:

function escapeHtml(unsafe) {
  return unsafe
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

function render(template, data, safe = true) {
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => 
    safe ? escapeHtml(data[key] || '') : data[key] || ''
  );
}

完整示例

结合所有功能的简化实现:

class TemplateEngine {
  constructor() {
    this.cache = {};
  }

  compile(template) {
    const fnBody = `with(obj){\nreturn \`${template
      .replace(/\{\{([\w\.]+)\}\}/g, '${$1}')
      .replace(/\{\{if\s+(\w+)\}\}(.*?)\{\{\/if\}\}/gs, '${$1 ? `$2` : ``}')
      .replace(/\{\{each\s+(\w+)\}\}(.*?)\{\{\/each\}\}/gs, '${$1.map(i=>`$2`).join(``)}')
    }\`;\n}`;
    return new Function('obj', fnBody);
  }

  render(template, data) {
    const fn = this.compile(template);
    return fn(data);
  }
}

const engine = new TemplateEngine();
const result = engine.render(
  '{{each users}}{{if show}}<div>{{name}}</div>{{/if}}{{/each}}',
  { users: [{name: 'Alice', show: true}], show: true }
);
console.log(result); // 输出: <div>Alice</div>

性能优化建议

对于重复使用的模板,可进行预编译缓存。避免每次渲染都重新解析模板字符串。

js实现模板引擎

class TemplateEngine {
  constructor() {
    this.cache = {};
  }

  compile(template) {
    if (!this.cache[template]) {
      // 编译逻辑...
      this.cache[template] = compiledFunction;
    }
    return this.cache[template];
  }
}

标签: 模板引擎
分享给朋友:

相关文章

引擎uniapp

引擎uniapp

uniapp 引擎概述 uniapp 是一个基于 Vue.js 的跨平台开发框架,允许开发者使用单一代码库构建多端应用(如 iOS、Android、Web、小程序等)。其核心引擎通过条件编译和运行时适…

实现vue模板解析

实现vue模板解析

Vue 模板解析的基本原理 Vue 的模板解析是将 HTML 模板转换为渲染函数的过程。Vue 通过编译器将模板字符串转换为抽象语法树(AST),再将 AST 转换为可执行的渲染函数。这一过程通常发生…

jquery模板

jquery模板

jQuery 模板引擎介绍 jQuery 本身不包含专门的模板引擎,但可以通过插件或结合其他轻量级模板库实现数据渲染。以下是常见的实现方式: 使用 jQuery 结合原生模板字符串 通过 Jav…

vue 模板引擎 实现

vue 模板引擎 实现

Vue 模板引擎的实现原理 Vue 的模板引擎主要通过编译和渲染两个阶段将模板转换为真实的 DOM。以下是核心实现步骤: 模板编译阶段 解析模板为 AST(抽象语法树) 通过正则表达式或状态机将模板…

vue实现打印模板

vue实现打印模板

Vue 实现打印模板的方法 在 Vue 中实现打印功能通常需要结合浏览器的打印 API 和 CSS 样式控制。以下是几种常见的方法: 使用 window.print() 方法 创建一个专门用于打印的…

php原生模板引擎实现

php原生模板引擎实现

PHP原生模板引擎实现 基本思路 PHP本身具备模板引擎的特性,通过混合HTML和PHP代码即可实现简单的模板功能。原生实现通常基于以下核心思想: 使用ob_start()和ob_get_clean…