web-dev-qa-db-ja.com

Angular 9プロジェクトは実稼働環境では機能していません

私は8から9までのAngularハイブリッドプロジェクトを移行しました。移行は滑らかで、NGビルド/ 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"
  }
}
_
11

私は同様の問題を抱えていましたが、ハイブリッド以外のアプリケーションを使用しました - スクラッチAngular 10構築されたアプリケーションから完全に新しいので、他の開発者が同様の問題で巻きついている場合にはここに文書化しています。

@ viral-rathodが指すように、IVYを無効にすると私の問題についても機能しました。

tsconfig.base.jsonangularCompilerOptions設定"enableIvy": false

そのため、問題は似ているようです。アイビーが有効になっている場合、一部のコンポーネントはプロダクションビルドのツリーから揺れています(ただし、DEV RUNSではなく)、その結果、コンポーネントは完全にレンダリング、静かに、または生成されたビューに完全にレンダリングに失敗します。 。

私の場合、コンポーネントAのテンプレートをレンダリングするために使用されたコンポーネントAのファイルに、いくつかの小さなヘルパーコンポーネント(テンプレートとスタイルを含むコード20行ず)があり、それが正常に機能しました。コンポーネントBがテンプレート内で同じヘルパーコンポーネントを使用しようとすると(テンプレートで使用されているだけで、他の場所には言及されていません) - 開発中にうまく機能しますが、プロダクションでは失敗します。コンポーネントBは完全に何もレンダリングできません。

Viralの答えによって示唆された回避策として、ヘルパーコンポーネントを直接インポートする - 何もしませんでした。

私のための解決策は、ヘルパーコンポーネントを自分のファイルに移動し、それらを自分のファイルからインポートした後にNgModuleに登録することでした。コンポーネントAまたはBに変更は不要です(Aのファイルから重複した行を削除する以外)。

1
Guss