当前位置:首页 > JavaScript

实现 js 模板引擎

2026-04-04 05:02:53JavaScript

实现 JavaScript 模板引擎的基本思路

模板引擎的核心功能是将动态数据嵌入静态模板中,生成最终的字符串。以下是实现一个简单模板引擎的关键步骤:

字符串替换法

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

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

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

函数构造法

通过 Function 构造函数动态生成渲染函数:

function compile(template) {
  const evalExpr = /<%=(.+?)%>/g;
  const expr = /<%([\s\S]+?)%>/g;

  template = template
    .replace(evalExpr, '`); \n  echo( $1 ); \n  echo(`')
    .replace(expr, '`); \n $1 \n  echo(`');

  template = 'echo(`' + template + '`);';

  let script =
    `(function parse(data){
    let output = "";
    function echo(html){
      output += html;
    }
    ${template}
    return output;
  })`;

  return new Function('data', script);
}

// 使用示例
const template = '<p>Hello, <%= name %>!</p>';
const render = compile(template);
console.log(render({ name: 'World' }));

支持条件判断和循环

扩展模板语法以支持逻辑控制:

function advancedCompile(template) {
  const evalPattern = /<%=(.+?)%>/g;
  const controlPattern = /<%([\s\S]+?)%>/g;

  let code = 'let output=[];\nwith(data){\n';
  let cursor = 0;

  template.replace(controlPattern, (match, expr, offset) => {
    code += template.slice(cursor, offset)
      .replace(/"/g, '\\"')
      .replace(/\n/g, '\\n')
      .replace(/\r/g, '\\r')
      .replace(/(^| )echo\(/g, '$1output.push(');

    code += '");\n' + expr + '\noutput.push("';
    cursor = offset + match.length;
    return match;
  });

  code += template.slice(cursor)
    .replace(/"/g, '\\"')
    .replace(/\n/g, '\\n')
    .replace(/\r/g, '\\r')
    .replace(/(^| )echo\(/g, '$1output.push(');

  code += '");\n}\nreturn output.join("");';
  return new Function('data', code);
}

// 使用示例
const template = `
  <% for(let i=0; i<users.length; i++) { %>
    <li><%= users[i].name %></li>
  <% } %>
`;
const render = advancedCompile(template);
const data = { users: [{name: 'Alice'}, {name: 'Bob'}] };
console.log(render(data));

性能优化考虑

对于生产环境使用的模板引擎,还需要考虑以下优化点:

实现 js 模板引擎

  • 预编译模板为函数缓存
  • 添加XSS防护机制
  • 支持模板继承和局部模板
  • 实现更友好的错误提示

现代前端框架通常使用虚拟DOM或响应式系统替代传统模板引擎,但对于特定场景,自定义模板引擎仍有用武之地。

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

相关文章

css网页制作模板

css网页制作模板

CSS 网页制作模板 CSS 网页制作模板通常包含基础的 HTML 结构和 CSS 样式,帮助快速搭建响应式、现代化的网页布局。以下是一个常见的模板示例,包含关键部分和优化建议。 基础 HTML 结…

jquery 模板

jquery 模板

jQuery 模板的使用方法 jQuery 本身不提供内置的模板引擎,但可以通过插件或结合其他库实现模板功能。常见的方案包括使用 jQuery 结合 Handlebars、Mustache 或 Und…

vue模板怎么实现

vue模板怎么实现

Vue 模板实现方法 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将数据渲染到 DOM 中。以下是几种常见的实现方法: 使用单文件组件(SFC) 在 .vue 文件中,通过 <t…

js实现vue模板

js实现vue模板

使用纯 JavaScript 实现 Vue 模板功能 要实现类似 Vue 的模板功能,可以通过以下步骤完成: 1. 数据绑定与响应式更新 通过 Object.defineProperty 或 Pr…

vue实现打印模板

vue实现打印模板

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

vue实现简单视图模板

vue实现简单视图模板

Vue 实现简单视图模板 Vue.js 是一个渐进式 JavaScript 框架,适合构建用户界面。以下是一个简单的 Vue 视图模板实现方法,包含基础结构和功能。 初始化 Vue 项目 使用 Vu…