Other page formats
Creating pages with Vento, JavaScript and other formats
We have seen how to create pages from Markdown files in Lume. This is a convenient way for text-based sites like blogs or documentation. But you may want to create a complex page with small texts, images, videos, animations, etc. Every page has its own format.
Create pages with Vento
Vento, the format we have used to create layouts in the previous examples, can also be used to create pages directly. You only have to create a file with the .vto
extension. For example:
---
title: Welcome to my page
layout: layout.vto
links:
- text: My Twitter
url: https://twitter.com/misteroom
- text: My GitHub profile
url: https://github.com/oscarotero
---
<article>
<header>
<h1>{{ title }}</h1>
</header>
<ul>
{{ for link of links }}
<li>
<a href="{{ link.url }}">
{{ link.text }}
</a>
</li>
{{ /for }}
</ul>
</article>
This is an example of a page using Vento. Like markdown, it can contain a front matter to store the page data, that is used to render the Vento code. Note that it has the layout
variable so the result of rendering this page will be passed to the layout in the content
variable (along with the other variables title
and links
).
Create pages in JavaScript
JavaScript can be useful for complex pages requiring some logic before rendering. You have to create a file with the extension .page.js
. The .page
sub-extension is required to distinguish the JavaScript files to generate static pages from other JavaScript files destined to the executed in the browser.
The previous Vento example in JavaScript is:
export const title = "Welcome to my page";
export const layout = "layout.vto";
export const links = [
{
text: "My Twitter",
url: "https://twitter.com/misteroom",
},
{
text: "My GitHub profile",
url: "https://github.com/oscarotero",
},
];
export default function ({ title, links }) {
return `
<article>
<header>
<h1>${title}</h1>
</header>
<ul>
${
links.map((link) => `<li><a href="${link.url}">${link.text}</a></li>`).join(
"",
)
}
</ul>
</article>`;
}
As you can see, the variables exported in the front matter in the Vento example are now exported as named ES modules.
The default export is a function that returns the page content. The first argument contains all available data for this page (not only the same variables exported by the page, but also other data provided by _data
files).
More formats
Lume supports several formats to generate pages. Go to the Plugins section to see more info about all available formats. Some of them are installed by default (like Vento, YAML, Modules etc) and others need to be installed in your _config.ts
file (like Nunjucks, Eta, JSX, Liquid or Pug).
Data model
If you want to better understand how Lume load the pages, go to Data
model page.