Modules: allowed combinations of module, export
# David Herman (14 years ago)
All exports of all declared/required modules are computed before execution starts. So it doesn't matter what order things run in, you won't get any "no such export" errors if you import a valid export.
All exports of all declared/required modules are computed before execution starts. So it doesn't matter what order things run in, you won't get any "no such export" errors if you import a valid export. Dave On May 19, 2011, at 2:13 PM, James Burke wrote: > Looking at harmony modules[1], I wanted to get some clarification on > the order of export, module and such in a module's body. > > Looking at the Syntax section, this section: > > ModuleElement(load) ::= Statement > | VariableDeclaration > | FunctionDeclaration > | ModuleDeclaration(load) > | ImportDeclaration(load) > | ExportDeclaration(load) > > implies to me that the following is allowed: > > //baz.js > module foo = require('foo.js'); > > //foo.js: > export var name = 'foo'; > module bar = require('bar.js'); > var barName = bar.name; > > //bar.js: > export var name = 'bar'; > module foo = require('foo.js'); > //This works because foo.js did the export before the require? > var fooName = foo.name; > > where as this would result in an error? (foo.js puts export below the > require() line): > > //baz.js > module foo = require('foo.js'); > > //foo.js: > module bar = require('bar.js'); > export var name = 'foo'; > var barName = bar.name; > > //bar.js: > export var name = 'bar'; > module foo = require('foo.js'); > var fooName = foo.name; > > because I read the syntax section above as saying > "ModuleDeclaration(load) or ImportDelcaration(load) or > ExportDelcaration(load)", in other words any of those things can > occur, and they can occur in any order. Additionally, modules are > executed when the require() is reached. > > However, the following would *not* work, since ModuleDeclaration(load) > can only show up as a direct child of a ProgramElement(load), > ExportDeclaration(load) or ModuleElement(load), and those items can > only have ProgramElement(load) or Program(load) as parents. so a > "module bar" statement could not appear as part of an if/else: > > //foo.js > //This should error out as a syntax/compilation error > //(assume someCondition is valid here) > if (someCondition) { > module bar = require('bar.js'); > } else { > module bar2 = require('bar2.js'); > } > > James > > [1] http://wiki.ecmascript.org/doku.php?id=harmony:modules > _______________________________________________ > es-discuss mailing list > es-discuss at mozilla.org > https://mail.mozilla.org/listinfo/es-discuss
Looking at harmony modules[1], I wanted to get some clarification on the order of export, module and such in a module's body.
Looking at the Syntax section, this section:
ModuleElement(load) ::= Statement | VariableDeclaration | FunctionDeclaration | ModuleDeclaration(load) | ImportDeclaration(load) | ExportDeclaration(load)
implies to me that the following is allowed:
//baz.js module foo = require('foo.js');
//foo.js: export var name = 'foo'; module bar = require('bar.js'); var barName = bar.name;
//bar.js: export var name = 'bar'; module foo = require('foo.js'); //This works because foo.js did the export before the require? var fooName = foo.name;
where as this would result in an error? (foo.js puts export below the require() line):
//baz.js module foo = require('foo.js');
//foo.js: module bar = require('bar.js'); export var name = 'foo'; var barName = bar.name;
//bar.js: export var name = 'bar'; module foo = require('foo.js'); var fooName = foo.name;
because I read the syntax section above as saying "ModuleDeclaration(load) or ImportDelcaration(load) or ExportDelcaration(load)", in other words any of those things can occur, and they can occur in any order. Additionally, modules are executed when the require() is reached.
However, the following would not work, since ModuleDeclaration(load) can only show up as a direct child of a ProgramElement(load), ExportDeclaration(load) or ModuleElement(load), and those items can only have ProgramElement(load) or Program(load) as parents. so a "module bar" statement could not appear as part of an if/else:
//foo.js //This should error out as a syntax/compilation error //(assume someCondition is valid here) if (someCondition) { module bar = require('bar.js'); } else { module bar2 = require('bar2.js'); }
James
[1] harmony:modules