W3C home > Mailing lists > Public > whatwg@whatwg.org > July 2013

Re: [whatwg] Script preloading

From: Yoav Weiss <yoav@yoav.ws>
Date: Thu, 11 Jul 2013 01:10:26 +0200
Message-ID: <CACj=BEiWbmzT_AYuVJ6y+ipzm1MTKYE1_dA7sfTGcHNeJv8k8g@mail.gmail.com>
To: Kyle Simpson <getify@gmail.com>
Cc: "whatwg@whatwg.org" <whatwg@whatwg.org>
I'm supportive of this proposal, and I think it'd help declarative script
loading.

I've recently contemplated the slightly related issue of adding the "media"
attribute to <script>, for declarative loading of scripts that are only
relevant to some viewports [1]
While it may complicate certain things (e.g. execution when media
conditions change, dependencies), I believe it's worth while to give it
some thought, as it'd enable preloaders to fetch these scripts as soon as
possible, in case they are needed.


Regarding Kyle's list of use-cases, I think it can be summed up to
something like:
"Authors often need to load 3rd party scripts into their pages (e.g. ads,
widgets, analytics). These scripts are out of their control, and often do
not allow the hosting page to determine when they are executed.
In many cases, either for performance (they trigger download of their own
resources) or for UX purposes (they display something on the screen),
authors need to control when these scripts are executed."

IMO, the proposed "whenneeded" attribute can answer that need.
rel=subresource can also answer it (assuming that browsers will optimize on
it: download the resource, detect its type and parse it (as low priority)
if needed, and keep it in memory regardless of its caching headers), but
IMO "whenneeded" is cleaner.

For the #11 use-case, where you want to delay the execution of some scripts
until an entire group of scripts have finished downloading, but have yet to
run, it could be done with:
<script id="A" src="A.js" dependencies="B C" async whenneeded></script>
<script id="B" src="B.js" async whenneeded></script>
<script id="C" src="C.js" async whenneeded></script>

<script>
var a=document.getElementById("A"),
     b=document.getElementById("B"),
     c=document.getElementById("C");
a.markNeeded().then(function(){b.markNeeded()}).then({function(){c.markNeeded()});
</script>

That would work, as long as a dependency when the script we're dependent on
is defined as "whenneeded" becomes dependency on its download, rather than
its execution. Does that make sense?

[1]
http://lists.w3.org/Archives/Public/public-whatwg-archive/2013May/0112.html
Received on Wednesday, 10 July 2013 23:10:51 UTC

This archive was generated by hypermail 2.4.0 : Wednesday, 22 January 2020 17:00:03 UTC