npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

echotag

v1.3.1

Published

Simple & fast ES6 templates with no special syntax or transpilation

Downloads

5

Readme

echotag.js - Simple ES6 Templates

echotag.js is a simple ES6 tagged template function for printing HTML strings that handles common patterns like returning arrays of other templates, and escapes HTML in all variables by default for XSS prevention (but can also explicitly allow HTML when needed).

Use Cases

  • All you want to do is render HTML to a string (in Node.js or the browser)
  • You only want to use built-in JavaScript features
  • You want template variables to be HTML-escaped by default (XSS prevention)
  • You don't want to pay the cost of parsing or compiling templates
  • You don't want to learn a special template syntax like EJS, Jade, Underscore, etc.
  • You don't want to add complexity to your build system (Babel, TypeScript, etc.)
  • You don't need a virtual dom or reactive updates built-in (React, etc. are overkill)

Installation

You can install echotag.js via NPM:

npm install echotag --save

Examples

0. Require echotag.js

With CommonJS/Node.js:

const tmpl = require('echotag').tmpl;

let content = tmpl`<div>Hello World!</div>`;

With ES6 Modules:

import { tmpl } from 'echotag';

let content = tmpl`<div>Hello World!</div>`;

1. Simple Variable Replacement

Since echotag.js is just an ES6 tagged template function, you can use the normal ES6 syntax you already know in your templates:

const tmpl = require('echotag').tmpl;

let world = 'World';
let content = tmpl`
  <div>
    Hello ${world}!
  </div>
`;

2. Allowing HTML In Variables (for Layouts, etc.)

Since echotag.js auto-escapes HTML in variables by default, you must explicitly use the :html modifier so that the HTML tags are preserved if you want to allow HTML, or if you are using echotag templates within templates (i.e. for layouts with template content).

Simple Example

We use the :html modifier to explicitly allow HTML in the world variable:

const tmpl = require('echotag').tmpl;

let world = '<blink>World</blink>';
let content = tmpl`
  <div>
    Hello ${world}:html
  </div>
`;

Example With a Layout

A more real-world example with a layout function that accepts a title and content parameter.

The content parameter should allow HTML (so we can use it in our content templates), so we use the :html modifier to explicitly allow it. Any HTML in the title variable will be escaped by default.

const tmpl = require('echotag').tmpl;

function layout(params = {}) {
  return tmpl`
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>${params.title}</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
        <link href="/css/main.css" rel="stylesheet" />
      </head>
      <body>
        <div class="content">
          ${params.content}:html
        </div>
      </body>
    </html>
  `;
}

let content = tmpl`
  <div>
    Hello World!
  </div>
`;

console.log(layout({ content, title: 'Homepage' }));

3. Using Data Arrays

Building HTML with arrays of data is similarly easy in echotag.js, and is very JSX-like, without the cost of transpilation. It's also way faster since it's just plain strings and built-in JavaScript. 😎

const tmpl = require('echotag').tmpl;

let data = [
  { title: 'World' },
  { title: 'Earth' }
];

let content = tmpl`
  <ul>
    ${data.map(function (world) {
      return tmpl`<li>Hello ${world.title}</li>`;
    })}:html
  </ul>
`;

4. Use with Express.js

For server-side rendering, echotag.js can be a great lightweight and native alternative to template engines like EJS and Jade, replacing them with a simple function call that returns the HTML you need to render.

const express = require('express');
const tmpl = require('echotag').tmpl;

// Setup Express.js
const app = express();

// Define a function that returns the content wrapped in our layout HTML markup
// NOTE: Typically, this will be in a separate file
function mainLayout(params = {}) {
  return tmpl`
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>${params.title}</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
        <link href="/css/main.css" rel="stylesheet" />
      </head>
      <body>
        <div class="content">
          ${params.content}:html
        </div>
      </body>
    </html>
  `;
}

// Define a route
app.get('/', function (req, res) {
  // Prepare our content, or call a function that returns it, etc.
  let title = 'Hello World!';
  let world = 'World';
  let content = tmpl`
    <div>
      Hello ${world}!
    </div>
  `;

  // Send content without any template engine overhead - now it's just a simple function call
  res.send(mainLayout({ content, title }));
});


// Listen on port for web requests
app.listen(process.env.PORT || 1338);