Permalink
b1d0d69 Mar 22, 2017
@miripiruni @ikokostya @dfilatov @zxqfox
109 lines (90 sloc) 3.19 KB

Модульная система YModules NPM version Build Status

Что это? Зачем и для кого? Как пользоваться?

Требования

  1. Асинхронный require модулей
  2. Асинхронный provide модулей
  3. Возможность передекларации/додекларации модуля

Почему не CommonJS?

Смотри пункты 1, 2 и 3 требований

Почему не AMD?

Смотри пункты 2 и 3 требований

Спецификация API

Объявление модуля

void modules.define(
    String moduleName,
    [String[] dependencies],
    Function(
        Function([Object objectToProvide], [Error error]) provide,
        [Object resolvedDependency, ...],
        [Object previousDeclaration]
    ) declarationFunction
)

Подключение модуля

void modules.require(
    String[] dependencies,
    Function([Object resolvedDependency, ...]) successCallbackFunction,
    [Function(Error error) errorCallbackFunction]
)

Создание нового хранилища модулей

Modules modules.create()

Настройка хранилища модулей

void setOptions(Object options)
Доступные опции
  • trackCircularDependencies - при false не проверяет зацикленные зависимости. По умолчанию true
  • allowMultipleDeclarations - при false запрещает расширение (переопределение) модулей и генерирует ошибку. По умолчанию true

Получение текущего состояния модуля в хранилище

String getState(String name)
Возможные состояния
  • NOT_DEFINED - не было объявления модуля
  • NOT_RESOLVED - модуль был объявлен, но разрешение зависимостей еще не начато
  • IN_RESOLVING - в процессе разрешения зависимостей модуля
  • RESOLVED - зависимости разрешены

Проверка наличия объявления модуля в хранилище

Boolean isDefined(String moduleName)

Пример

modules.define(
    'A',
    ['B', 'C'],
    function(provide, b, c, prev) {
        var a = {};
        provide(a);
    });

modules.define(
    'B',
    function(provide) {
        var b = {};
        provide(b);
    });

modules.define(
    'C',
    ['B'],
    function(provide, b) {
        var c = {};
        provide(c);
    });

modules.define(
    'C',
    function(provide, prevC) {
        var nextC = {};
        provide(nextC);
    });

modules.require(
  ['A'],
  function(a) {
    // module 'A' now resolved to a
  });