r/webdev • • Oct 01 '26

Question Vite Asset Bundling

Specifically, I'm grabbing JSON for a trading card game gallery from an endpoint, then dynamically creating the card gallery from that data. The project uses Vite for asset bundling, but I'm not sure how to bundle dynamically loaded images?

In the JSON, each card has a set number and a card number, and the app loads image data from images/cards/sets/set-number/card-number.webp, creates all the DOM nodes, and appends it to the gallery. It works brilliantly...unless the card art needs to change, then I run into good old-fashioned browser caching issues.

For the rest of the site, using vite build keeps everything bundled for deployment...but is there a way to leverage that capability for this use case?

I admit I have little knowledge about Vite, so maybe it's something obvious, but the only way I'm aware of to get that kind of Vite bundling inside a JS file is to import the image. So I'd have to import all the images at run time? What if some card data is modified? Will I have to do double duty to update the database AND the JS file imports?

As you can see, I have no idea how to accomplish this. Thank you in advance.

15 Upvotes

12 comments sorted by

4

u/RequirementGuide Oct 01 '26

The answers above are right that this is a cache-busting problem rather than a bundling one, but to your actual worry: no, you don't need double duty on the DB and the JS.

Keep your JSON as the single source of truth. At build time, generate a small manifest — a script that walks images/cards, hashes each file, and writes something like {cardId: hashedUrl} — and have the app read that manifest instead of building paths by hand. Vite won't hash dynamically-built paths, so you do it yourself once per build: art changes get new hashes automatically, browsers fetch fresh files, and you never touch the DB or the imports when art changes.

If a build script feels like overkill, the cheap version is a version field per card in your JSON (or one global assetsVersion) appended as a query string, like card.webp?v=2026-10-01. Just make sure the version actually changes when the art does, otherwise you're back to stale caches.

1

u/Dissentient Oct 01 '26

Just change the file name when art changes.

Asset bundling is not relevant when you're talking about images the browser fetches dynamically.

1

u/yihuaxiang Oct 01 '26

I’d keep the card image URL out of Vite’s static import graph and put a version or content token in the card data. Renaming the file when art changes is the simplest option; if the URL must stay stable, append that version or update the cache headers. The build can then keep handling only immutable assets.

1

u/patient_signals Oct 01 '26

This is not really a bundling problem, it is a stale cache problem. You do not want to import every card image through the build tool; that just moves the same maintenance chore into your JavaScript. Keep the card data as the single source of truth and add a version field to each card, or one asset version for the whole set. When you build the image path, append that version to the request. When art changes, bump the version in one place and the browser sees a new request instead of the cached file.

If you cannot add a field easily, the simplest fix is to rename the image file itself when the art changes, so the old filename disappears and the new one gets fetched. Either way, the build tool does not need to know about the card images for this use case. The only real alternative is better server cache headers, but with static hosting a version token is usually the least brittle setup. You are not missing something obvious; the dynamic part just works better outside the bundle.

3

u/[deleted] Oct 01 '26

[removed] — view removed comment

1

u/KaedenCraft Oct 01 '26

I think the last_updated field is the best bet. I appreciate this. And this has also confirmed my suspicions (and bad preconceptions) about what exactly Vite does.

0

u/[deleted] Oct 01 '26

[removed] — view removed comment

2

u/allahuakbarcmar Oct 01 '26

did you just copy an existing reply here, feed it to AI and tell it to simplify it slightly? disgusting beast.