Angular 9 Project не работает в производственной среде

Я перенес наш гибридный проект Angular с 8 на 9. Миграция прошла гладко, и ng build / ng serve работает так же, как и раньше.

Настоящая проблема, когда я не знаю, как начать работать над ней, возникает после того, как я создаю приложение для производства (ng build --prod). Целевая страница проекта полностью пуста, без ошибок JS, без предупреждений консоли. Похоже, AppModule не загружается? Единственное изменение, которое нам пришлось сделать, было связано с файлом main.aot.ts, мы удалили этот файл, поскольку он больше не применим к компилятору IVY.

Любой соответствующий опыт, который у вас может быть в прошлом, поможет мне, большое спасибо!

main.ts выглядит так

import {enableProdMode, StaticProvider} from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import {downgradeModule} from "@angular/upgrade/static";

if (environment.production) {
  enableProdMode();
}
declare var angular: any;

const bootstrapFn = (extraProviders: StaticProvider[]) => {
  const platformRef = platformBrowserDynamic(extraProviders);
  return platformRef.bootstrapModule(AppModule);
};
const downgradedModule = downgradeModule(bootstrapFn);
angular.bootstrap(document.getElementById('app-root'), ['angularJSModule', downgradedModule], { strictDi: true });

main.aot.ts (удалено на Angular9)

import {enableProdMode, StaticProvider} from '@angular/core';
import { platformBrowser } from '@angular/platform-browser';
import {AppModuleNgFactory} from './app/app.module.ngfactory';
import { environment } from './environments/environment';
import {downgradeModule} from "@angular/upgrade/static";

if (environment.production) {
  enableProdMode();
}
declare var angular: any;

const bootstrapFn = (extraProviders: StaticProvider[]) => {
  const platformRef = platformBrowser(extraProviders);
  return platformRef.bootstrapModuleFactory(AppModuleNgFactory);
};
const downgradedModule = downgradeModule(bootstrapFn);
angular.bootstrap(document.getElementById('app-root'), ['angularJSModule', downgradedModule], { strictDi: true });

tsconfig.json

{
  "compileOnSave": true,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "module": "esnext",
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ],
    "types": ["angular"]
  },
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  }
}

tsconfig.app.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": ["angular"]
  },
  "files": [
    "src/main.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ],
  "exclude": [
    "src/test.ts",
    "src/**/*.spec.ts"
  ]
}

package.json

{
  "name": "myproj",
  "version": "4.5.0",
  "start": "ng serve -aot",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~9.0.5",
    "@angular/cdk": "~9.1.1",
    "@angular/common": "~9.0.5",
    "@angular/compiler": "~9.0.5",
    "@angular/core": "~9.0.5",
    "@angular/fire": "^5.4.2",
    "@angular/forms": "~9.0.5",
    "@angular/material": "^9.1.1",
    "@angular/platform-browser": "~9.0.5",
    "@angular/platform-browser-dynamic": "~9.0.5",
    "@angular/router": "~9.0.5",
    "@angular/upgrade": "^9.0.5",
    "@ng-idle/core": "^8.0.0-beta.4",
    "@ng-idle/keepalive": "^8.0.0-beta.4",
    "@uirouter/angular": "^6.0.1",
    "@uirouter/angular-hybrid": "^10.0.1",
    "@uirouter/angularjs": "^1.0.25",
    "@uirouter/core": "^6.0.4",
    "@uirouter/rx": "^0.6.5",
    "angular": "^1.7.9",
    "foundation-sites": "^6.6.1",
    "install": "^0.13.0",
    "ng-block-ui": "^2.1.8",
    "ngx-cookie-service": "^2.4.0",
    "ngx-foundation": "^1.0.8",
    "ngx-pendo": "^1.2.3",
    "ngx-perfect-scrollbar": "^8.0.0",
    "npm": "^6.14.2",
    "rxjs": "~6.5.4",
    "tslib": "^1.10.0",
    "upgrade": "^1.1.0",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.900.5",
    "@angular/cli": "~9.0.5",
    "@angular/compiler-cli": "~9.0.5",
    "@angular/language-service": "~9.0.5",
    "@types/angular": "^1.6.57",
    "@types/jasmine": "~3.3.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "^12.11.1",
    "codelyzer": "^5.1.2",
    "jasmine-core": "~3.4.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.1.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.5.2",
    "protractor": "^5.4.3",
    "ts-node": "~7.0.0",
    "tslint": "~5.15.0",
    "typescript": "~3.7.5"
  }
}

person Boutsakis Vagelis    schedule 10.03.2020    source источник
comment
У вас есть tsconfig.app.json файл, содержащий такую ​​запись: "files": ["main.ts","polyfills.ts"]?   -  person user2846469    schedule 10.03.2020
comment
Да, есть tsconfig.app.json, я также обновил вопрос выше, добавив его содержимое.   -  person Boutsakis Vagelis    schedule 10.03.2020
comment
Вы используете IE для просмотра? В любом браузере работает?   -  person Lee Willis    schedule 10.03.2020
comment
Я пробовал как Chrome, так и FF, и ничего не вышло. Когда я изучил дерево DOM внутри ‹body›, оказалось, что компоненты вообще не генерируют ожидаемый HTML.   -  person Boutsakis Vagelis    schedule 10.03.2020
comment
он работает, если вы построите его без aot ng build prod --no-aot?   -  person pero_hero    schedule 10.03.2020
comment
Вы можете временно отказаться от Ivy, чтобы узнать, имеет ли это значение: angular .io / guide / ivy # opting-of-angular-ivy.   -  person user2846469    schedule 10.03.2020
comment
Та же проблема ng build --prod --base-href. производственная сборка правильно отображает пользовательский интерфейс на локальном хосте, но при перемещении на производственный сервер .. пользовательский интерфейс не отображается   -  person Ritin    schedule 26.05.2020
comment
Я использую Docker для экспресс-приложения и jwilder / nginx-proxy. Иногда это срабатывает .. так что ни одна гарантия Angular не будет рендерить   -  person Ritin    schedule 27.05.2020
comment
Я также сталкиваюсь с той же проблемой .. в чем заключаются ... пожалуйста, обновите, какое-либо решение по этой проблеме?   -  person r08    schedule 14.06.2020


Ответы (3)


У меня была такая же проблема, в моем случае она возникла после включения строгого режима. Исправил убрав "sideEffects": false из package.json

person Manuel Strasser    schedule 24.07.2020
comment
бесконечно благодарен! были ли какие-то отрицательные побочные эффекты (простите за каламбур) от этого? - person super IT guy; 20.10.2020
comment
Спасибо, вы сэкономили мне время на расследование :) - person Georgi; 13.11.2020

У меня тоже была такая же проблема.

Сначала я попытался отключить Ivy в tsconfig.app.json, и он отлично работает. Из чего следует, что проблема связана с Айви. Спасибо @ user2846469

"angularCompilerOptions": {
   "enableIvy": false
}

Проблема Github Четко описывает проблему и решения в последующих комментариях

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

import './downgrade.component';

Либо импортируйте свой компонент, как указано выше, либо рассмотрите возможность регистрации компонентов с пониженной версией в том же файле, что и NgModule.

person Viral Rathod    schedule 17.06.2020
comment
Большой! Спасибо, это решает мою проблему. Это должно быть отмечено как ответ. - person Nguyen Tran; 13.08.2020

У меня была аналогичная проблема, но с негибридным приложением - совершенно новым приложением, созданным с нуля на Angular 10, поэтому я документирую его здесь на случай, если другие разработчики столкнутся с аналогичной проблемой.

Как указывает @ viral-rathod, отключение Ivy также помогло решить мою проблему:

В tsconfig.base.json добавить в angularCompilerOptions настройку "enableIvy": false

Таким образом, проблема выглядит аналогичной: при включенном Ivy некоторые компоненты вытряхиваются из дерева в производственных сборках (но не при запуске разработки), и в результате компонент полностью не может отображаться без сообщений и без ошибок или сгенерированного представления. .

В моем случае проблема заключалась в том, что в файле компонента A было несколько крошечных вспомогательных компонентов (не более 20 строк кода каждый, включая шаблон и стиль), которые использовались для визуализации шаблона компонента A, и это работало нормально. Когда компонент B пытается использовать те же вспомогательные компоненты в своем шаблоне (просто используя их в шаблоне и нигде не упоминаемые) - хотя он хорошо работает в разработке, он терпит неудачу в производстве: компонент B полностью не может что-либо визуализировать.

Импорт вспомогательных компонентов непосредственно в файл B - в качестве обходного пути, предложенного ответом Viral - ничего не сделал.

Решением для меня было переместить вспомогательные компоненты в их собственные файлы и зарегистрировать их в NgModule после импорта из их собственного файла. Никаких изменений не требуется ни в компонентах A, ни в B (кроме удаления повторяющихся строк из файла A).

person Guss    schedule 05.09.2020