Ну наверное оригинальный модуль ymaps может сразу api без промиса вернуть, а промис отдельно экспортировать — разве класс будет как-то зависеть от инициализации? Даже если и будет, то лучше это все внести в методы класса и сделать их возвращающими промис:
ОК, я пропустил что ymaps ещё требуется инициализация (ждет DOM или ещё что-то там?). Тогда конечно чистым AMD не получится.
Но на мой взгляд все равно не имеет смысла делать такую функциональность частью системы модулей. Остаются следующие вопросы — как будет обработана ошибка если ymaps.ready не может быть выполнена? Если делать это с помощью промисов/коллбэков, то код, который должен работать с ymaps может эту ситуацию поправить нужным для себя образом (покажет красивое сообщение об ошибке, например).
Я не говорю, что ваш подход не работает, просто тут на хабре что ни неделя, то появляется статья про новую систему модулей в JS, которая 1) не совместима с существующим кодом (AMD, CommonJS) 2) выглядит так, как будто автор не делал анализ существующих решений.
P.S. Это ещё вроде разработка из Яндекса? Тогда мне это вообще странно.
Как это помогает, в плане асинхронности, наследованию моего модуля от класса, предоставляемого из апи? Приведите пример описания модуля ComplexLayer для AMD из статьи.
Вы указываете в конфигурации AMD-загрузчика, что модуль ymaps находится под таким URL (map.yandex.ru/api/...) потом ComplexLayer просто его указывает в зависимостях и использует (прям как у вас в коде).
Можете привести пример кода для AMD, иллюстрирующего модуль, которые экспортирует класс, который наследуется от класса из API Яндекс.Карт? Тот же пример, который в статье разобран.
По URL config.hosts.ymaps + '/2.1.4/?lang=ru-RU&load=package.full&coordorder=longlat&format=AMD' отдается AMD модуль.
А что в YM этому сейчас препятствует? В этом плане он ничем не отличается ни от CommonJs, ни от AMD.
Мне кажется это смешивание системы модулей и загрузчика модулей в одно целое. Более того, не самое удачное.
Самое удачное — это ES6 modules, где можно просто использовать асинхронную стратегию загрузки для каких-то модулей и не мучаться. Понятно, что с ES6 сейчас так не получится работать — нет поддержки в рантайме. Но никто не мешает сделать тоже самое с AMD — необходимо просто «асинхронную» часть модуля вынести в отдельный модуль, который не будет забандлен (в production) со всем остальным кодом, а будет подгружаться асинхронно (генерироваться бэкендом). Непонятно, что мы получаем реализую «загрузку» модуля (provide) внутри самого модуля, а не системой модулей.
Далее, у меня мнение, что система модулей должна быть статически анализируема — это значит, что без запуска кода должно быть понятно что модуль экспортирует и когда. Это очень удобно когда читаешь код и, я думаю, позволит избежать некоторых возможных багов.
короткий синтаксис — посмотрите на последний скриншот в посте — от такого короткого синтаксиса слёзы наворачиваются
В статье вообще какое-то форматирование кода странное — то запятая в начале строки, то => переносится на другую строку. Интересно, это внутри компании такой styleguide.
вы не скачиваете билд библиотеки, вы устанавливаете пакет из npm/bower/github/....
в пакете — оригинальные исходники ввиде отдельных модулей
вы собираете свое приложение, которое использует библиотеки (сборщик узнает об этом анализирую require() вызовы)
на выходе имеет билд своего приложение + source map (внутри сам source map + оригинальные исходники, можно настроить это отдельно, чтобы исходники подгружались по необходимости)
> Смысл не в байтах, а в читаемости финального кода и максимальной приближенности к оригиналу.
С source maps (которые кстати генерирует browserify) вы это все получаете в полном объеме — при ошибке будут видны строки оригинального файла и при клике в devtools вам покажутся оригинальные исходники.
Видимо вы не пробовали пользоваться browserify/webmake/…
C browserify мне надо сделать это в одном месте и место это — код, где будут эти модули использоваться. Зачем делать какие-то make module1 module2 ... при этом мне непонятно.
jQuery кстати есть на npm, жаль что там не модуляризованный билд… Но вот например lodash — var assign = require('lodash/compat/objects/assign') если нужна всего одна функция.
!!
, например, если увидят, что значение не возвращается, а значит и не используется.github.com/prometheusresearch/react-forms
Мне кажется, что такие моменты с асинхронностью должны быть явными.
Но на мой взгляд все равно не имеет смысла делать такую функциональность частью системы модулей. Остаются следующие вопросы — как будет обработана ошибка если ymaps.ready не может быть выполнена? Если делать это с помощью промисов/коллбэков, то код, который должен работать с ymaps может эту ситуацию поправить нужным для себя образом (покажет красивое сообщение об ошибке, например).
ymaps:
ComplexLayer:
P.S. Это ещё вроде разработка из Яндекса? Тогда мне это вообще странно.
Вы указываете в конфигурации AMD-загрузчика, что модуль ymaps находится под таким URL (map.yandex.ru/api/...) потом ComplexLayer просто его указывает в зависимостях и использует (прям как у вас в коде).
По URL
config.hosts.ymaps + '/2.1.4/?lang=ru-RU&load=package.full&coordorder=longlat&
format=AMD
'
отдается AMD модуль.Нельзя ответить на вопрос «когда?».
Мне кажется это смешивание системы модулей и загрузчика модулей в одно целое. Более того, не самое удачное.
Самое удачное — это ES6 modules, где можно просто использовать асинхронную стратегию загрузки для каких-то модулей и не мучаться. Понятно, что с ES6 сейчас так не получится работать — нет поддержки в рантайме. Но никто не мешает сделать тоже самое с AMD — необходимо просто «асинхронную» часть модуля вынести в отдельный модуль, который не будет забандлен (в production) со всем остальным кодом, а будет подгружаться асинхронно (генерироваться бэкендом). Непонятно, что мы получаем реализую «загрузку» модуля (provide) внутри самого модуля, а не системой модулей.
Далее, у меня мнение, что система модулей должна быть статически анализируема — это значит, что без запуска кода должно быть понятно что модуль экспортирует и когда. Это очень удобно когда читаешь код и, я думаю, позволит избежать некоторых возможных багов.
В статье вообще какое-то форматирование кода странное — то запятая в начале строки, то
=>
переносится на другую строку. Интересно, это внутри компании такой styleguide.require()
вызовы)С source maps (которые кстати генерирует browserify) вы это все получаете в полном объеме — при ошибке будут видны строки оригинального файла и при клике в devtools вам покажутся оригинальные исходники.
Видимо вы не пробовали пользоваться browserify/webmake/…
make module1 module2 ...
при этом мне непонятно.var assign = require('lodash/compat/objects/assign')
если нужна всего одна функция.make modulename
? Спасибо, я лучше browserify/webmake попользуюсь.