A user account is required in order to edit this wiki, but we've had to disable public user registrations due to spam.

To request an account, ask an autoconfirmed user on Chat (such as one of these permanent autoconfirmed members).

Talk:Dynamic Script Execution Order: Difference between revisions

From WHATWG Wiki
Jump to navigation Jump to search
No edit summary
Line 7: Line 7:


This would solve all of the problems except for the current inability to use loaders like LABjs in FF4 or webkit.  To solve that problem, we should consider keeping the existing functionality or triggering the deprecated functionality when needed.
This would solve all of the problems except for the current inability to use loaders like LABjs in FF4 or webkit.  To solve that problem, we should consider keeping the existing functionality or triggering the deprecated functionality when needed.
--[[User:Unscriptable|Unscriptable]] 01:29, 2 November 2010 (UTC)


=== Response ===
=== Response ===
Line 13: Line 15:


The spirit of this proposal is to add the facility to native browser (rendering engine, specifically) behavior, such that any and all existing content is able to be loaded (even with dependencies and order) without modification.
The spirit of this proposal is to add the facility to native browser (rendering engine, specifically) behavior, such that any and all existing content is able to be loaded (even with dependencies and order) without modification.
=== Dependent code should be modular ===
I completely agree, 99% of JavaScript in use today is NOT modular, but that's arguably because there was no built-in support to make it modular (IMHO, YMMV, RTFM, BBQ, ROFL).  But that doesn't mean there aren't dependencies that span script files / script nodes.  I don't know how many sites would be broken (or if there is any way to determine how many sites would be broken) if/when the latest browsers started loading and evaluating script-injected scripts out of order.  It's not just LABjs-based sites.  I'll bet many dojo and YUI sites will break, too (although I don't know this for a fact because I don't know exactly how their dynamic script loaders work). 
'''''In any case, breaking existing sites is a BAD IDEA. :)  There should be some way to allow LABjs and other dynamic script loaders to continue to work.'''''
The part I don't agree with in the proposals is that it should be the job of HTML and/or the browser engine to manage dependencies.  Specifically, I am talking about the scriptGroup element and the "waitFor" attribute.  The "async" attribute may be the right level: it appropriates only general heuristics to the browser: ''load these scripts whenever you like, but load these scripts in this order''. 
Detailed dependency management belongs in the modules, though.  This is how it's done in most environments / languages: import statements, include statements, etc.  It's no different in JavaScript, if a developer wants to take advantage of some code in another module, she/he should import it into their current module.  This should be the model moving forward.  It's not hard, it's not un-web-like, and it's already being done. 
Existing code can be made to work modularly, too:
1. Identify modules and wrap them with a define() method.
2. Identify dependencies using either the [http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition Asynchronous Module Definition] format or the CommonJS synchronous format
async format:
<pre lang="javascript">
define(['dependency1', 'dependency2'], function (dependency1, dependency2) {
/* this is the factory function, return the module inside here */
return { /* some object, but could also be a constructor or a function */ };
});
</pre>
sync format:
<pre lang="javascript">
define(function (require, exports, module) {
/* this is the factory function, require dependencies and return the module inside here */
var dependency1 = require('dependency1');
var dependency2 = require('dependency2');
return { /* some object, but could also be a constructor or a function */ };
});
</pre>
In the async case, the browser may employ whatever method it sees fit (e.g. parallel) to download the dependencies since the code inside the factory function won't execute until all of the dependencies are loaded and evaluated.  In the sync case, the browser has no choice but to download and evaluate the dependency before continuing code execution.  It's conceivable that the browser could find and asynchronously pre-fetch the inline require()'ed dependencies in the sync case.  (RequireJS doesn't quite do this.  Instead I believe it finds the inline require() calls and converts the module to an async module.) 
'''''So, in short: don't break LABjs (or any other script loaders), but don't extend the spec to manage dependency management from HTML.'''''
--[[User:Unscriptable|Unscriptable]] 01:29, 2 November 2010 (UTC)

Revision as of 01:29, 2 November 2010

Please discuss the proposal here. All informal feedback is welcomed, and when it's appropriate, please add content to the main page.


What about CommonJS / RequireJS?

I'm not sure we need to complicate the HTML or browser engines in order to satisfy the advanced use cases. To me it seems that the JavaScript langauge itself could abstract the requirements and let the browser vendors implement whatever solution they see fit. Specifically, if JavaScript provided the define() and require() calls proposed in the CommonJS "specifications" (and implemented by RequireJS, dojo (trunk), and others *Yabble?), then browsers could just load and evaluate scripts as fast as possible without regard to script execution order.

This would solve all of the problems except for the current inability to use loaders like LABjs in FF4 or webkit. To solve that problem, we should consider keeping the existing functionality or triggering the deprecated functionality when needed.

--Unscriptable 01:29, 2 November 2010 (UTC)

Response

This is a valid point except that it assumes that all code that needs to be loaded is "modular"... in fact, most code on the internet that needs to be loaded is NOT modular, and instead requires particular ordering when being loaded... for instance, "jquery" and "jquery-ui" -- jQuery must be run before jQuery-UI is loaded and run.

The spirit of this proposal is to add the facility to native browser (rendering engine, specifically) behavior, such that any and all existing content is able to be loaded (even with dependencies and order) without modification.

Dependent code should be modular

I completely agree, 99% of JavaScript in use today is NOT modular, but that's arguably because there was no built-in support to make it modular (IMHO, YMMV, RTFM, BBQ, ROFL). But that doesn't mean there aren't dependencies that span script files / script nodes. I don't know how many sites would be broken (or if there is any way to determine how many sites would be broken) if/when the latest browsers started loading and evaluating script-injected scripts out of order. It's not just LABjs-based sites. I'll bet many dojo and YUI sites will break, too (although I don't know this for a fact because I don't know exactly how their dynamic script loaders work).

In any case, breaking existing sites is a BAD IDEA. :) There should be some way to allow LABjs and other dynamic script loaders to continue to work.

The part I don't agree with in the proposals is that it should be the job of HTML and/or the browser engine to manage dependencies. Specifically, I am talking about the scriptGroup element and the "waitFor" attribute. The "async" attribute may be the right level: it appropriates only general heuristics to the browser: load these scripts whenever you like, but load these scripts in this order.

Detailed dependency management belongs in the modules, though. This is how it's done in most environments / languages: import statements, include statements, etc. It's no different in JavaScript, if a developer wants to take advantage of some code in another module, she/he should import it into their current module. This should be the model moving forward. It's not hard, it's not un-web-like, and it's already being done.

Existing code can be made to work modularly, too:

1. Identify modules and wrap them with a define() method. 2. Identify dependencies using either the Asynchronous Module Definition format or the CommonJS synchronous format

async format:

define(['dependency1', 'dependency2'], function (dependency1, dependency2) {
	/* this is the factory function, return the module inside here */
	return { /* some object, but could also be a constructor or a function */ };
});

sync format:

define(function (require, exports, module) {
	/* this is the factory function, require dependencies and return the module inside here */
	var dependency1 = require('dependency1');
	var dependency2 = require('dependency2');
	return { /* some object, but could also be a constructor or a function */ };
});

In the async case, the browser may employ whatever method it sees fit (e.g. parallel) to download the dependencies since the code inside the factory function won't execute until all of the dependencies are loaded and evaluated. In the sync case, the browser has no choice but to download and evaluate the dependency before continuing code execution. It's conceivable that the browser could find and asynchronously pre-fetch the inline require()'ed dependencies in the sync case. (RequireJS doesn't quite do this. Instead I believe it finds the inline require() calls and converts the module to an async module.)

So, in short: don't break LABjs (or any other script loaders), but don't extend the spec to manage dependency management from HTML.

--Unscriptable 01:29, 2 November 2010 (UTC)