Angular AOT Build:内部错误:未知标识符未定义
Posted
技术标签:
【中文标题】Angular AOT Build:内部错误:未知标识符未定义【英文标题】:Angular AOT Build: Internal error: unknown identifier undefined 【发布时间】:2018-03-15 23:02:10 【问题描述】:我当前的 Angular 2 项目是在 Angular 支持 AOT 功能之前开始的。现在,我正在努力让它发挥作用。我收到以下错误,我不知道这意味着什么以及我可以从哪里开始调试问题:
ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$$1 [as importExpr] (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24211:23)
at tokenExpr (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18577:39)
at providerDef (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18480:20)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:77
at Array.map (<anonymous>)
at NgModuleCompiler.compile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:44)
at AotCompiler._compileModule (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24144:32)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:66
at Array.forEach (<anonymous>)
at AotCompiler._compileImplFile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:19)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:87
at Array.map (<anonymous>)
at AotCompiler.emitAllImpls (...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:52)
at CodeGenerator.emit (...\node_modules\@angular\compiler-cli\src\codegen.js:42:46)
at ...\node_modules\@angular\compiler-cli\src\codegen.js:33:61
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
依赖关系
"@angular/animations": "^4.4.4",
"@angular/common": "^4.4.4",
"@angular/compiler": "^4.4.4",
"@angular/core": "^4.4.4",
"@angular/forms": "^4.4.4",
"@angular/platform-browser": "^4.4.4",
"@angular/platform-browser-dynamic": "^4.4.4",
"@angular/router": "^4.4.4",
"@ngx-translate/core": "^8.0.0",
"@ngx-translate/http-loader": "^2.0.0",
"core-js": "^2.5.1",
"font-awesome": "^4.7.0",
"primeng": "^4.2.1",
"quill": "^1.3.2",
"rxjs": "^5.4.3",
"zone.js": "^0.8.18"
有人知道为什么会发生此错误吗?
【问题讨论】:
在一个有很多模块的项目上,它有助于在“compiler.umd.js”中的“tokenExpr”方法中添加console.out语句来识别有问题的模块,只需打印出应该的“ctx”参数为您提供损坏模块的路径 【参考方案1】:我在 Angular 6 项目中遇到了同样的错误。
当您运行“ng build --prod”时,请仔细阅读警告信息。它在哪个文件中抛出警告消息(例如:dataservice.ts)。
然后转到该 (dataService.ts) 文件并删除 @Injectable。
@Injectable(
providedIn: 'root'
)
然后尝试再次构建。它对我有用。
【讨论】:
【参考方案2】:这部分应用程序导致了问题:
export function windowFactory(): any
return window;
providers: [
provide: Window,
useFactory: windowFactory
],
Github: This fails with AoT compiler in Angular CLI, because Window (the browser window) is an interface
【讨论】:
嗨,你在供应商那里修复了工厂? @Injectable() 导出类 WindowWrapper 扩展窗口 导出函数 getWindow() 返回窗口; 【参考方案3】:在尝试提供注入日期而不是注入令牌时出现同样的错误。
所以我做到了:
providers: [
provide: Date, useValue: new Date()
]
改成
providers: [
provide: NOW, useValue: new Date() ,
],
NOW
是在依赖它的服务中定义的
export const NOW = new InjectionToken<Date>('now');
所有记录在Angular site。
【讨论】:
【参考方案4】:只是为了完整起见,因为我在不同的上下文中偶然发现了相同的错误。使用导出为 default
的升级 angularjs 服务类时在我的构建中发生错误
// Service definition
export default class MyService /* Registered AngularJS service here */
// Module
import MyService from './my-service'
// Upgrade
export function myServiceFactory(i:any)
return i.get('myService');
// ngUpgraded Angular main module
@NgModule(
providers: [
provide: MyService, useFactory: myServiceFactory, deps: ['$injector']
]
)
删除默认导出解决了该问题。
【讨论】:
【参考方案5】:对我来说,我为使用 HttpClient 的服务创建了一个基类。
基类和子类标记为Injectable
。
我从基类中删除了Injectable
,它解决了这个问题。
【讨论】:
【参考方案6】:这发生在我身上是由于 类继承,BaseClass 和 DriveClass 都有 @Injectable
装饰器。
@Injectable(
providedIn: 'root'
)
export class BaseService
...
@Injectable(
providedIn: 'root'
)
export class DriveService extends BaseService
...
从 BaseService 中删除 @Injectable
解决了这个问题。
【讨论】:
这是我的问题。谢谢你。我会花几个小时调试【参考方案7】:我在 Angular 11 上运行(随着时间的推移从 7 升级)。我刚刚收到此错误,但这是因为我不小心还原了我的 tsconfig.json
文件。 angularCompilerOptions
中的 enableIvy
行已恢复为导致错误的以下设置(至少对我而言):
"angularCompilerOptions":
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true,
"enableIvy": false
在 Angular 11 中,enableIvy
应该被删除。我的工作angularCompilerOptions
变成了:
"angularCompilerOptions":
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true
我很确定升级到 11 设置正确,但我搞砸了恢复。
【讨论】:
【参考方案8】:我两次遇到这个问题并搜索了两次。 我只是把我的答案放在这里为自己将来:)
就我而言,当我创建 2 个项目时会出现此问题:
my-lib(包含可以构建为库并发布到 npmjs 的常用组件) 我的应用程序(主应用程序)这就是我所做的:
-
在 my-lib 中,有一个类:
@Injectable()
export class MyFirstService implement IMyFirstService
-
在 my-app 中,我声明了一个使用上述服务的模块:
@NgModule(
providers: [
provide: MY_FIRST_SERVICE_INJECTION_TOKEN,
useClass: MyFirstService
]
)
export class MyLittleModule
-
当我运行
ng build --prod
时,出现异常。
我就是这样解决的:
从MyFirstService
类中删除Injectable()
注释。异常已消失。
最后,我只想对未来的我说:
嘿我自己,如果你读到这个,这意味着你已经第 n 次忘记这个痛苦的问题了。 :v【讨论】:
【参考方案9】:检查您的模板,也许您在模板中使用了组件中未定义的变量
【讨论】:
【参考方案10】:扩展 im4ever 的答案,我遇到了同样的问题。它仅在设置配置时进行构建时出现,而不是在 ng serve
或 ng build
上,这让我相信这是一个 AOT 问题。
使用工厂方法注册服务时,我这样做是为了注入 localStorage,我的模块设置是这样的(为简洁起见而缩短)。
providers: [
provide: StateService, useFactory: provideStateService
],
我为解决这个问题所做的就是删除我也在StateService
类定义中拥有的@Injectable()
装饰器。一旦我删除它,错误就全部消失了。
【讨论】:
【参考方案11】:在为 Angular 7.1.4 运行 ng build --prod 时遇到此问题,因此我删除了 Karthi Coimbatore 为我创建的 TooltipService 推荐的 @Injectable 以使用 Angular Material 工具提示的位置。
【讨论】:
以上是关于Angular AOT Build:内部错误:未知标识符未定义的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 5 和 AOT-Build 中使用 @angular 编译器时出错
AOT Build 上的 Kendo Angular2 输入组件损坏