As an experiment, I made a small retail shop (< 30 products) that would use JS for modern style async/await calls, but would then use old school POSTs if JS was disabled with full page reloads on every POST. it sucked to dev and as UX, but it was possible to do. Had the non-JS POST style updates been any less annoying, it might have been viable. Nobody likes full reloads. They suck. JS can do nice things for UX. It's just that we can't have nice things because people suck
That's what frames are for. Only reload the frame with the important data in it (total cost, list of products in cart) and point the category links in the page to open in the same frame as the shopping cart. You can even style the frame contents with the main page's stylesheet so it only needs to load a `$41.29` total if that's all that's changed.
No, I did not defile myself that badly by using frames nor layout with tables either. <shudder> I did layout with CSS. It wasn't just an update to the total. It was a proper modern day UI look (if not so much feel) so that it had a collapsible shopping cart on the side so you could see the items and quantities and link back to the item's page.
If you're smart about the style/display format, this can be done with a frame that only has the necessary markup (ie just the contents of the cart, with links, think a sidebar/pop-up shopping cart embedded in the middle of the page). You can avoid the flash with css page transitions, too.
It's not as nice as scripted setup, but if you're on a decent connection (latency) it's about even with other forms of progressive enhancement since you're not loading an entire UI framework.
I'm not sure how well this would work for accessibility though, plain old frames aren't used much anymore.