Ответ 1
tl; dr: System.resolve
и System.register
делают большую часть того, что вы хотите. Остальная часть этого ответа заключается в том, почему require.ensure
не может и как System.import
вызывает остальные.
Я думаю, что модули ES6 не позволяют этому работать хорошо, хотя после него с помощью спецификаций релевантов сложно, поэтому я могу быть абсолютно неправым.
Тем не менее, давайте начнем с нескольких ссылок:
- загрузчик модуля WhatWG
- спецификация ES6 для модулей (§15.2)
- Спецификация модуля CommonJS
- фантастическая статья 2-го уровня по модулям ES6
Первая ссылка объясняет больше поведения, хотя я не совсем уверен, как это нормализуется. Последнее объясняет детали реализации на стороне JS. Поскольку никакие платформы не реализуют это, у меня нет ссылок на то, как он действительно работает в реальной жизни, и нам придется полагаться на спецификацию.
require
, который был доступен в webpack 1.x - это mashup для CommonJS и AMD. Сторона CommonJS описана в ссылке # 3, в частности в разделе "Контекст модуля". Нигде не упоминается require.ensure
, а также спецификация AMD (такая как она есть), поэтому это просто изобретение webpack. То есть, эта функция никогда не была реальной, в смысле того, чтобы быть где-то официальным и причудливым.
Тем не менее, я думаю, что require.ensure
конфликтует с модулями ES6. Вызов System.import
должен вызывать метод import
из Loader
объект. В соответствующем разделе в ссылке # 2 это явно не указано, но §10.1 упоминает о подключении загрузчика к System
.
Loader.prototype.import
метод не очень привлекателен, а шаг 4 - единственный, который нас интересует:
- Возвращает результат преобразования Resolve (loader, name, referrer) с обработчиком выполнения, который при вызове с ключом аргумента выполняет следующие шаги:
- Пусть запись будет выполнена с подтверждением (загрузчик, ключ).
- Возвращает результат преобразования LoadModule (запись, "экземпляр" ) с обработчиком выполнения, который при вызове выполняет следующие шаги:
- Return EnsureEvaluated (запись).
Поток определяется разрешением-регистром-нагрузкой, и вы хотите разбить нагрузку и оценить. Обратите внимание, однако, что этап загрузки вызывает LoadModule
с stage
, установленным на "instantiate"
. Это подразумевает и, вероятно, требует, чтобы модуль уже был переведен через RequestTranslate
, который делает большую часть сильного разбора, когда он пытается найти модуль точка входа и т.д.
Это уже сделало больше работы, чем вы хотите, из ее звуков. Поскольку для основ загрузки модуля требуется известная точка входа, я не думаю, что существует способ избежать синтаксического анализа и частичной оценки модуля с помощью вызовов, открытых из System
. Вы уже это знали.
Проблема в том, что System.import
не может знать - до тех пор, пока не будет проведен синтаксический анализ - должен ли модуль быть модулем ES6, который должен быть оценен, или пакет веб-пакетов, который можно отложить. Разбор должен быть выполнен, чтобы выяснить, нужно ли нам разбираться, что приводит к проблеме курица и яйца.
До этого момента мы проходили путь от System.import
через Loader
. Вызов import
диктует, на какой стадии импорта мы находимся, предполагая, что вы хотите пройти полный сквозной процесс загрузки. Основные вызовы, такие как Loader.prototype.load
, обеспечивают мелкозернистый контроль над этими этапами.
Я не уверен, как вы будете вызывать первые два этапа (выборка и перевод), но если вы смогли перевести и зарегистрировать модуль, последующие вызовы должны просто оценить и вернуть его.
Если спецификация является точной, это должно быть показано (в поддерживающих реализациях) с помощью свойства System.loader
и будет иметь методы, необходимые для вызова. Есть большие части потока, к которому у вас нет доступа, поэтому я предлагаю не делать этого и вместо этого настраивать свой код, так что ничего значительного не запускается при загрузке модуля. Если это невозможно, вам нужно воссоздать поток вверх, зарегистрировавшись, но не стесняйтесь оценки.