Is there a succinct guide to the history and use of all the JavaScript package types?

I keep getting lost in the woods with all the different package types. e.g. CJS, UMD, AMD, ESM (and more?) and their compatibility matrix with varying runtime environments, when they can be used, why they were developed, etc etc. Like, I know Node.js requires CJS, UMD is used mostly in the browser and is a superset of AMD and RequireJS(?), and ESM is the future. I’m interested in diving into the nuance.

Is there a handy cheat sheet to all of the above?

The real problem which sparked that question is making a JS package which works in Node and the browser. I’m really close, but I wish I had a better understanding.