/
.eleventy.js
108 lines (96 loc) · 2.79 KB
/
.eleventy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const fs = require("node:fs");
// 11ty plugins
const pluginWebc = require("@11ty/eleventy-plugin-webc");
const { eleventyImagePlugin } = require("@11ty/eleventy-img");
const bundlerPlugin = require("@11ty/eleventy-plugin-bundle");
// Minification/asset processing libs
const esbuild = require("esbuild");
const { minify: minifyCSS } = require("csso");
const { minify: minifyHTML } = require("html-minifier-terser");
const IS_PRODUCTION = process.env.NODE_ENV === "prod";
module.exports = function (eleventyConfig) {
// Set up webc plugin to process all webc files
eleventyConfig.addPlugin(pluginWebc, {
components: [
"src/_components/**/*.webc",
"npm:@11ty/eleventy-img/*.webc",
"npm:@11ty/is-land/**/*.webc",
],
});
// Trigger a hot reload when a JS/CSS file changes
eleventyConfig.addWatchTarget("src/**/*.{js,mjs,css}");
eleventyConfig.addPassthroughCopy({
"src/assets/fonts": "/fonts",
"src/assets/img/favicon.png": "/img/favicon.png",
"src/assets/img/og.jpg": "/img/og.jpg",
"src/assets/**/*.pdf": "/",
});
// Image plugin
eleventyConfig.addPlugin(eleventyImagePlugin, {
formats: ["avif", "webp", "auto"],
widths: [320, 720, 1280, 1920],
urlPath: "/img/",
outputDir: "./_site/img/",
defaultAttributes: {
loading: "lazy",
decoding: "async",
},
});
// Apply custom transforms to bundled JS and CSS
eleventyConfig.addPlugin(bundlerPlugin, {
transforms: [
async function (content) {
switch (this.type) {
case "js":
try {
// Minify the JS bundle for production builds
return (
await esbuild.transform(content, {
minify: IS_PRODUCTION,
target: "es2015",
})
).code;
} catch (e) {
console.error("Error while minifying JS bundle:", e);
}
break;
case "css":
try {
// Minify the CSS bundle
return minifyCSS(content).css;
} catch (e) {
console.error("Error while minifying CSS bundle:", e);
}
break;
default:
}
return content;
},
],
});
// Minify the HTML output
eleventyConfig.addTransform("htmlmin", async function (content) {
if (
IS_PRODUCTION &&
this.page.outputPath &&
this.page.outputPath.endsWith(".html")
) {
try {
return await minifyHTML(content, {
useShortDoctype: true,
removeComments: true,
collapseWhitespace: true,
});
} catch (e) {
console.error("HTML minification error: ", e);
return content;
}
}
return content;
});
return {
dir: {
input: "src",
},
};
};