eleventy-plugin-bundle icon indicating copy to clipboard operation
eleventy-plugin-bundle copied to clipboard

Nested bundles use-case

Open chriskirknielsen opened this issue 1 year ago • 1 comments

Hi! I am really enjoying these little bundles of joy.

I'm rebuilding a site and wanted to take advantage of this plugin. I have some one-off layouts for which the <head> content is different in terms of styles and scripts, and various tags (say <link>), so I can adjust what goes in the template for the head (lots of common tags like the title, icon, meta… justify not having duplicated files).

Here's my very simple <head> template:

<!-- parts/head.njk -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title | safe }}</title>

{% getBundle "html", "head" %}

Now, here's my default base.njk layout:

<!-- base.njk -->
<!doctype html>
<html lang="en">
	<head>
		{% html "head" %}
		<script>
			{% js "head" %}{% include "assets/js/global.js" %}{% endjs %}
			{% getBundle "js", "head" %}
		</script>
		<style>{% getBundle "css", "head" %}</style>		
		<link rel="alternate" type="application/rss+xml" title="{{ metadata.title }}" href="{{ metadata.rssUrl }}">
		{% endhtml %}
		<!-- This bundle would then be injected below -->
		{% include "parts/head.njk" %}
	</head>
	<body>
		<header> ...

And with my one-off template, I could use it like this:

<!-- one-off.njk -->
<!doctype html>
<html lang="en">
	<head>
		{% html 'head' %}
		<script>document.documentElement.classList.remove('no-js')</script>
		<style>
			{% css "one-off" %}{% include "assets/css/one-off.css" %}{% endcss %}
			{% getBundle "css", "one-off" %}
		</style>
		<link rel="preload" href="{{ page.data.font.path }}" as="font" type="font/woff2" crossorigin>
		{% endhtml %}

		{% include "parts/head.njk" %}
	</head>
	<body>
		<main>

The reason I can't reuse the very same setup is due to the fact I run PurgeCSS as a transform, and I cache my bundles, so they are reused across the site if the name is identical. I could use a unique bundle name (head-base', 'head-one-off'…) for my JS and CSS per layout but that seems a little gross and not scalable to add them in there. (I need scalability for my 3 layouts, of course 🙃)

I did try to see if it worked and while every element built out as I expected, the contents of those CSS and JS elements were a comment which I assume is replaced by a transform after the fact.

Currently I've worked around the problem by assigning {% block head %}{% endblock %} in my head.njk file and replace the {% html "head" %} with {% block head %}. That works fine in my case, but just wanted to make sure I reported a valid use-case regardless (well, valid enough in my eyes, perhaps!).

Thank you!

chriskirknielsen avatar Mar 23 '24 16:03 chriskirknielsen

I would be very interested in nested bundles capability, too.

The block syntax does not work when eleventy's front-matter layout is used. One must use nunjuck's extend instead, but that has its own problems in the eleventy's ecosystem. So i would very much need the capability described here.

Seramis avatar Feb 24 '25 11:02 Seramis