[whatwg] Script preloading, non-script dependencies
Kornel Lesiński
kornel at geekhood.net
Sun Jul 14 07:57:25 PDT 2013
On Tue, 09 Jul 2013 20:39:45 +0100, Ian Hickson <ian at hixie.ch> wrote:
> Would something like this, based on proposals from a variety of people in
> the past, work for your needs?
>
> 1. Add a "dependencies" attribute to <script> that can point to other
> scripts to indicate that execution of this script should be delayed
> until all other scripts that are (a) earlier in the tree order and (b)
> identified by this attribute have executed.
>
> <script id="jquery" src="jquery.js" async></script>
> <script id="shims" src="shims.js" async></script>
> <script dependencies="shims jquery" src="myscript.js"
> async></script>
On a basic level it's similar to JS async module definition pattern
(https://github.com/amdjs/amdjs-api/wiki/AMD), which is good, but may be
insufficient.
require.js (AMD implementation) has useful concept of loader "plugins" for
dependencies (https://github.com/millermedeiros/requirejs-plugins).
A plugin is basically a function that is told to load a path and calls
callback when it's done.
It solves two problems:
1. not all dependencies are JS files, e.g. authors use plugins to load
template files, JSON, images, etc.
<script dependencies="load_template('view.hbs')" src="view.js">
<script>
function load_template(url, callback) {
fetch(url).then(callback); // in require.js result is
directly passed to the module.
}
</script>
2. not all dependencies are usefully satisfied immediately after their JS
file is loaded, e.g. some libraries may need asynchronous initialization.
In require.js it's possible to wrap initialization in a plugin that will
wait until it's done, so modules dependent on it can start using
initialized library right away.
<script id="load-library" src="library.js" />
<script dependencies="load-library">
function library_initialized(callback) {
$library.on('ready', callback)
}
</script>
<script dependencies="library_initialized()" src="use-it-now.js"/>
Another common kind of dependency scripts have is presence of certain
element in the DOM, e.g. `dropdown-menu.js` may require `<nav id="menu">`
to be in the document _and_ have its content fully parsed before the
script can run.
So, could <script dependencies> point to non-<script> elements?
<script dependencies="menu" src="dropdown-menu.js"/>
<nav id="menu">
<!-- script not run yet -->
<ul>...</ul>
</nav>
<!-- script run at this point -->
It would be nice if the browser also deferred rendering of the element
until scripts that depend on it are run to avoid "Flash of Unbehaviored
Content" (e.g. elements listed in dependencies have display:none until
scripts are run).
--
regards, Kornel
More information about the whatwg
mailing list