blob: fcd28790adb8f123436efa3d5a07d99dcd8bc743 [file] [log] [blame] [view]
Sky Module System
=================
This document describes the Sky module system.
Overview
--------
The Sky module system is based on the ``import`` element. In its
most basic form, you import a module as follows:
```html
<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.
Module API
----------
Within a script in a module, the ``module`` identifier is bound to
the [``Module`` object](apis.md) that represents the module.
### Exporting values ###
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.
### Exporting element definitions ###
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.
Naming modules
--------------
The ``as`` attribute on the ``import`` element binds a name to the
imported module:
```html
<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:
```javascript
(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``.