From 2b665267908afc501501573511c626f175651a5a Mon Sep 17 00:00:00 2001 From: ludeeus Date: Thu, 29 May 2025 14:17:58 +0000 Subject: [PATCH 1/2] Implement cache buster for css and js asset files --- .eleventy.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.eleventy.js b/.eleventy.js index 25fc2ca..6d9add7 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,3 +1,6 @@ +const { resolve } = require("path"); +const { statSync } = require("fs"); + module.exports = (eleventyConfig) => { eleventyConfig.addWatchTarget("./src/assets"); @@ -19,6 +22,22 @@ module.exports = (eleventyConfig) => { "node_modules/swiper/swiper-bundle.min.css": "assets/swiper-bundle.min.css", }); + eleventyConfig.addTransform("cache-buster", function (content, outputPath) { + const assetsDir = resolve(eleventyConfig.dir.output, "assets"); + if (outputPath.endsWith(".html")) { + return content.replace( + /="\/assets\/([^"]+\.(css|js))"/g, + function (_, matcher) { + const filepath = matcher.split("?")[0]; + const fileStat = statSync(resolve(assetsDir, filepath)); + const timestamp = fileStat.mtime.getTime(); + return `="/assets/${filepath}?v=${timestamp}"`; + } + ); + } + return content; + }); + return { dir: { input: "src", From e4f657742885c13bfe2405ebb3811c35778bcfd3 Mon Sep 17 00:00:00 2001 From: ludeeus Date: Thu, 29 May 2025 14:41:56 +0000 Subject: [PATCH 2/2] Better handling for node_module copies --- .eleventy.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 6d9add7..408add7 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,5 +1,5 @@ const { resolve } = require("path"); -const { statSync } = require("fs"); +const { statSync, existsSync } = require("fs"); module.exports = (eleventyConfig) => { eleventyConfig.addWatchTarget("./src/assets"); @@ -23,14 +23,26 @@ module.exports = (eleventyConfig) => { }); eleventyConfig.addTransform("cache-buster", function (content, outputPath) { - const assetsDir = resolve(eleventyConfig.dir.output, "assets"); + const assetsInputDir = resolve(eleventyConfig.dir.input, "assets"); + const assetsOutputDir = resolve(eleventyConfig.dir.output, "assets"); if (outputPath.endsWith(".html")) { return content.replace( /="\/assets\/([^"]+\.(css|js))"/g, function (_, matcher) { const filepath = matcher.split("?")[0]; - const fileStat = statSync(resolve(assetsDir, filepath)); - const timestamp = fileStat.mtime.getTime(); + let timestamp + + if (existsSync(resolve(assetsInputDir, filepath))) { + // These are our source files, so we use their modification time + timestamp = statSync(resolve(assetsInputDir, filepath)).mtime.getTime(); + } else if (existsSync(resolve(assetsOutputDir, filepath))) { + // In cases where we are getting the output files from other places (like node_modules) + // we use the output directory's modification time. + timestamp = statSync(resolve(assetsOutputDir, filepath)).mtime.getTime(); + } else { + throw new Error(`File not found: ${filepath}`); + } + return `="/assets/${filepath}?v=${timestamp}"`; } );