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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,10 @@ public function render(string|array $entryPoint, array $attributes = []): string
}

$output .= <<<HTML
<script async$scriptAttributes>
<script$scriptAttributes>
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 :)

{$this->createAttributesString($polyfillAttributes, "script.setAttribute('%s', '%s');", "\n ", \ENT_NOQUOTES)}
document.head.appendChild(script);
})();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,9 @@ public function testCustomScriptAttributes()
]);
$html = $renderer->render([]);
$this->assertStringContainsString('<script type="importmap" something data-turbo-track="reload">', $html);
$this->assertStringContainsString('<script async something data-turbo-track="reload">', $html);
$this->assertStringContainsString('<script something data-turbo-track="reload">', $html);
$this->assertStringContainsString(<<<EOTXT
script.src = 'https://polyfillUrl.example';
script.setAttribute('async', 'async');
script.setAttribute('something', 'something');
script.setAttribute('data-turbo-track', 'reload');
EOTXT, $html);
Expand Down
Loading
0