Angular2.0 в подкаталоге SystemJS cant импорт angular компонентов

Я начинаю с Angular2.0. Я слежу за 5 Min Quickstart, и все работает нормально, хотя я использую grunt для компиляции моих Typescript и некоторых Sass и т.д.

У меня только одна проблема, которую я не могу решить самостоятельно. Я хочу переместить все общедоступные файлы (сгенерированные модули Javascript и production node) в подкаталог. Мне нужно это, потому что я запускаю разные приложения, чтобы удалить один и тот же domian. Интерфейс зависит от типа пользователя, который вошел в систему. записывается с помощью phalcon)

Это моя общая папка (корневой веб-сервер)

общая папка

Таким образом, все приложения Angular должны жить внутри каталога "талант".

"index.html" содержит следующее:

<script type="text/javascript" src="/talent/node_modules/systemjs/dist/system.src.js"></script>
<script type="text/javascript" src="/talent/node_modules/angular2/bundles/angular2.dev.js"></script>

<script>
    System.config({
        baseURL: '/talent',
        packages: {'app': {defaultExtension: 'js',}}
    });
    System.import('app/app');
</script>

SystemJs может правильно загрузить файл app.js, но затем попытается импортировать angular2:

import {bootstrap, Component} from 'angular2/angular2'; 

Соответствующий Javascript:

var angular2_1 = require('angular2/angular2');

Отправляет запрос на http://example.dev/talent/angular2/angular2, что приводит к ошибке 404.

Когда я перемещаю папку node_modules и папку приложения в корневой каталог веб-сервера и удаляю baseURL: '/talent', она работает нормально.

Вот запросы, сделанные как для рабочего решения (все в корне), так и для нерабочей части (все под/талант)

Рабочий: Рабочий пример

Не работает: не работает

Можете ли вы помочь мне заставить это работать?

Ответ 1

Если бы эта точно такая же проблема, и просто вычислил ее через несколько часов. Системная конфигурация baseURL должна быть установлена ​​до загрузки angular2.dev.js. Это связано с тем, что вызовы System.register должны быть осведомлены о baseURL во время регистрации.

например.

System.config({baseURL: '/talent'});

Более чистый способ - просто добавить System.config({baseURL: '/talent'}) в самую нижнюю часть файла system.src.js.

Ответ 2

Вы можете установить пути для каждой библиотеки:

System.paths = {
    'angular2/*': '/talent/node_modules/angular2/*',
    'app/*': '/talent/app/*'
};

Это работает для вас?

Ответ 3

'angular2/angular2' устарел. Ваш код должен ссылаться на 'angular2/core' или соответствующий модуль для вашего импорта.

Вам также не нужно указывать путь для импорта angular2 в System.config, поскольку система загрузит их из тега <script>, который у вас есть в HTML.

Скорее всего, вы получаете ошибку 404, потому что файл angular2.dev.js загружается 'angular2/core', 'angular2/common', 'angular2/platform/browser' и т.д.... и вы ссылаетесь на 'angular2/angular2', который не регистрируется, и поэтому SystemJS пытается выйти и найти его.

Измените все ваши import {...} from 'angular2/angular2' на правильный импорт модуля. Вы можете найти их на странице предварительного просмотра API angular.io, или, надеюсь, ваша IDE найдет его для вас.

Ответ 4

Я не знаю, какую версию Angular2 вы используете, но теперь с бета-версиями вы должны использовать эти модули Angular2:

import {bootstrap} from 'angular2/platform/browser';
import {Component} from 'angular2/core';

Затем вам нужно настроить SystemJS, как описано ниже:

<script>
  System.config({
    map: {
      app: 'talent/app'
    },
    packages: {        
      app: {
        format: 'register',
        defaultExtension: 'js'
      }
    }
  });
  System.import('app/boot')
        .then(null, console.error.bind(console));
</script>

В этой конфигурации при попытке загрузить модуль app/boot SystemJS загрузит файл talent/app/boot.js, который был скомпилирован ранее из файла talent/app/boot.ts. Это относится ко всем элементам модуля app, но не к другим.

Модули типа angular2/* будут найдены из файлов talent/node_modules/angular2/bundles/[something].js, которые вы использовали с тегами <script>.

Я сделал несколько тестов, и эта конфигурация работает для меня; -)

Тьерри

Ответ 5

Я наткнулся на этот вопрос, пытаясь перейти от локальной (dev) среды к размещенному серверу (CentOS), где развернутые URL-адреса были разными для моего локального хоста. Если вы находитесь в этой ситуации, и принятый ответ не решает вашу проблему (я уже импортировал обновленный импорт с помощью Angular2 Beta 15), и используя baseURL messes другие вещи (как это было в моей ситуации), используйте:

map: {
    app: 'path/to/app/folder'
},

Я видел это здесь, и это сработало для меня (хотя оно первоначально отвечало на вопрос о среде MAMP): Проблемы с импортированием классов из Angular 2 модулей с Typescript 1.7

Ответ 6

Вот что сработало для нас:

Сделайте базовую точку ref в подкаталоге, содержащем проект angular. Это обеспечит обнаружение всех зависимостей node_module и т.д. Настройте PathLocationStrategy с другим APP_BASE_HREF, чтобы режим html5 по-прежнему работал для фактического приложения angular.

bootstrap(AppComponent, [..... bind(APP_BASE_HREF).toValue("/yardmap/planning")

ref: https://angular.io/docs/ts/latest/api/common/index/APP_BASE_HREF-let.html

ref: https://angular.io/docs/ts/latest/guide/router.html

Ответ 7

base href Большинство приложений маршрутизации должны добавить элемент в index.html в качестве первого дочернего элемента в теге, чтобы сообщить маршрутизатору, как составлять URL-адреса навигации.

<!DOCTYPE html>
<html>
 
<head lang="en">
    <base href="/talent/">
    ......
</head>