nový modul async Template Engine pro Express.js

Potřebujeme ještě nástroje pro vytváření šablon, jako je ejs , jade , handlebars nebo nunchucks ? V javascriptu milujeme psaní asynchronního kódu. Splňují tyto šablonovací nástroje stále potřeby moderního javascriptu?

Celou cestu zpět, když jsme přecházeli z php nebo ruby ​​na node.js, mnozí z nás se naučili, jak vytvořit aplikaci s express.js.

Implementace obslužných rutin směrování, které nakonec volají response.render() metoda. Předáním části dat a konfigurovaným šablonovým modulem by se vytvořil řetězec html, který je vrácen klientovi. Následovalo vše mocný vzor MVC. Tedy v podstatě všechny použité frameworky. V dnešních aplikacích bylo zobrazení nahrazeno react nebo vue . A v poslední době se pomocí next.js a nuxt.js mohou vykreslit na serversite #ssr.

Templating Engines je dobré psát značky strukturovaným způsobem. Chcete-li vykreslit data, která jsou předána dovnitř. A vytvářet šablony zahrnutím nebo rozšířením dalších souborů šablon.

Dnes se situace trochu změnila a máme silnou alternativu. Máme šablonové řetězcové literály v Javascriptu. A věřím, že pomocí malé pomocné funkce, kterou vám ukážu níže, lze některé velmi důležité body zlepšit.

Problémem šablon šablon je, že se jedná o čistě synchronizační funkce. Náš kód node.js musí připravit všechna data, která šablona potřebuje pro své argumenty. To může vést ke zbytečnému přetěžování. Ne přetěžování dat klientovi, ale načítání více dat z databáze, než je potřeba v šabloně.

Dále vám ukážu malého pomocníka, který umožní vykreslovat šablony asynchronně.

async function t(strings, ...data) {
  const resolvedData = await Promise.all(data.map((d)=> {
    if (typeof d === 'function') {
      return d();
    } else {
      return d;
    }
  });
  resolvedData.push('');
  return strings.map(
    (s, i) => s + resolvedData[i]
  ).join('')
}

Vidíte, je to funkce, kterou lze použít jako značky šablony. Všechny parametry, které jsou předány, se převedou na řetězec.

Příklady

Dále uvidíme, jak můžeme použít tohoto pomocníka pro šablony k zahrnutí a rozšíření šablon a také uvidíme, jak se přesně potřebná data načítají z databáze.

  • Rozšiřitelná stránka nebo rozvržení

Tyto funkce šablony obvykle berou nějaké argumenty a umísťují je na místo.

function page ({title, meta, headers, content}) {
  return t`<!DOCTYPE html>
  <html>
    <head>
      <title>${title}</title>
      ${metatags(meta)}
      ${headers}
    </head>
    <body>${content}</body>
  </html>
  `;
}
  • Zahrnuté

Často se jedná o opakovaně použitelné běžné součásti, jako jsou tlačítka, karty nebo jako v tomto případě seznam meta tagů. Použil jsem slovo comonents zde velmi záměrně.

function metatags(metaData) {
  return Object.keys(metaDats || {}).map(
    key => `<meta name="${key}" content="${metaData[key]}" />`
  ).join('')
}
  • šablona pro stránku s celým článkem

Načte nějaká data a vyplní je na stránku. Články jsou dotazovány pomocí id, pomocí SQL, mongo nebo jakékoli rest nebo jiné služby, je to na vás.

async function article(id) {
  const article = await Articles.getById(id);
  return page({
    title: article.title,
    meta: {
      keywords: artitle.keywords,
      description: article.description
    },
    content: article.text,
  });
}
  • vytvořte aplikaci

Zde je zobrazena aplikace express js, ale může to být jakýkoli server. Koa, zrychli, co si jen vzpomenete. Zvládá http. Nenačte data, stačí vrátit odpověď.

const express = require('express');
const app = express();
app.listen(process.env.PORT || 3000);

app.get('/artitle/:id', async ({params})=>{
  res.header('Content-Type', 'text/html');
  res.send(await artitle(params.id));
});

aha, vynechal jsem ovladač? Potřebujete více logiky? Umístěte to, kamkoli uznáte za vhodné. Chceš nějakou injekci závislosti? Šabloně článku můžeme předat objekt kontextu, například objekt požadavku. To může mít všechny doplňky z middlewaru.

Tento vzor můžeme pojmenovat MV pattern . Protože jsme udělali ovladače volitelné. Není to velmi jednoduché vybrat šablonu pro API a vrátit se k uživateli?

Závěr

Všechny tipy v tomto článku nejsou příliš vážné. Ale doufám, že se vám malé ukázky líbily. A pro malé víkendové projekty, proč nezkusit něco nového? bavte se 😉