Рассматриваю различные варианты для будущего проекта; прошу подсказать, какие существуют на данный момент решения, подходы, технологии.
Допустим, разрабатывается приложение с большой (>> 1Мб) кодовой базой на JS. В этот код есть несколько точек входа. Это означает, что одни страницы сайта или одни веб-приложения этого проекта будут подгружать один набор модулей, другие — другой набор. При этом каждый из этих сайтов/страниц/веб-приложений может потенциально запросить любой модуль по необходимости (существенно зависит от действий пользователя).
Сделать одну сборку не получится, потому что время доступа будет необоснованно завышено. Добавим к этому, что мы предполагаем, что пользователь может не иметь высокоскоростное подключение, не посещать сайт до этого и т.п.
Как мне видится, единственное решение заключается в использовании асинхронной загрузки модулей.
С другой стороны, программисты должны иметь возможность писать свои (слабо связанные) модули, как если бы весь код был загружен на клиентскую машину или как если бы исполнение происходило на сервере.
По-другому говоря, ищется
инструмент, который бы позволил абстрагироваться от вышеописанной проблемы асинхронной загрузки минимального необходимого набора модулей.
Вопрос №1. Достаточно ли RequireJS/AMD для решения поставленной задачи.
Мои соображенияПо описанию, именно ради асинхронной загрузки модулей он и создавался.
Впрочем, require.js содержит один недостаток, который делает его в текущем виде непригодным для решения первоначальной задачи. Если по результатам обсуждения окажется, что RequireJS является тем решением, которое мне нужно, я создам отдельный вопрос про этот недостаток.
Вопрос №2. Есть ли информация о чужом опыте: кто делал аналогичное, какие были сложности, какие подходы, решения, нюансы?
Вопрос №3. Может случиться конфликт зависимостей версий одного модуля у двух разных зависимых модулей. Обычно в таких случаях конфликты разрешаются статически, при помощи системы контроля версий и менеджера пакетов, таким образом к клиенту попадает только одна версия модуля.
Разрешение конфликтов в run-time, то есть загрузка двух версий одного модуля и разделение пространства имён, является ли существенно усложняющим фактором, то есть нужен ли принципиально другой инструмент, чем тот, который решает исходно поставленную задачу?
Благодарю за внимание.