Как импортировать ES6 (SystemJS) после некоторого кода?

Я хочу import angular, создать экземпляр модуля AngularJS, а затем импортировать другой файл, который требует, чтобы экземпляр Angular уже был создан:

import angular from 'angular';

var app = angular.module('app', []);

import 'src/app.js';

angular.element(window).ready(function(){
  angular.bootstrap(document, ['app']);
});

Но Babel компилирует его в это (TLDR: поднять весь импорт наверх)

System.register([], function (_export2) {
return {
    setters: [],
    execute: function () {
      System.register(['angular', 'src/app.js'], function (_export) {
        var angular, app;
        return {
          setters: [function (_angular) {
            angular = _angular.default;
          }, function (_srcAppJs) {}],
          execute: function () {
            app = angular.module('app', []);
            angular.element(window).ready(function () {
              angular.bootstrap(document, ['app']);
            });
          }
        };
      });
    }
  };
});

ОБНОВЛЕНИЕ: @just-boris

Я был хорошо осведомлен о System.import().then. Проблема в том, что app.js также imports файлы, которые создают компоненты Angular, которые требуют создания экземпляра module.
Пример импортированного файла:

angular.module('app').controller( [ function () {} ] );

System.import().then не ждет, пока дерево зависимостей будет разрешено, потому что оно не имеет смысла.

System.import('app').then(function(){
    // But wait, app.js's dependencies aren't resolved!
    // The Angular components aren't loaded yet!
    // The following will throw errors:
    angular.element(window).ready(function(){
        angular.bootstrap(document, ['app']);
    });
});

person user    schedule 24.12.2015    source источник
comment
Почему бы не включить поведение, от которого зависит app.js, в app.js? Или одна из его зависимостей?   -  person Andrew Marshall    schedule 24.12.2015
comment
Возможный дубликат Почему объявления экспорта/импорта должны быть на высшем уровне в es2015?   -  person sdgluck    schedule 24.12.2015
comment
@AndrewMarshall Я бы столкнулся с той же проблемой. Смотрите правки.   -  person user    schedule 25.12.2015


Ответы (1)


По замыслу все операторы импорта должны быть доступны для статического анализа, поэтому они должны находиться на верхнем уровне. См. этот ответ на соответствующий вопрос.

Если вы хотите загрузить модуль во время выполнения, вы не должны использовать для него import. Но вы можете сделать это с помощью System.import вместо этого

System.import('src/app.js').then(function() {
   // deal with app.js
});
person just-boris    schedule 24.12.2015
comment
Ну, как твой app.js выглядит? - person just-boris; 26.12.2015
comment
app.js просто импортирует угловые и другие угловые компоненты. - person user; 27.12.2015
comment
Если ваш app.js использует операторы import, все должно быть в порядке, SystemJS анализирует и загружает его перед самим модулем. - person just-boris; 28.12.2015