A spinner communicates "wait, nothing is happening yet." A skeleton screen communicates "this is already loading, here's roughly where things will appear" — it previews the structure before the content, which reduces the uncertainty that makes waiting feel longer.
The skeleton needs to actually match the real layout's proportions — a skeleton that doesn't resemble the final content creates a jarring layout shift when real content arrives, which undoes the benefit entirely. Match card sizes, text line counts, and image aspect ratios as closely as possible.
Product grids, search results, and any list-based content benefit the most, since the repeating structure is easy to preview accurately. A single hero image or a one-off page doesn't benefit as much — a spinner is fine there.