8000 [AssetMapper] Remove `async` from the polyfill loading script by MatTheCat · Pull Request #59549 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[AssetMapper] Remove async from the polyfill loading script #59549

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 20, 2025

Conversation

MatTheCat
Copy link
Contributor
@MatTheCat MatTheCat commented Jan 18, 2025
Q A
Branch? 7.3
Bug fix? no
New feature? no
Deprecations? no
Issues Fix #59547
License MIT

From https://javascript.info/script-async-defer:

the async attribute is ignored if the <script> tag has no src.

and

Dynamic scripts behave as “async” by default.

@carsonbot
Copy link

Hey!

Thanks for your PR. You are targeting branch "7.3" but it seems your PR description refers to branch "7.2".
Could you update the PR description or change target branch? This helps core maintainers a lot.

Cheers!

Carsonbot

@MatTheCat MatTheCat changed the base branch from 7.3 to 7.2 January 18, 2025 16:26
if (!HTMLScriptElement.supports || !HTMLScriptElement.supports('importmap')) (function () {
const script = document.createElement('script');
script.src = '{$this->escapeAttributeValue($polyfillPath, \ENT_NOQUOTES)}';
script.setAttribute('async', 'async');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not what Mozilla doc states 🤔

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#notes

Scripts without async, defer or type="module" attributes, as well as inline scripts without the type="module" attribute, are fetched and executed immediately before the browser continues to parse the page.

And this seems to match html spec chart here

HTMLSPEC

Not found either in the spec something that would suggest async is default (but i may have missed it)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It’s from https://html.spec.whatwg.org/multipage/scripting.html#script-force-async:

A script element has a force async boolean, initially true. It is set to false by the HTML parser […] on script elements [it inserts], and when the element gets an async content attribute added.

The polyfill script is not parser-inserted, but MDN only mentions these 😕

You can easily check a script-inserted script is async by default though: https://jsfiddle.net/nL509xph/

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is set to false by the HTML parser and the XML parser on script elements they insert

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The polyfill script is not parser-inserted

Did you check the fiddle?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did check the fiddle :)

I'm just not entirely sure this is enough to state how the browsers will behave.

Your fiddle code "console log" attributes... this is not granted to be the behaviour off the parsers when they will start to load this (external) script.

And I think you will agree the MDN docs claims are something that creates doubts here.

I'm thinking except if we have a 100.00% insurance the script will always be loaded after the main JS files, the async attribute in the generated script does not cost us much, is perfectly W3 valid, and could be a safe bet.

:)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you don’t trust the browsers nor the spec I fear you cannot be sure of anything.

But then why would we trust the W3 validator? And are we really 100% sure removing the async attribute from the inline script won’t have any unattended consequence?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you don’t trust the browsers nor the spec I fear you cannot be sure of anything.

Not what i tried to say, nevermind :) If you're sure .. i don"t need to be convinced here 😅

My point was just a small fear I had this would have unwanted consequences.. that's all :)

Copy link
Member
@nicolas-grekas nicolas-grekas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works for me
implicit async on script inserted elements is safe to me by the nature of JS, which is async itself

@nicolas-grekas
Copy link
Member

Note that this is not a bugfix so it's for 7.3

@nicolas-grekas
Copy link
Member

Thank you @MatTheCat.

@nicolas-grekas nicolas-grekas merged commit 8c941de into symfony:7.3 Jan 20, 2025
9 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[AssetMapper] ImportMap render w3c validator error
4 participants
0