当前位置:首页 > 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或响应式系统替代传统模板引擎,但对于特定场景,自定义模板引擎仍有用武之地。

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

相关文章

实现vue模板解析

实现vue模板解析

Vue 模板解析的基本原理 Vue 的模板解析是将模板字符串转换为渲染函数的过程。核心步骤包括模板编译、AST 生成、优化和代码生成。 模板编译阶段 Vue 使用 vue-template-comp…

vue实现a4打印模板

vue实现a4打印模板

Vue 实现 A4 打印模板 页面布局与样式设置 设置 A4 纸张尺寸(210mm × 297mm)的打印样式,通过 CSS 确保打印内容适配纸张。在 Vue 组件的 <style> 标签…

vue实现模板打印

vue实现模板打印

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

div css网页制作模板

div css网页制作模板

基础HTML结构 创建HTML文件时需包含DOCTYPE声明、html、head和body标签。DOCTYPE声明确保浏览器以标准模式渲染页面,html标签是文档的根元素,head标签包含元数据和链接…

vue实现报告分析模板

vue实现报告分析模板

Vue实现报告分析模板的方案 使用Vue实现报告分析模板可以通过组件化开发、数据可视化库和动态数据绑定来构建交互式报告界面。 组件化结构设计 创建可复用的Vue组件来组织报告模板的不同部分。典型结构…

css制作模板

css制作模板

CSS 制作模板的方法 使用 CSS 变量定义主题 通过 CSS 变量(自定义属性)定义颜色、字体、间距等主题元素,便于全局统一修改。例如: :root { --primary-color: #…