Basic 11ty Setup
I wanted to just share how I get my eleventy projects up and running instead of trying to reverse engineer my other projects and copy and pasting bits and pieces. I have been really taking a liking to tailwind so after that install and setup I can create a basic layout and from there every site starts to diverge into it's own monster. I am sure this will be a living document that I will come back to and change over time as I learn, so it will act as a reference for getting up and running.
Install 11ty #
First and foremost you want to setup a npm project so that you can start pulling in libraries and add-on for later use. After that get 11ty setup in the project.
npm init -y
npm install -D @11ty/eleventy
With eleventy installed now some basic setup is required to make everything start working together with my workflow. Again out of the box 11ty can actually be used as is out of the box and things will work just fine. I have just found a few things that I like to work with and ways of using certain addon and tools.
Basic Config #
11ty has a great feature for development eleventy --serve
. This allows you to develop and see the output at the same time. I add a script to package.json
to allow some live programming. Just keep in mind that any changes to the config require a stop and start so in the beginning this might not be that useful but something I like to get out the way. Add the following to package.json
:
...
"scripts": {
"dev": "eleventy --serve",
"build": "eleventy"
},
...
Add _site to .gitignore
so that it's not added to your repo once you start developing locally and commiting changes. It is created at build time so is not required to be added to the repo and you acutally want it to rebuild each time so that anyone new doesn't have some changes that might have been made as a one time customization. Add the following to .gitignore
:
_site
Because I prefer putting all my source data in a specific directory there is a little bit of configuration required and there is a file called .eleventy.js
that you will eventually create once you start customizing things and adding filters or plugins but more on this later. I create .eleventy.js
as follows
module.exports = function (eleventyConfig) {
return {
passthroughFileCopy: true,
dir: {
input: 'src',
includes: '_includes',
data: '_data',
output: '_site',
},
};
};
Firstly I prefer putting all my files in the src
directory. The next thing is you need to create the src
directory and also the index.md
to get a basic skeleton for the site
mkdir src
touch src/index.md
echo '# Heading' > src/index.md
npm run dev
This should give you the basics of getting a very basic structure along with a landing page. Now it's time to let templating come to the fore and also add tailwind to make things look a bit better although this is completely at your discretion and you can use any layout system you want.
Add some structure #
The data directory is where you can store as the name suggests data used in 11ty. I'll just setup a basic setup for information that can be used to get up and running.
Create a file called _data/metadata.json
under the src directory
mkdir src/_data
touch src/_data/metadata.json
And then add the following:
{
"title": "Hilton Meyer",
"url": "https://hiltonmeyer.com",
"description": "My little blog",
"author": {
"name": "Hilton Meyer",
"email": "me@hiltonmeyer.com"
}
}
To use the layouts you need to create a template, I prefer nunjucks but 11ty is very flexible and comes with quite a few out of the box that you can plug and play with.
mkdir -p src/_includes/layouts
touch src/_includes/layouts/base.njk
Add the following the following to src/_includes/layouts/base.njk
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
{{ renderData.title or title or metadata.title}}
</title>
<meta
name="Description"
content="" />
</head>
<body>
<header>
<h1>{{ metadata.title }}</h1>
<div>
{%- for nav in collections.nav -%}
<a href="{{ nav.url | url }}">{{ nav.data.navtitle }}</a><br />
{%- endfor -%}
</div>
</header>
<main>
{{ content | safe }}
</main>
</body>
</html>
Now that there is a basic layout template, this is just the base, the base can now be used to create sub-templates but that is a deeper rabbit hole and I want to stick to just getting something up and running. So to use the layout I can update my index.md
as follows:
---
title: Pantry
layout: layouts/base.njk
tags:
- nav
navtitle: Home
date: 2000-01-01
---
## My basic layout
The main thing to pay attention to is the nav settings. In the base.njk
I added to following for nav in collections.nav
. This will loop through any page that has the tags in it and then add it to the collection if it has the tag of nav
. You can call it anything and collections are really powerful in 11ty. By using this in my base template I have used it to create navigation on the fly which is what I usually use it for. So any subsequent navigation I want in the site I just add it to that pages meta as I did for the Home page. The navtitle
is then shown as the title of the navigation but I still have the title
for using on the page itself. The order is by date
so this I use as a way to hack the order of the navigation items.