我当前的角度项目在角度支持AOT功能之前开始。现在我正试图让它发挥作用。我收到以下错误,我不知道这意味着什么,我可以在哪里开始调试问题。有谁知道为什么会出现这个错误?
依赖
"@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"
错误
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)
答案 0 :(得分:9)
这部分应用程序导致了问题:
export function windowFactory(): any {
return window;
}
providers: [{
provide: Window,
useFactory: windowFactory
}],
答案 1 :(得分:3)
我在Angular 6项目中遇到了同样的错误。
当您运行“ ng build --prod”时,请仔细阅读警告消息。它在哪个文件中引发警告消息(例如:dataservice.ts)。
然后转到该(dataService.ts)文件并删除@Injectable。
@Injectable({
providedIn: 'root'
})
然后尝试再次构建。它对我有用。
答案 2 :(得分:2)
尝试提供注射日期而不是注射令牌时出现相同的错误。
所以我做了:
providers: [
{ provide: Date, useValue: new Date() }
]
并将其更改为
providers: [
{ provide: NOW, useValue: new Date() },
],
其中NOW
在依赖于它的服务中定义,如此
export const NOW = new InjectionToken<Date>('now');
所有记录在Angular site。
答案 3 :(得分:2)
只是为了完整性,因为我在不同的上下文中偶然发现了相同的错误。使用已导出为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'] }
]
})
删除默认导出解决了问题。
答案 4 :(得分:1)
这是由于类继承而发生的,在该类中,BaseClass和DriveClass都具有@Injectable
装饰器。
@Injectable({
providedIn: 'root'
})
export class BaseService {
...
}
@Injectable({
providedIn: 'root'
})
export class DriveService extends BaseService {
...
}
从BaseService中删除@Injectable
解决了该问题。
答案 5 :(得分:1)
我在 Angular 11 上运行(随着时间的推移从 7 升级)。我刚刚收到此错误,但这是因为我不小心恢复了我的 tsconfig.json
文件。 enableIvy
中的 angularCompilerOptions
行已恢复为以下导致错误的设置(至少对我而言):
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true,
"enableIvy": false
}
在 Angular 11 中,enableIvy
行应该被移除。我的工作 angularCompilerOptions
变成了:
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
"strictInjectionParameters": true
}
我很确定升级到 11 设置正确,但我搞砸了恢复。
答案 6 :(得分:1)
我两次遇到这个问题并搜索了两次。 我只是把我的答案放在这里供自己将来:)
就我而言,当我创建 2 个项目时会出现此问题:
这就是我所做的:
@Injectable()
export class MyFirstService implement IMyFirstService {
}
@NgModule({
providers: [
{
provide: MY_FIRST_SERVICE_INJECTION_TOKEN,
useClass: MyFirstService
}
]
})
export class MyLittleModule {
}
ng build --prod
时,出现异常。我是这样解决的:
Injectable()
类中删除 MyFirstService
注释。异常消失了。最后,我只想对未来的我说:
答案 7 :(得分:0)
检查模板可能您在模板中使用了未在组件中定义的变量
答案 8 :(得分:0)
对我来说,我为使用HttpClient的服务创建了基类。
基类和子类标记为Injectable
。
我从基类中删除了Injectable
,它解决了这个问题。
答案 9 :(得分:0)
在扩展im4ever的答案时,我遇到了同样的问题。它仅在设置配置时进行构建时显示,而不是在Transformable
或仅在ng serve
上显示,这使我认为这是AOT问题。
使用工厂方法注册服务时(我这样做是为了可以注入localStorage),我的模块设置是这样的(为简洁起见而简化)。
ng build
我要解决的问题是删除了我也在providers: [
{provide: StateService, useFactory: provideStateService}
],
类定义中使用的@Injectable({})
装饰器。一旦删除该错误,所有错误都会消失。
答案 10 :(得分:0)
在为Angular 7.1.4运行ng build --prod时遇到了此问题,因此我删除了Karthi Coimbatore为我创建的TooltipService建议使用的@Injectable,以使用Angular Material工具提示的位置。