An In-Depth Tutorial of Webmentions + Eleventy
Add Webmentions to your Eleventy static site with this step-by-step tutorial.
Want to get started with Eleventy but feel overwhelmed? Try out this pared-down tutorial
I like to talk and write about Eleventy a LOT. I always run into this problem of having to introduce Eleventy to people not familiar with it in a short way. So, I wrote up this miniature demo to give people a flavor of Eleventy without overwhelming them with all the details. If you like it as much as I do, maybe it will inspire you to learn more!
The code for this repo can be found on Github. This article is meant for people new to Eleventy and will show you how to:
main
branch)2-layout-styles
branch)3-blog
branch)To get started, clone the repo, cd into it, and run npm install
.
The steps to get it to this point ("step 1") were:
npm init -y
npm install @11ty/eleventy
start
script of npx @11ty/eleventy --serve
and a build script of npx @11ty/eleventy
./_site/
with the filename index.html
.Checkout branch 2-layout-styles
to see this next step. In this step, I move our source code to a /src/
folder, add a layout file, and add a CSS styles file.
To build it on your own:
First, we move our source code to /src/
:
/src/
and move index.md
into it..eleventy.js
file in the root of the project with the following content:module.exports = function(eleventyConfig) {
// Set custom directories for input, output, includes, and data
return {
dir: {
input: "src",
includes: "_includes",
data: "_data",
output: "_site"
}
};
};
Most of those are defaults - change their name in this file if you'd like to use a different name. You'll need to restart your dev server for any changes in this file to take effect.
Next, add a layout:
/src/_includes/layout.njk
. This is a Nunjucks template, but you can use many others. The stuff in curly brackets are things that we will fill in at build time:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Grab title from the page data and dump it here -->
<title>{{ title }}</title>
</head>
<body>
<!-- Grab the content from the page data, dump it here, and mark it as safe -->
<!-- Safe docs: https://mozilla.github.io/nunjucks/templating.html#safe -->
{{ content | safe }}
</body>
</html>
/src/index.md
file to tell it which layout to use and to set the title
data attribute:---
layout: layout.njk
title: The Best Eleventy Demo TM
---
Finally, add some CSS:
/src/style.css
. Add some CSS to that file.<link rel="stylesheet" href="/style.css">
to the head of /src/_includes/layout.njk
..eleventy.js
:module.exports = function(eleventyConfig) {
// Copy `src/style.css` to `_site/style.css`
eleventyConfig.addPassthroughCopy("src/style.css");
return {
// When a passthrough file is modified, rebuild the pages:
passthroughFileCopy: true,
dir: {
input: "src",
includes: "_includes",
data: "_data",
output: "_site"
}
};
};
Checkout branch 3-blog
to see this next step. In this step, I create blog posts and an index of those posts.
/src/blog/
folder.welcome-to-my-blog.md
, remembering to set the layout and title:---
layout: layout.njk
title: Welcome to my blog
---
# Welcome
These are profound thoughts.
We can now access it at http://localhost:8080/blog/welcome-to-my-blog/, but it would be nice to get some links on our home page for all our posts. For that, we should make a collection for our blog posts. We will do this using tags.
blog
tag to our blog post's frontmatter:---
layout: layout.njk
title: Welcome to my blog
tags: blog
---
/src/index.md
file to use Nunjucks instead by changing .md
to .njk
and changing the current content to html:---
layout: layout.njk
title: The Best Eleventy Demo TM
---
<h1>Yo Eleventy</h1>
<p>This site rocks.</p>
/src/index.njk
) usink a Nunjucks for loop:<ul>
{% for post in collections.blog %}
<li><a href="{{ post.url }}">{{ post.data.title }}</a></li>
{% endfor %}
</ul>
/src/_includes/layout.njk
inside the <body>
:<nav>
<a href="/">Home</a>
</nav>
This is when I'd probably make another layout for a blog post so that the title is automatically rendered in its <h1>
, but then this baby demo would be longer. :)
Once you've had a chance to play with collections and other forms of data in Eleventy, I recommend you check out my article Architecting data in Eleventy to learn more. It might be a bit much if this is your first time.
What else can Eleventy do? So much! Here's a list of some of my favorite features:
IndieWeb Eleventy JavaScript Jamstack
I'm a freelance performance engineer and web developer, and I'm available for your projects.
Hire meAdd Webmentions to your Eleventy static site with this step-by-step tutorial.
Building the lowest-cost e-commerce solution with static site generation and serverless functions
Setting and using data in the static site generator Eleventy
If you liked this article and think others should read it, please share it.
I am quite a bit past this, though it is helpful review. Looking forward to the Magnolia conference. I am enjoying 11ty for building out static site projects and demos. source
Yep this is more for people with no experience source
These are webmentions via the IndieWeb and webmention.io. Mention this post from your site: