Angular как внешний пакет - PullRequest
4 голосов
/ 03 марта 2020

В настоящее время я пытаюсь сократить время сборки, выводя зависимости Angular через внешние компоненты Webpack. До сих пор я достиг этого без проблем для React и других второстепенных библиотек.

Если я просто переместил '@ angular / compiler', это также работает, однако при экстернализации '@ angular / core' и других, которые я получаю Can't resolve all parameters for ApplicationModule: (?) at at syntaxError (util.ts:100) at CompileMetadataResolver._getDependenciesMetadata (metadata_resolver.ts:957) ... ошибка при начальной загрузке приложения.

Я использую файлы из комплекта 8.2.14 UMD, которые вы можете найти на unpkg.com, и мои внешние данные:

[
    /^@example\, 
    /^rxjs$/, 
    /^rxjs\/operators$/, 
    /^@angular\/core$/, 
    /^@angular\/compiler$/, 
    /^@angular\/common$/, 
    /^@angular\/common\/http$/, 
    /^@angular\/forms$/, 
    /^@angular\/platform-browser$/, 
    /^@angular\/platform-browser-dynamic$/, 
    /^@angular\/router$/, 
    /^zone\.js$/,
    /^single-spa$/
]

Связки rx js находятся здесь https://cdn.jsdelivr.net/npm/@esm-bundle.

Вы можете увидеть ошибку в этом репо: https://github.com/OriolInvernonLlaneza/test-share-angular

Заранее спасибо!

Редактировать: Благодаря ответу Юрзуи эта ошибка была решена. Однако теперь я получаю еще одну ошибку:

Class constructor I cannot be invoked without 'new'
    at new EventEmitter (event_emitter.ts:78)
    at new NgZone (ng_zone.ts:97)
    at getNgZone (application_ref.ts:358)
    at PlatformRef.bootstrapModuleFactory (application_ref.ts:255)
    at application_ref.ts:308

1 Ответ

2 голосов
/ 05 марта 2020

Вам необходимо включить библиотеку core-js shim, чтобы код Angular мог использовать метод Reflect.getOwnMetadata для чтения метаданных из оформленных классов

index.e js

<% if (isLocal) { %>
  <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <== add this
  <script type="systemjs-importmap">
       ....

Не имеет значения, какую версию ядра - js вы будете использовать, но она должна содержать полифилл для reflect.get-own-metadata.

Например, вы также можете использовать <script src='https://unpkg.com/core-js-bundle@3.1.4/minified.js'></script>

Angular CLI добавляет этот polyfill по умолчанию в polyfills.ts для jit. Но single-spa-angular удаляет это заполнение.

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

index.e js

<script src='https://unpkg.com/core-js-bundle@3.1.4/minified.js'></script>
<script src="https://unpkg.com/zone.js"></script>

Обновление

Ошибка Class constructor I cannot be invoked without 'new' происходит из пакета rx js (@esm-bundle/rxjs@6.5.4/system/rxjs.min.js), что означает, что этот пакет не был построен правильно для использования в браузере (подробнее об этой ошибке здесь Javascript ES6 TypeError: Конструктор класса Клиент не может быть вызван без 'new' ).

Вы можете использовать пакет umd для rx js

"rxjs": "https://cdn.jsdelivr.net/npm/rxjs@6.5.4/bundles/rxjs.umd.min.js",
"rxjs/operators": "https://cdn.jsdelivr.net/npm/@esm-bundle/rxjs@6.5.4/system/rxjs-operators.min.js",

Я поделюсь всем файлом inject.ejs ниже

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Root Config</title>
  <meta name="importmap-type" content="systemjs-importmap" />
  <% if (isLocal) { %>
    <!--<script src="https://unpkg.com/core-js@2.6/client/shim.min.js"></script>-->
  <script type="systemjs-importmap">
    {
      "imports": {
        "@example/root-config": "http://localhost:9000/root-config.js",
        "@example/angular": "http://localhost:4200/main.js",

        "single-spa": "https://cdnjs.cloudflare.com/ajax/libs/single-spa/5.1.0/system/single-spa.dev.js",

        "rxjs": "https://cdn.jsdelivr.net/npm/rxjs@6.5.4/bundles/rxjs.umd.min.js",
        "rxjs/operators": "https://cdn.jsdelivr.net/npm/@esm-bundle/rxjs@6.5.4/system/rxjs-operators.min.js",

        "@angular/core": "https://unpkg.com/@angular/core@8.2.14/bundles/core.umd.js",
        "@angular/compiler": "https://unpkg.com/@angular/compiler@8.2.14/bundles/compiler.umd.js", 
        "@angular/common": "https://unpkg.com/@angular/common@8.2.14/bundles/common.umd.min.js",
        "@angular/common/http": "https://unpkg.com/@angular/common@8.2.14/bundles/common-http.umd.min.js",

        "@angular/platform-browser-dynamic": "https://unpkg.com/@angular/platform-browser-dynamic@8.2.14/bundles/platform-browser-dynamic.umd.min.js",
        "@angular/platform-browser": "https://unpkg.com/@angular/platform-browser@8.2.14/bundles/platform-browser.umd.min.js",
        "@angular/platform-browser/animations": "https://unpkg.com/@angular/platform-browser@8.2.14/bundles/platform-browser-animations.umd.min.js",

        "@angular/forms": "https://unpkg.com/@angular/forms@8.2.14/bundles/forms.umd.min.js",
        "@angular/router": "https://unpkg.com/@angular/router@8.2.14/bundles/router.umd.min.js",
        "@angular/animations": "https://unpkg.com/@angular/animations@8.2.14/bundles/animations.umd.js",
        "@angular/animations/browser": "https://unpkg.com/@angular/animations@8.2.14/bundles/animations-browser.umd.min.js",

        "tslib": "https://cdnjs.cloudflare.com/ajax/libs/tslib/1.10.0/tslib.min.js",
        "zone.js": "https://cdnjs.cloudflare.com/ajax/libs/zone.js/0.9.1/zone.min.js"
      }
    }
  </script>
  <% } %>
  <script src='https://unpkg.com/core-js-bundle@3.1.4/minified.js'></script>
  <script src="https://unpkg.com/zone.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/import-map-overrides/dist/import-map-overrides.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/systemjs/dist/system.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/systemjs/dist/extras/amd.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/systemjs/dist/extras/named-exports.min.js"></script>
</head>
<body>
  <main id="main"></main>
  <script>
    System.import("@example/root-config");
  </script>
  <import-map-overrides-full show-when-local-storage="devtools" dev-libs></import-map-overrides-full>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...