当前位置:首页 > JavaScript

js实现模板

2026-04-06 01:13:43JavaScript

模板引擎的实现

在JavaScript中实现模板引擎通常涉及字符串解析和变量替换。以下是几种常见的实现方式:

字符串替换法

最简单的模板引擎可以通过字符串替换实现:

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!

带逻辑的模板引擎

更复杂的模板引擎支持条件判断和循环:

function render(template, data) {
  const evalExpr = (expr, data) => {
    try {
      return new Function('data', `with(data){return ${expr}}`)(data);
    } catch (e) {
      return '';
    }
  };

  return template.replace(/<%=(.+?)%>/g, (_, expr) => evalExpr(expr, data))
                .replace(/<%(.+?)%>/g, (_, expr) => {
                  new Function('data', `with(data){${expr}}`)(data);
                  return '';
                });
}

const template = `
  <% if (show) { %>
    <h1><%= title %></h1>
  <% } %>
`;
const data = { show: true, title: 'Welcome' };
console.log(render(template, data));

使用Function构造函数

利用JavaScript的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 + '`);';

  const script =
  `(function parse(data) {
    const output = [];
    function echo(html) {
      output.push(html);
    }
    ${template}
    return output.join('');
  })`;

  return new Function('return ' + script)();
}

const template = `
  <ul>
    <% for(let i=0; i<data.length; i++) { %>
      <li><%= data[i] %></li>
    <% } %>
  </ul>
`;
const parse = compile(template);
console.log(parse(['apple', 'orange', 'banana']));

使用ES6模板字符串

现代JavaScript可以直接使用模板字符串:

function render(template, data) {
  return new Function('data', `return \`${template}\`;`)(data);
}

const template = `
  ${data.items.map(item => `
    <div class="item">
      <h2>${item.title}</h2>
      <p>${item.content}</p>
    </div>
  `).join('')}
`;
const data = {
  items: [
    { title: 'Item 1', content: 'Content 1' },
    { title: 'Item 2', content: 'Content 2' }
  ]
};
console.log(render(template, data));

安全考虑

实现模板引擎时需要注意XSS防护:

js实现模板

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

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

这些方法展示了从简单到复杂的JavaScript模板引擎实现方式,可以根据项目需求选择适合的方案。

标签: 模板js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现瀑布流

js实现瀑布流

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

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

div css网页制作模板

div css网页制作模板

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