Skip to content

Engine: Optimize HTML-only templates #651

Description

@marcoroth

Given an HTML-only template, the Herb::Engine could optimize it to not use any Ruby, besides the Ruby String itself.

A template like:

<header class="site-header">
  <nav class="navbar">
    <div class="container">
      <a href="/" class="logo">
        <img src="/images/logo.svg" alt="Company Name">
      </a>
      <ul class="nav-menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contact">Contact</a></li>
      </ul>
      <button class="menu-toggle" aria-label="Toggle menu">
        <span></span>
        <span></span>
        <span></span>
      </button>
    </div>
  </nav>
</header>

Gets compiled to this using Herb::Engine today:

__herb = ::Herb::Engine; _buf = ::String.new;
 _buf << '<header class="site-header">
  <nav class="navbar">
    <div class="container">
      <a href="/" class="logo">
        <img src="/images/logo.svg" alt="Company Name">
      </a>
      <ul class="nav-menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contact">Contact</a></li>
      </ul>
      <button class="menu-toggle" aria-label="Toggle menu">
        <span></span>
        <span></span>
        <span></span>
      </button>
    </div>
  </nav>
</header>
'.freeze;
_buf.to_s

This could get optimized to just be this:

'<header class="site-header">
  <nav class="navbar">
    <div class="container">
      <a href="/" class="logo">
        <img src="/images/logo.svg" alt="Company Name">
      </a>
      <ul class="nav-menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contact">Contact</a></li>
      </ul>
      <button class="menu-toggle" aria-label="Toggle menu">
        <span></span>
        <span></span>
        <span></span>
      </button>
    </div>
  </nav>
</header>
'

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions