Supposing that aQuery and bQuery are implemented by independent
uncoordinated authors.
aQuery.js
module $ {
}
bQuery.js
module $ {
}
If my interpretation is correct, these cannot be combined in a single
"Application".
<script type="harmony" src="aQuery.js"></script>
<script type="harmony" src="bQuery.js"></script>
One solution to this problem is to convince A and B to coordinate,
which I've hitherto inferred was the only solution supported by Simple
Modules, in which case they share a fault with Java.
Is this a solution?
<script type="harmony">
module A_ = load("aQuery.js");
module A = A_.$;
module B_ = load("bQuery.js");
module B = B_.$;
</script>
With this example, I am inferring that
* That the web-browser's loader knows the location of the current
page, so it can resolve the MRL based on that location.
* "load" can only be used in the context of an importing module
assignment.
* conceptually, if not at run-time, "load" returns a module instance
that contains the top-level modules of the given script.
* that the top-level modules of the remote script are not registered
as top-level modules of the local application, unlike co-DOM
scripts.
* for a script to have importable bindings, these must exist in a
module block of the loaded script.
* there is no notation for destructuring a module from a loaded
sub-module
* a script is not a module, so exports cannot be used at the top
level.
If that's the case, I would like to refine this approach, such that
loaded modules can have exports at the top level. This would permit
the function export.
aQuery.js
export var $ = function () {
};
bQuery.js
export var $ = function () {
};
link.js
module A = load("aQuery.js");
module B = load("bQuery.js");
It would also be good for there to be a way to bind $ without binding
a module.
const A = load("aQuery.js").$;
const B = load("bQuery.js").$;
This obviously breaks a load call outside an import clause, which I
infer is not possible with the present proposal.
Is it possible to decouple name spaces from loaded modules?
Another point of interest is transitive loads. I do not think that
there is a provision in the specification that would permit load
directives to be resolved relative to the location or MRL of the
module from which load call is declared.
scripts/sazzle.js
module Sazzle {
}
scripts/aQuery.js
module Sazzle_ = load("sazzle.js"); // relative to
// "scripts/aQuery.js"
module Sazzle = Sazzle_.Sazzle;
module aQuery {
export $ = function () {
};
}
link.js
module aQuery_ = load("scripts/aQuery.js");
const $ = aQuery_.aQuery.$;
Kris Kowal