Using yield to define modules

# Nathan Breit (12 years ago)

After seeing the task.js library it struck me that the same approach could also be used used to import modules. For example:

let JSON = yield load('http://json.org/modules/json2.js');

This provides some of the benefits of the new module syntax; there is no need to wrap everything in a function, and imported variables can be defined inline with their library path for easy copy/pasting. However, the new syntax has other benefits this approach doesn't such as readability and it might interfere with concurrent loading/pre-fetching.

# Rick Waldron (12 years ago)

The yield keyword is not allowed outside of generator functions, so that line would need to be wrapped. The load function needs to be defined and it would have to use a script element or xhr, but would ultimately the contents will be executed in the global scope (as is done today). Modules avoid all of these issues.

# Brendan Eich (12 years ago)

Nathan Breit wrote:

After seeing the task.js library it struck me that the same approach could also be used used to import modules. For example:

let JSON = yield load('http://json.org/modules/json2.js');

This provides some of the benefits of the new module syntax; there is no need to wrap everything in a function,

But yield cannot be used as you show except in function* (a generator function).

and imported variables can be defined inline with their library path for easy copy/pasting. However, the new syntax has other benefits this approach doesn't such as readability and it might interfere with concurrent loading/pre-fetching.

Right. task.js/generators and the loader API (or XHR or other such) go together; we also want the import special form. Both play their parts, one can't express one with the other or vice versa.