We did it. After 22 pre-releases and over a year of work, Eleventy 3.0.0 is now available. You can try it out now on your project using:
npm install @11ty/eleventy@latest
If you’re upgrading from a previous version of Eleventy, use the Upgrade Help plugin for automated checks and help with your upgrade!
Why should you use Eleventy? Eleventy is a flexible and production-ready site generator known for its zero-client JavaScript footprint, speedy sites, speedy builds, and full control over the output.
A few numbers on the best version of Eleventy yet:
Stats | v2.0.1 |
v3.0.0 |
---|---|---|
20% smaller | 35.2 MB | 28.1 MB |
11% fewer dependencies | 213 | 189 |
9% faster npm install | 4.511s* | 4.103s* |
*fastest time of 3 runs (bypassing local cache)
Flagship 3.0 features
- Eleventy is now written in ESM with full support for ESM in your projects: configuration, data files, 11ty.js templates, etc. For many projects this won’t be a breaking change and we’ll continue to support CommonJS too. Every example on the docs now includes both a CommonJS and ESM version. Docs: https://v3.11ty.dev/docs/cjs-esm/
// ESM
export default function(eleventyConfig) {}
// We’ll keep supporting CommonJS:
module.exports = function(eleventyConfig) {}
- Supporting more package managers and runtimes: pnpm, yarn, Deno. More examples on the docs! https://v3.11ty.dev/docs/
- Asynchronous configuration #614 Docs: https://v3.11ty.dev/docs/config/
// ESM
export default async function(eleventyConfig) {}
// CommonJS
module.exports = async function(eleventyConfig) {}
- For-free performance improvement to built-in
slugify
,inputPathToUrl
universal filters (via memoization) #840 Docs: https://v3.11ty.dev/docs/memoize/ - Named
config
export improves consistency for plugins #3246 andset*Directory
configuration API methods #1503 Docs: https://v3.11ty.dev/docs/config-shapes/#optional-export-config-object and https://v3.11ty.dev/docs/config/#configuration-options
export default function(eleventyConfig) {
eleventyConfig.setInputDirectory(".");
eleventyConfig.setOutputDirectory("_site");
};
export const config = {
dir: {
input: ".",
output: "_site"
},
};
- Virtual Templates, configuration API to add content (great for plugins, used by the new RSS plugin!) #1612 Docs: https://v3.11ty.dev/docs/virtual-templates/
export default function(eleventyConfig) {
eleventyConfig.addTemplate("robots.njk", "User-agent: *\nAllow: /", {
permalink: "/robots.txt",
});
};
- IdAttribute plugin adds
id
attributes to headings for on-page anchor links (supports all template-languages) #3363 Docs: https://v3.11ty.dev/docs/plugins/id-attribute/
<h1>Welcome to my web site</h1> becomes <h1 id="welcome-to-my-web-site">Welcome to my web site</h1>
- Plain-text Bundler included: https://v3.11ty.dev/docs/plugins/bundle/
export default function(eleventyConfig) {
eleventyConfig.addBundle("css"); // Adds {% css %} paired shortcode to create per-page CSS bundles
};
- InputPath to URL plugin lets you link directly to an input file path (and we’ll output the right URL) Docs: https://www.11ty.dev/docs/plugins/inputpath-to-url/
<a href="my-template.md">Home</a> becomes <a href="/my-template/">Home</a>
- Use arbitrary JavaScript with the
js
Front Matter #2819 Docs: https://v3.11ty.dev/docs/data-frontmatter/#javascript-front-matter
---js
const hello = "hi";
---
{{ hello }}
page.rawInput
unlocks access to raw template content #1206 https://v3.11ty.dev/docs/data-eleventy-supplied/#page-variableaddPreprocessor
configuration API to modify raw content before rendering works for file ignores and drafts #188 Docs: https://v3.11ty.dev/docs/config-preprocessors/addDateParsing
configuration API to add your own custom date parsing logic #867 Docs: https://v3.11ty.dev/docs/dates/#configuration-api-for-custom-date-parsingeleventyDataSchema
data option to validate data cascade values #879 Docs: https://v3.11ty.dev/docs/data-validate/- Reserved Eleventy properties in data cascade are now frozen #1173 Docs: https://v3.11ty.dev/docs/data-eleventy-supplied/#frozen-data
- Support for asynchronous plugins and async-friendly
addPlugin
configuration API #2675 Docs: https://v3.11ty.dev/docs/plugins/#plugins-are-configuration useLayouts
option for Custom Template Languages allows opt-out of Eleventy Layouts #2830 Docs: https://v3.11ty.dev/docs/languages/custom/#uselayoutsrenderTransforms
Universal Filter will run project transforms on an arbitrary block of content (useful for RSS and other feeds) #3294--incremental=filename.md
on the command line #3324 Docs: https://v3.11ty.dev/docs/usage/#incremental-for-partial-incremental-buildsrenderContent
Universal Filter now included with Render Plugin #3370 Docs: https://v3.11ty.dev/docs/plugins/render/#rendercontent-filter- Dev Server updates including
onRequest
API for handling requests dynamically during development (used with the new Image Transform plugin)
Breaking Changes and Upgrade Path
Rather than navigating this list manually, use the Upgrade Help plugin for automated project checks and upgrade help!
- Requires Node 18 or newer.
- Removes Serverless and Edge plugins.
- Use of bundled Eleventy plugins from CommonJS requires changing
require("@11ty/eleventy")
toawait import("@11ty/eleventy")
for ESM reasons. We provide helpful error messaging for this. pug
,ejs
,haml
,mustache
, andhandlebars
template languages moved from core to official plugins:- Throw errors if
--config=
command line file is missing #3373 - The
htmlOutputSuffix
feature was removed #3327 - Aliased custom templates must be declared in active formats #3302
--formats=
and--formats=""
on command line means no formats (previously aliased to*
) #3255- Custom Template Language
compileOptions.permalink
option changed fromtrue
to"raw"
#2780 - Major semver updates of dependencies:
js-yaml
v3 to v4 Changelog- Better error messaging when using tabs in YAML
- Numbers are now parsed according to YAML 1.2 spec (from 1.1)
@sindresorhus/slugify
v2 to v3 Changelog: Node 12+, Pure ESMbcp-47-normalize
v1 to v2 Changelog: Pure ESMdependency-graph
v0.x to v1 Changelogiso-639-1
v2 to v3 Changelog: Pure ESMmarkdown-it
v13 to v14 Changelog: Pure ESM, removeddist
folder
- Full list of breaking changes
Minutiae
- Packages are now published using npm package provenance.
- The code base is using tabs 😱😈 #3098
Full Eleventy v3 Milestone (177 closed): https://github.com/11ty/eleventy/milestone/40?closed=1
Full Changelog: v2.0.1...v3.0.0
Thank You Notes
This release would not have been possible without our community and supporters.
- To everyone that has built something with Eleventy: thank you!
- To everyone that has answered a question about Eleventy: on the Discord, on social media, in GitHub issues or discussion, at your local meetup or coffee shop: thank you!
- To everyone that attended the 11ty Conference earlier this year: thank you!
- To everyone that brought a well-intentioned complaint about something you didn’t like about Eleventy: thank you!
- To everyone that dropped a few nice words of appreciation: thank you!
- To everyone that has supported us and made this release possible: thank you!
Thank you to @bobmonsour, @pdehaan, @Snapstromegon, @cdransf, @5t3ph, @BenDMyers, @siakaramalegos, @shivjm, @dleatherman, @darthmall, @clottman, @nachtfunke, @David-Large, Olivia Nicholson, and @mneumegen for their community contributions!
Thank you for the code contributions from @VividVisions, @mayank99, @Zearin, @chriskirknielsen, @mendhak, @fqueze, @shivjm, @rdela, @w0whitaker, @vrugtehagel, @sachac, @Snapstromegon, @alifeee, @uncenter, @Zwyx, @mayankkamboj47, @aschrab, @jgarber623, @korverdev, @mathertel, @mathieuprog, @epelc, @Ryuno-Ki, @lexoyo, @satgo1546, @KiwiKilian