SystemJs игнорирует Angular Зависимость Bundle

Я пытаюсь получить мое приложение angular в том месте, где оно готово для распространения, и мне удалось создать 2 пакета, один для моего приложения angular и один для моих зависимостей (включая angular рамки и рамки rxjs). Я использую systemjs builder, чтобы выполнить объединение и использовать gulp для запуска компоновщика. Оба пакета создаются, и мой собственный пакет (который содержит мой код) загружается передним концом, но пакет поставщиков/зависимостей игнорируется, а зависимости все еще загружаются из папки node_modules.

Я думаю, что это проблема с моим файлом dist-system-config.js, который я использую в конечном дистрибутиве.

Мое решение основано главным образом на этом предыдущем ответе с несколькими исключениями, например, не включая/вложение моих html-шаблонов и добавление node_modules в путь исключения из зависимостей.

Я включу все, что, как я считаю, имеет отношение к проблеме, если потребуется больше, пожалуйста, дайте мне знать.

Чтобы повторить, приложение загружается и работает нормально, но вместо загрузки зависимостей из dependencies.bundle.js они загружаются из исходного местоположения (ов) в папке node_modules. app.bundle.js загружается без каких-либо проблем.


Index.html

<script src="/node_modules/core-js/client/shim.min.js"></script>
<script src="/node_modules/zone.js/dist/zone.min.js"></script>
<script src="/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/node_modules/systemjs/dist/system.js"></script>

<script src="/bundles/dependencies.bundle.js"></script>
<script src="/bundles/app.bundle.js"></script>
<script src="/Scripts/dist-system-config.js"></script>

<script>
    System.import('app/boot').catch(function(err) {
        console.error(err);
    });
</script>

приложение /boot.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { AppModule } from './app.module';

enableProdMode();
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);

Сценарии/расстояние-система-config.js

System.config({
    baseURL: '/',
    paths: {
        'npm:': 'node_modules/'
    },
    map: {
        'app': 'dist/app',

        // angular bundles
        '@angular/core': 'npm:@angular/core/bundles/core.umd.min.js',
        '@angular/common': 'npm:@angular/common/bundles/common.umd.min.js',
        '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.min.js',
        '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.min.js',
        '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.min.js',
        '@angular/http': 'npm:@angular/http/bundles/http.umd.min.js',
        '@angular/router': 'npm:@angular/router/bundles/router.umd.min.js',
        '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.min.js',
        'rxjs': 'npm:rxjs'
    },
    packages: {
        'app': { main: './boot.js', defaultExtension: 'js' },
        'rxjs': { defaultExtension: 'js' }
    }
});

gulpfile.js

var gulp = require('gulp'),
    tsc = require('gulp-typescript'),
    Builder = require('systemjs-builder');

gulp.task('bundle', ['bundle-app', 'bundle-dependencies'], function(){});

gulp.task('app-components', function () {
    return gulp.src('Scripts/app/**/*.ts')
        .pipe(tsc({
            "target": 'es5',
            "module": 'commonjs',
            "moduleResolution": 'node',
            "lib": [ 'es2015', 'dom', 'es2015.iterable' ],
            "sourceMap": true,
            "emitDecoratorMetadata": true,
            "experimentalDecorators": true,
            "removeComments": true,
            "noImplicitAny": false
        }))
        .pipe(gulp.dest('dist/app'));
});

gulp.task('bundle-app', ['app-components'], function() {
    // optional constructor options
    // sets the baseURL and loads the configuration file
    var builder = new Builder('', 'Scripts/dist-system-config.js');

    return builder
        .bundle('dist/app/**/* - [node_modules/@angular/**/*.js] - [node_modules/rxjs/**/*.js]', 'bundles/app.bundle.js', { minify: true})
        .then(function() {
            console.log('Build complete');
        })
        .catch(function(err) {
            console.log('Build error');
            console.log(err);
        });
});

gulp.task('bundle-dependencies', ['app-components'], function() {
    // optional constructor options
    // sets the baseURL and loads the configuration file
    var builder = new Builder('', 'Scripts/dist-system-config.js');

    return builder
        .bundle('dist/app/**/*.js - [dist/app/**/*.js]', 'bundles/dependencies.bundle.js', { minify: true})
        .then(function() {
            console.log('Build complete');
        })
        .catch(function(err) {
            console.log('Build error');
            console.log(err);
        });
});

package.json (только для релевантных версий)

"@angular/***": "4.2.6",
"canonical-path": "0.0.2",
"gulp": "3.9.1",
"gulp-typescript": "^3.2.0",
"rimraf": "2.6.1",
"rxjs": "5.4.2",
"systemjs": "0.20.14",
"systemjs-builder": "0.16.9",
"typescript": "2.4.1",

Ответ 1

Настройте SystemJS перед загрузкой любого пакета.

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

<script src="/Scripts/dist-system-config.js"></script>
<script src="/bundles/dependencies.bundle.js"></script>
<script src="/bundles/app.bundle.js"></script>

Здесь комментарий от автора SystemJS (Гай Бедфорд), объясняющего, почему:

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