This document describes the Sky module system.
The Sky module system is based on the import
element. In its most basic form, you import a module as follows:
<import src="path/to/module.sky" />
As these import
elements are inserted into a document, the document‘s list of outstanding dependencies grows. When an imported module completes, it is removed from the document’s list of outstanding dependencies.
Before executing script or inserting an element that is not already registered, the parser waits until the list of outstanding dependencies is empty. After the parser has finished parsing, the document waits until its list of outstanding dependencies is empty before the module it represents is marked complete.
Within a script in a module, the module
identifier is bound to the Module
object that represents the module.
A module can export a value by assigning the exports
property of its Module
object. By default, the exports
property of a Module
is an empty Object. Properties can be added to the object, or, it can be set to an entirely different object; for example, it could be set to the module's Document itself, in case the point of the module is to expose some template
elements.
When importing a module into another, Sky looks at the properties on the imported module‘s exports
value, and for each property that is an element constructor (generated by registerElement()
), it adds an element to the importee’s element registry.
The as
attribute on the import
element binds a name to the imported module:
<import src="path/to/chocolate.sky" as="chocolate" />
The parser executes the contents of script elements inside a module as if they were executed as follow:
(new Function(name_1, ..., name_n, module, source_code)).call( value_1, ..., value_n, source_module);
Where name_1
through name_n
are the names bound to the various named imports in the script element‘s document, source_code
is the text content of the script element, source_module
is the Module
object of the script element’s module, and value_1
through value_n
are the values exported by the various named imports in the script element's document.
When an import fails to load, the as
name for the import gets bound to undefined
.