- From: Ryosuke Niwa <rniwa@apple.com>
- Date: Mon, 18 Nov 2013 20:26:40 -0800
- To: Scott Miles <sjmiles@google.com>, Jonas Sicking <jonas@sicking.cc>
- Cc: Webapps WG <public-webapps@w3.org>
- Message-id: <EBDBEC89-065B-4CB7-BE9D-CA128F7C58DD@apple.com>
We share the concern Jonas expressed here as I've repeatedly mentioned on another threads. On Nov 18, 2013, at 4:14 PM, Jonas Sicking <jonas@sicking.cc> wrote: > This has several downsides: > * Libraries can easily collide with each other by trying to insert > themselves into the global using the same property name. > * It means that the library is forced to hardcode the property name > that it's accessed through, rather allowing the page importing the > library to control this. > * It makes it harder for the library to expose multiple entry points > since it multiplies the problems above. > * It means that the library is more fragile since it doesn't know what > the global object that it runs in looks like. I.e. it can't depend on > the global object having or not having any particular properties. Or for that matter, prototypes of any builtin type such as Array. > * Internal functions that the library does not want to expose require > ugly anonymous-function tricks to create a hidden scope. IMO, this is the biggest problem. > Many platforms, including Node.js and ES6 introduces modules as a way > to address these problems. Indeed. > At the very least, I would like to see a way to write your > HTML-importable document as a module. So that it runs in a separate > global and that the caller can access exported symbols and grab the > ones that it wants. > > Though I would even be interested in having that be the default way of > accessing HTML imports. Yes! I support that. > I don't know exactly what the syntax would be. I could imagine something like > > In markup: > <link rel=import href="..." id="mylib"> > > Once imported, in script: > new $('mylib').import.MyCommentElement; > $('mylib').import.doStuff(12); > > or > > In markup: > <link rel=import href="..." id="mylib" import="MyCommentElement doStuff"> > > Once imported, in script: > new MyCommentElement; > doStuff(12); How about this? In the host document: <link ref=import href="foo.js" import="foo1 foo2"> <script> foo1.bar(); foo2(); </script> In foo.js: module foo1 { export function bar() {} } function foo2() {} On Nov 18, 2013, at 4:52 PM, Scott Miles <sjmiles@google.com> wrote: > The HTMLImports we've been working with so far is not primarily about JS, it's about HTML. > There are already various ways to modularize JS, including requirejs, other libs, and of course, ES6 modules. > Isolation of globals has definite use cases, but it also has costs, and is more intervention than is required for first-party use cases. It's been argued (convincingly, from my perspective) that isolation can be successfully implemented via a separate opt-in mechanism. I understand your perspective but has anyone outside Google shared the same opinion? If so, could you give us pointers (URL to a post, etc..)? > I suggest that keeping HTMLImports as primitive as possible is a virtue on almost all fronts. Running scripts in the host document while keeping the rest in a separate document isn't exactly simple IMO. If we kept a separate document & window object, then HTML imports behave more like an display:none iframe with automatic JS value binding. There is a huge advantage in matching iframe's behavior here. - R. Niwa
Received on Tuesday, 19 November 2013 04:27:16 UTC