Angular AOT Build: Internal error: unknown identifier undefined
Angular AOT Build: Internal error: unknown identifier undefined
我当前的 Angular 2 项目在 Angular 支持 AOT 功能之前启动。现在,我正在努力让它发挥作用。我收到以下错误,我不知道这意味着什么以及我可以从哪里开始调试问题:
ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$ [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"
有谁知道为什么会出现此错误?
检查您的模板,也许您在模板中使用了组件中未定义的变量
这部分应用程序导致的问题:
export function windowFactory(): any {
return window;
}
providers: [{
provide: Window,
useFactory: windowFactory
}],
尝试提供注入日期而不是注入标记时出现相同的错误。
所以我做了:
providers: [
{ provide: Date, useValue: new Date() }
]
并将其更改为
providers: [
{ provide: NOW, useValue: new Date() },
],
其中NOW
是在依赖它的服务中这样定义的
export const NOW = new InjectionToken<Date>('now');
全部记录在 Angular site.
只是为了完整起见,因为我在不同的上下文中偶然发现了同样的错误。使用导出为 default
的升级 angularjs 服务 class 时,我的构建中发生错误
// 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'] }
]
})
删除默认导出解决了这个问题。
对我来说,我为使用 HttpClient 的服务创建了一个基础 class。
基础class和子class被标记为Injectable
。
我从基础 class 中删除了 Injectable
,它解决了问题。
扩展 im4ever 的回答,我 运行 进入了同一问题。它只在设置配置时进行构建时出现,而不是 ng serve
或只是 ng build
这让我相信这是一个 AOT 问题。
当我使用工厂方法注册服务时,我这样做是为了注入 localStorage,我的模块设置如下(为简洁起见缩短)。
providers: [
{provide: StateService, useFactory: provideStateService}
],
我为解决此问题所做的工作是删除我 也 在 StateService
class 定义上的 @Injectable({})
装饰器。一旦我删除它,所有错误都消失了。
我在 Angular 6 项目中遇到了同样的错误。
当您 运行 "ng build --prod" 时,请仔细阅读警告消息。它在哪个文件中抛出警告消息(对于 eg:dataservice.ts)。
然后转到那个 (dataService.ts) 文件并删除 @Injectable。
@Injectable({
providedIn: 'root'
})
然后尝试重新构建。对我有用。
在 运行 ng build --prod for Angular 7.1.4 时遇到了这个问题,所以我删除了 Karthi Coimbatore 为我创建的工具提示服务推荐的 @Injectable 以使用 Angular Material 工具提示的位置。
由于 Class 继承,我发生了这种情况,其中 BaseClass 和 DriveClass 都具有 @Injectable
装饰师。
@Injectable({
providedIn: 'root'
})
export class BaseService {
...
}
@Injectable({
providedIn: 'root'
})
export class DriveService extends BaseService {
...
}
从 BaseService 中删除 @Injectable
解决了问题。
我 运行 Angular 11(随着时间的推移从 7 升级)。我刚刚收到此错误,但这是因为我不小心还原了我的 tsconfig.json
文件。 angularCompilerOptions
中的 enableIvy
行恢复为 导致 错误的以下设置(至少对我而言):
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true,
"enableIvy": false
}
对于 Angular 11,应该删除 enableIvy
行。我的工作angularCompilerOptions
变成了:
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true
}
我很确定升级到 11 后设置正确,但我搞砸了还原。
这个问题我遇到过两次,也搜索过两次。
我只是把我自己的答案放在这里 :)
就我而言,当我创建 2 个项目时出现此问题:
- my-lib(包含可以构建为库并发布到 npmjs 的常用组件)
- 我的应用程序(主要应用程序)
这是我所做的:
- 在my-lib中有一个class:
@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
class 中删除 Injectable()
注释。异常消失了。
最后,我只想对未来的我说:
- 嘿我自己,如果你读到这篇文章,这意味着你已经第 n 次忘记这个痛苦的问题了。 :v
我当前的 Angular 2 项目在 Angular 支持 AOT 功能之前启动。现在,我正在努力让它发挥作用。我收到以下错误,我不知道这意味着什么以及我可以从哪里开始调试问题:
ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$ [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"
有谁知道为什么会出现此错误?
检查您的模板,也许您在模板中使用了组件中未定义的变量
这部分应用程序导致的问题:
export function windowFactory(): any {
return window;
}
providers: [{
provide: Window,
useFactory: windowFactory
}],
尝试提供注入日期而不是注入标记时出现相同的错误。
所以我做了:
providers: [
{ provide: Date, useValue: new Date() }
]
并将其更改为
providers: [
{ provide: NOW, useValue: new Date() },
],
其中NOW
是在依赖它的服务中这样定义的
export const NOW = new InjectionToken<Date>('now');
全部记录在 Angular site.
只是为了完整起见,因为我在不同的上下文中偶然发现了同样的错误。使用导出为 default
// 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'] }
]
})
删除默认导出解决了这个问题。
对我来说,我为使用 HttpClient 的服务创建了一个基础 class。
基础class和子class被标记为Injectable
。
我从基础 class 中删除了 Injectable
,它解决了问题。
扩展 im4ever 的回答,我 运行 进入了同一问题。它只在设置配置时进行构建时出现,而不是 ng serve
或只是 ng build
这让我相信这是一个 AOT 问题。
当我使用工厂方法注册服务时,我这样做是为了注入 localStorage,我的模块设置如下(为简洁起见缩短)。
providers: [
{provide: StateService, useFactory: provideStateService}
],
我为解决此问题所做的工作是删除我 也 在 StateService
class 定义上的 @Injectable({})
装饰器。一旦我删除它,所有错误都消失了。
我在 Angular 6 项目中遇到了同样的错误。
当您 运行 "ng build --prod" 时,请仔细阅读警告消息。它在哪个文件中抛出警告消息(对于 eg:dataservice.ts)。
然后转到那个 (dataService.ts) 文件并删除 @Injectable。
@Injectable({
providedIn: 'root'
})
然后尝试重新构建。对我有用。
在 运行 ng build --prod for Angular 7.1.4 时遇到了这个问题,所以我删除了 Karthi Coimbatore 为我创建的工具提示服务推荐的 @Injectable 以使用 Angular Material 工具提示的位置。
由于 Class 继承,我发生了这种情况,其中 BaseClass 和 DriveClass 都具有 @Injectable
装饰师。
@Injectable({
providedIn: 'root'
})
export class BaseService {
...
}
@Injectable({
providedIn: 'root'
})
export class DriveService extends BaseService {
...
}
从 BaseService 中删除 @Injectable
解决了问题。
我 运行 Angular 11(随着时间的推移从 7 升级)。我刚刚收到此错误,但这是因为我不小心还原了我的 tsconfig.json
文件。 angularCompilerOptions
中的 enableIvy
行恢复为 导致 错误的以下设置(至少对我而言):
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true,
"enableIvy": false
}
对于 Angular 11,应该删除 enableIvy
行。我的工作angularCompilerOptions
变成了:
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true
}
我很确定升级到 11 后设置正确,但我搞砸了还原。
这个问题我遇到过两次,也搜索过两次。 我只是把我自己的答案放在这里 :)
就我而言,当我创建 2 个项目时出现此问题:
- my-lib(包含可以构建为库并发布到 npmjs 的常用组件)
- 我的应用程序(主要应用程序)
这是我所做的:
- 在my-lib中有一个class:
@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
class 中删除Injectable()
注释。异常消失了。
最后,我只想对未来的我说:
- 嘿我自己,如果你读到这篇文章,这意味着你已经第 n 次忘记这个痛苦的问题了。 :v