Почему SystemJS предполагает, что мое приложение находится в /.../app/main.js, когда я объявил ./main.js? - PullRequest
0 голосов
/ 03 января 2019

Получаю свой собственный вариант того, что, по-видимому, является довольно распространенной проблемой: main.js равен 404. Вот упрощенная структура каталогов:

 ?scripts
  ?chat
   ?system.config.json
   ?main.js

Вот базовый HTML-код, который должен загружать приложение:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
        <base href="/o02iJXqoaG/chat/">

    <script type="systemjs-packagemap" src="/scripts/chat/system.config.json">
    </script>

    <script>
        System.import('app').catch(function(err) { console.error(err); });
    </script>
</head>
<body>
    <chat-app></chat-app>
</body>
</html>

Независимо от того, где в файловой системе находится html, похоже, что SystemJS предполагает, что базовый URL-адрес находится там, где находится файл конфигурации / откуда его загружает тег script.Поэтому я поместил файл конфигурации вместе с js-файлами приложения.Этот код из SystemJS.js:

  let baseUrl;
  if (typeof location !== 'undefined') {
    baseUrl = location.href.split('#')[0].split('?')[0];
    const lastSepIndex = baseUrl.lastIndexOf('/');
    if (lastSepIndex !== -1)
      baseUrl = baseUrl.slice(0, lastSepIndex + 1);
  }

Помещение конфигурации в /scripts/chat/ означает, что это правильно создает базовый URL-адрес http://host.com/scripts/chat/ после отключения system.config.json

My system.config.json файл выглядит следующим образом (кажется, что вызов System.config() и передача json таким образом больше не способ конфигурации - теперь это просто блок json, загруженный специально сформированным тегом сценария; я использую SystemJS 2.1.1)

{
    "paths": {
        "npm": "/node_modules/"
    },
    "map": {
        "app": "/Scripts/Chat",
        "shared": "/Scripts/shared",
        "@angular/core": "npm:@angular/core/bundles/core.umd.js",
        "@angular/common": "npm:@angular/common/bundles/common.umd.js",
        "@angular/compiler": "npm:@angular/compiler/bundles/compiler.umd.js",
        "@angular/platform-browser": "npm:@angular/platform-browser/bundles/platform-browser.umd.js",
        "@angular/platform-browser-dynamic": "npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js",
        "@angular/http": "npm:@angular/http/bundles/http.umd.js",
        "@angular/router": "npm:@angular/router/bundles/router.umd.js",
        "@angular/forms": "npm:@angular/forms/bundles/forms.umd.js",
        "rxjs": "npm:rxjs",
        "angular-in-memory-web-api": "npm:angular-in-memory-web-api"
    },
    "packages": {
        "app": {
            "main": "./main.js",
            "defaultExtension": "js"
        },
        "shared": {
            "defaultExtension": "js"
        },
        "rxjs": {
            "defaultExtension": "js"
        },
        "angular-in-memory-web-api": {
            "main": "./index.js",
            "defaultExtension": "js"
        }
    }
}

Я могу изменить значение map.app на любое, что мне нравится, и это, похоже, не имеет значения;systemJS, похоже, включается с базовым URL-адресом, где находится файл конфигурации, и добавляет пути к пакетам к базовому URL-адресу.

Я не упоминаю папку в packages.app.main (ну, кроме текущей директории), но когда браузер пытается загрузить main.js, он делает это из URL http://host.com/scripts/chat/app/main.js - откудапостороннее "приложение" взято?Это имя пакета?

Если я укажу:

"packages": {
    "app": {
        "main": "../main.js"

Затем он загружается из правильного места (без папки приложения), но правильно ли это делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...