Skip to content

Instantly share code, notes, and snippets.

@jakub-g
Last active April 13, 2024 12:22
Show Gist options
  • Save jakub-g/5fc11af85a061ca29cc84892f1059fec to your computer and use it in GitHub Desktop.
Save jakub-g/5fc11af85a061ca29cc84892f1059fec to your computer and use it in GitHub Desktop.
Will it double-fetch? Browser behavior with `module` / `nomodule` scripts

Testing double-fetching of module/nomodule JS code (including the Safari hack)

<script type="module" src="module.js"></script>
<script nomodule src="nomodule.js"></script>

Update September 2020: life's almost good. Edge Chromium is widely rolled out, and Safari 14.0 ships soon with a fix.

Test page: https://jg-testpage.github.io/es-modules/module-nomodule/

IE/Edge Firefox Chrome Safari fetches module fetches nomodule executes
15- 59- 55- 10.0- v v nomodule
16 10.1/3 v v module
17-18 double! v module ❌❌
56-60 v nomodule
11-13.1 v module ✅⚠
79+ 60+ 61+ 14.0+ v module

Summary:

  • ✅ no browser does double execution (provided the Safari hack)
  • ✅ modern Chrome, Edge, Firefox never fetch more than necessary
  • ⚠ Safari <11 may or may not double fetch (even with the hack); it does not on small test pages, but in real complex pages it does (it seems deterministic, but not clear what's the exact trigger)
  • ⚠ Safari 11+ may still double fetch in some cases (see https://bugs.webkit.org/show_bug.cgi?id=194337)
    • This will apparently be fixed in Safari 14.0 (October 2020)
  • ❌ pre-2018 browsers do double fetches
  • ❌❌ Edge 17-18 does triple fetch (2x module + 1x nomodule). This about 80% of all Edge as of April 2020, but being phased out by Edge 80+.
@AndrewGibson27
Copy link

@jakub-g
Copy link
Author

jakub-g commented Jan 31, 2020

👍 thx for the comment @AndrewGibson27. Hopefully this makes it into Safari 13.1 (for now it's in Technical Preview only)

@indexzero
Copy link

Was your PR to caniuse (awesome btw – super helpful for me) supposed to show green for Safari 11-13 @jakub-g? Based on the Webkit comment above it seems like caniuse for es6 modules should be showing Yellow:

Screen Shot 2020-02-07 at 6 01 00 AM

My gut is saying regression in caniuse, but I wanted surface it your way since it was your contribution originally.

@jakub-g
Copy link
Author

jakub-g commented Feb 20, 2020

@indexzero I think I made PR to caniuse before I found out Safari 11+ double fetching, not sure. My PR touches only Edge.

Agree there's inconsistency - Edge 16-18 and Safari 10.1 should be marked with same color on caniuse (whether or yellow or green, I can't tell; not sure what is the meaning; probably yellow up to Edge 18 and Safari 13/ ios 13.2 inclusive, due to double fetching?)

@AndrewGibson27
Copy link

It appears this didn't make it into Safari 13.1 😢

@siakaramalegos
Copy link

@jakub-g, I think normal loading works on the new Chromium-based Edge now. I ran your page, and I think it only downloads module.js, but I wasn't sure if you were testing other edge cases too.

@davidpelayo
Copy link

Could you please, @AndrewGibson27, provide a link with where you saw that? Thanks!

@danoc
Copy link

danoc commented Apr 22, 2020

It isn't working for me in Safari 13.1 either:

image

It does work in Safari Technology Preview 104 which corresponds a the future Safari 13.2 release.

image

@jakub-g
Copy link
Author

jakub-g commented Apr 27, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment