javascript - Angular v4.4 应用程序停止加载 JS 模块的隔离更新
问题描述
我收到了一个非常脆弱的 Angular 4.4 应用程序的烫手山芋。当我尝试更新 auth0-js 模块时,应用程序停止加载,并且它的引导组件构造函数永远不会被调用。它加载初始 html,运行 app.module.ts 和 main.ts。然后它似乎就停止了。我已经在 Chrome 和 FF 开发者工具中多次调试、单步执行。它似乎停止了。我已经在各种组件和模块的加载和构造函数中放置了各种 console.log 语句。它显然从不调用 app.component.ts 的构造函数。
我已经仔细地将所需模块的更改与 auth0-js 模块隔离开来。只有一个必需的模块 qs,我的代码或任何其他 js 模块也使用它。其他必需的模块仅由 auth0-js 使用。我冻结了顶级 qs 版本,并在升级时强制 npm 将其安装为 auth0-js 的依赖项。我找不到任何可能导致这种损坏的更改。
而且,就 auth0-js 库本身而言,我已经在另一个类似项目中使用了最新版本。而且,在应用程序停止之前执行的代码不包括对 auth0-js 的任何调用。换句话说,在应用程序停止运行之前不会触及该代码。
使用安装在项目本地(在 ./node_modules/ 中)的 Angular CLI 版本 1.7.4 完成构建。然后通过 构建/启动它ng serve --env local
。该服务器似乎是一个没有有用日志记录的黑匣子。我切换到通过 nginx 服务并通过ng build --output-hashing=all --env local
. 还是没有更进一步。已经好几个星期了,我的额头越来越凹了。任何和所有的建议都非常受欢迎。
这是我的 main.ts
import './polyfills.ts';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { environment } from './environments/environment';
import { AppModule } from './app/app.module';
if (environment.production) {
console.log('main.ts: enabling production mode');
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch((err) => console.error(err));
更新:我没有在 bootstrapModule 上调用 .catch,但我只是添加了它。现在我确实在控制台中看到了一条错误消息:
错误:“Zone.js 检测到 ZoneAwarePromise `(window|global).Promise` 已被覆盖。最可能的原因是在 Zone.js 之后加载了 Promise polyfill(当 zone.js 为已加载。如果必须加载一个,请在加载 zone.js 之前执行此操作。)”
现在我有一些事情要进一步研究。我将看到更新 zone.js 版本,并通过更新另一个库使其相同。
这是我的 package.json:
{
"name": "ng2-cli",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve --env local",
"build-prod": "ng build --output-hashing=all --env prod",
"build-dev": "ng build --output-hashing=all --env dev",
"build-staging": "ng build --output-hashing=all --env staging",
"build-local": "ng build --output-hashing=all --env local",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/common": "4.0.0",
"@angular/compiler": "4.0.0",
"@angular/core": "4.0.0",
"@angular/forms": "4.0.0",
"@angular/http": "4.0.0",
"@angular/platform-browser": "4.0.0",
"@angular/platform-browser-dynamic": "4.0.0",
"@angular/router": "4.0.0",
"angular2-cookie": "1.2.6",
"angular2-modal": "2.0.3",
"angular2-uuid": "1.1.1",
"auth0-js": "^9.13.2",
"bootstrap": "3.3.7",
"core-js": "2.4.1",
"moment-timezone": "^0.5.25",
"ng2-adal": "^1.0.3",
"ng2-bootstrap": "^1.6.3",
"ng2-dnd": "4.0.2",
"ng2-file-upload": "1.2.1",
"ng2-webstorage": "1.6.2",
"node-sass": "^4.11.0",
"powerbi-client": "^2.5.2",
"qs": "^6.5.1",
"rxjs": "5.3.0",
"shortid": "2.2.8",
"string-similarity": "^3.0.0",
"ts-md5": "1.2.0",
"zone.js": "0.8.5"
},
"devDependencies": {
"@angular/cli": "^1.7.4",
"@angular/compiler-cli": "4.0.0",
"@types/core-js": "0.9.41",
"@types/jasmine": "2.5.47",
"@types/moment-timezone": "^0.5.12",
"@types/node": "6.0.68",
"@types/shortid": "0.0.28",
"codelyzer": "2.1.1",
"jasmine-core": "^2.5.2",
"jasmine-only": "^0.1.2",
"jasmine-spec-reporter": "3.3.0",
"karma": "1.6.0",
"karma-chrome-launcher": "2.0.0",
"karma-cli": "1.0.1",
"karma-coverage-istanbul-reporter": "^1.4.2",
"karma-jasmine": "1.1.0",
"karma-jasmine-html-reporter": "0.2.2",
"karma-phantomjs-launcher": "1.0.4",
"protractor": "5.1.1",
"ts-node": "2.1.2",
"tslint": "4.5.1",
"typescript": "2.3.0"
}
}
解决方案
确保捕获来自 platformBrowserDynamic().bootstrapModule() 调用的异常对于识别错误至关重要。
platformBrowserDynamic().bootstrapModule(AppModule)
.catch((err) => console.error(err));
以及由此产生的错误信息:
错误:“Zone.js 检测到 ZoneAwarePromise
(window|global).Promise
已被覆盖。最可能的原因是在 Zone.js 之后加载了一个 Promise polyfill(加载 zone.js 时不需要Polyfilling Promise api。如果必须加载一个,请执行所以在加载 zone.js 之前。)”
指出 ZoneAwarePromise 定义不同的问题。https://github.com/angular/angular/issues/11650。
更新一些 npm 模块:
npm install --save ng2-adal@2.0.0
npm install --save zone.js@0.8
你将拥有更接近版本的 zone.js。这允许 Angular 应用程序被引导。
推荐阅读
- jquery - 在 jQuery 中的 .off() 函数之后返回到按钮的链接
- angular - 角度输入不产生结果。在父组件中
- javascript - lodash 节流 - 绑定时未调用函数
- python - 生成一个数字列表——一般来说哪个更好?
- java - 子点击侦听器在可展开列表视图中不起作用
- ruby-on-rails - 无法写入未知属性“parent_id”、has_one 和 belongs_to
- apache-kafka - 读取 ksql 中的管道分隔值
- javascript - 通过替换在另一个对象中找到的属性名称来创建新对象
- django - Django - 注释多个 Sum() 对象会给出错误的结果
- spring - 无法读取配置属性