Feed back and proposal for modules: allow importing ES5 files
Alex Russell
alex at dojotoolkit.org
Mon Sep 24 03:29:09 PDT 2012
Hi Shaofei:
On Sep 22, 2012, at 6:29 PM, 程劭非 <csf178 at gmail.com> wrote:
> Hi, everyone,
>
>
> I noticed that current importing grammar will not work for ES5 files,
> I mean there is no way to import one or more es5/es3 files as a module
> and import variables from it.
>
> The problem is:
> 1. There are no "export" keywords in a es5/es3 file, no variables are exported.
> 2. They might be using more than one files but current mudule grammar
> allows only one file as one module.
>
> When the new standard(es6) comes out, I guess a big number of
> libraries need updating. And before they finish their work, I think we
> need a cheap solution for the new code(es6) to use old
> libraries(es5/es3) without modifying their code
One option here is for you to create an export "wrapper" for them, in essence a separate file that requires the old library be loaded which then exports the library's symbols through an export. Not pretty, but it requires no code changes for well-designed libraries.
> For the two points, I was considering two solution:
>
> 1. Export all global variable by default.
>
> Anonymous function could be used to protect the global namespace and
> most libraries are already using it. So I don't think "export" is
> needed.
You inadvertently identified why we need "exports": it's very difficult what is "global". In particular, what should be exported in the case of a file that includes:
var f = function(param) {
thinger = param;
};
// ...
if (someGlobalConfigurationSetting) {
f("howdy!");
}
?
> Exporting all global variable will not pollute the module's user's
> namespace for we still need "import" phase.
Perhaps instead of "global" you mean "the top-level IFFE"?
In that case, it's easier, but then it depends on the IFFE both being executed (it's not a static form here) and there being only one. Or is the suggestion that a file like this should export both a and b? And what will the value of c be?
// example.js
(function(p){
var a = p;
})("hello");
(function(p){
var b = p;
})("world");
var setValue = function(p){
var c = p;
};
setValue("it's a sunny day!");
setValue("it's raining in London");
// end example.js
As you can see, at the limit, this creates some serious hazards for violating the data-hiding provided by closure-bound variables. Suddenly importers can not only see these internal names, but watch their values change!
> 2. Allow importing multiple files as one module.
>
> This will completely decouple file and module. We need to modify the
> ModuleSpecifier grammar:
>
> ModuleSpecifier ::= StringLiteral | Path
> ===>
> ModuleSpecifier ::= ( StringLiteral | Path ) ( "," StringLiteral | Path )*
>
> With this, for example, if I'm using a RSA library like
> <http://www-cs-students.stanford.edu/~tjw/jsbn/>, I can do the
> following:
>
>
> import "jsbn.js","prng4.js","rng.js","rsa.js" as RSA;
>
> If I want to use a module depend on jQuery1.3.2, I can do:
>
> import "jQuery1.3.2.js","MyModule.js" as MyModule;
>
> I've mentioned this idea in a reply, post it as a separate thread to
> get more feed back :-)
This is interesting. Do you have a proposed resolution mechanism for conflicts? We had such a thing in the old traits system for classes, but I don't think it has survived anywhere.
--
Alex Russell
slightlyoff at google.com
slightlyoff at chromium.org
alex at dojotoolkit.org BE03 E88D EABB 2116 CC49 8259 CF78 E242 59C3 9723
More information about the es-discuss
mailing list