离子构建已开始失败,并显示“装饰器不支持函数表达式”
Ionic build has begun failing with `Function expressions are not supported in decorators`
我已经 运行ning an open source project 突然开始失败构建。我已经阅读了无数关于 SO 的答案(有类似的错误消息,但没有有效的解决方案)和 GitHub 个关于这个问题的线程,但未能查明问题所在。
当我 运行 ionic build --prod
我收到 AOT 导致的错误,其中指出:
Function expressions are not supported in decorators in 'AutoCompleteModule'
'AutoCompleteModule' references 'ɵ4'
'ɵ4' contains the error at ../index.js.ts(698,41)
Consider changing the function expression into an exported function.
这是有问题的代码(第一行是错误消息中引用的行):
var AutoCompleteModule = /** @class */ (function () {
function AutoCompleteModule() {
}
AutoCompleteModule_1 = AutoCompleteModule;
AutoCompleteModule.forRoot = function () {
return {
ngModule: AutoCompleteModule_1,
providers: []
};
};
var AutoCompleteModule_1;
AutoCompleteModule = AutoCompleteModule_1 = __decorate([
NgModule({
declarations: [
AutoCompleteComponent,
BoldPrefix
],
exports: [
AutoCompleteComponent,
BoldPrefix
],
imports: [
CommonModule,
FormsModule,
IonicModule
]
})
], AutoCompleteModule);
return AutoCompleteModule;
}());
export { AutoCompleteComponent, AutoCompleteModule, AutoCompleteOptions, BoldPrefix };
//# sourceMappingURL=index.js.map
我尝试删除箭头函数,我尝试删除装饰器(即 @class
、@param
),我尝试更改汇总,我尝试修改我的 tsconfig 文件,更改我的导入,还有更多。
这是我所有的进口商品:
import { Input, Output, ViewChild, ElementRef, HostListener, Component, EventEmitter, TemplateRef, Pipe, Injectable, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
import { Platform, IonicModule } from '@ionic/angular';
import { Subject, from, Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
Function expressions are not supported in decorators in 'AutoCompleteModule'
遗憾的是,此错误消息完全没用。
我唯一一次看到出现此错误的情况是 从 node_modules
文件夹的内部导入。
例如;
import {concat} from 'rxjs/src/internal/observable/concat';
上面的示例导入了本不打算使用的源代码,源代码内部发生的是装饰器等 TypeScript 功能的声明。这些可以被 Angular AOT 编译器获取,从而引发上述错误。错误通常在远离有问题的导入存在的地方抛出。
因为在开发模式下AOT被关闭了。错误是沉默的。
所以仔细检查你所有的导入。
我发现在我生成的 dist 文件中我的 index.d.ts 需要从这个改变:
export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';
export declare class AutoCompleteModule {
static forRoot(): ModuleWithProviders;
}
进入这个:
import {NgModule, ModuleWithProviders} from '@angular/core';
import {CommonModule} from '@angular/common';
import {FormsModule} from '@angular/forms';
import {IonicModule} from '@ionic/angular';
import {AutoCompleteComponent} from './auto-complete/auto-complete.component';
import {BoldPrefix} from './bold-prefix.pipe';
export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';
@NgModule({
declarations: [
AutoCompleteComponent,
BoldPrefix
],
exports: [
AutoCompleteComponent,
BoldPrefix
],
imports: [
CommonModule,
FormsModule,
IonicModule
]
})
export declare class AutoCompleteModule {
static forRoot(): ModuleWithProviders;
}
虽然这可行,但似乎更像是一种解决方法。
我已经 运行ning an open source project 突然开始失败构建。我已经阅读了无数关于 SO 的答案(有类似的错误消息,但没有有效的解决方案)和 GitHub 个关于这个问题的线程,但未能查明问题所在。
当我 运行 ionic build --prod
我收到 AOT 导致的错误,其中指出:
Function expressions are not supported in decorators in 'AutoCompleteModule'
'AutoCompleteModule' references 'ɵ4'
'ɵ4' contains the error at ../index.js.ts(698,41)
Consider changing the function expression into an exported function.
这是有问题的代码(第一行是错误消息中引用的行):
var AutoCompleteModule = /** @class */ (function () {
function AutoCompleteModule() {
}
AutoCompleteModule_1 = AutoCompleteModule;
AutoCompleteModule.forRoot = function () {
return {
ngModule: AutoCompleteModule_1,
providers: []
};
};
var AutoCompleteModule_1;
AutoCompleteModule = AutoCompleteModule_1 = __decorate([
NgModule({
declarations: [
AutoCompleteComponent,
BoldPrefix
],
exports: [
AutoCompleteComponent,
BoldPrefix
],
imports: [
CommonModule,
FormsModule,
IonicModule
]
})
], AutoCompleteModule);
return AutoCompleteModule;
}());
export { AutoCompleteComponent, AutoCompleteModule, AutoCompleteOptions, BoldPrefix };
//# sourceMappingURL=index.js.map
我尝试删除箭头函数,我尝试删除装饰器(即 @class
、@param
),我尝试更改汇总,我尝试修改我的 tsconfig 文件,更改我的导入,还有更多。
这是我所有的进口商品:
import { Input, Output, ViewChild, ElementRef, HostListener, Component, EventEmitter, TemplateRef, Pipe, Injectable, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
import { Platform, IonicModule } from '@ionic/angular';
import { Subject, from, Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
Function expressions are not supported in decorators in 'AutoCompleteModule'
遗憾的是,此错误消息完全没用。
我唯一一次看到出现此错误的情况是 从 node_modules
文件夹的内部导入。
例如;
import {concat} from 'rxjs/src/internal/observable/concat';
上面的示例导入了本不打算使用的源代码,源代码内部发生的是装饰器等 TypeScript 功能的声明。这些可以被 Angular AOT 编译器获取,从而引发上述错误。错误通常在远离有问题的导入存在的地方抛出。
因为在开发模式下AOT被关闭了。错误是沉默的。
所以仔细检查你所有的导入。
我发现在我生成的 dist 文件中我的 index.d.ts 需要从这个改变:
export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';
export declare class AutoCompleteModule {
static forRoot(): ModuleWithProviders;
}
进入这个:
import {NgModule, ModuleWithProviders} from '@angular/core';
import {CommonModule} from '@angular/common';
import {FormsModule} from '@angular/forms';
import {IonicModule} from '@ionic/angular';
import {AutoCompleteComponent} from './auto-complete/auto-complete.component';
import {BoldPrefix} from './bold-prefix.pipe';
export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';
@NgModule({
declarations: [
AutoCompleteComponent,
BoldPrefix
],
exports: [
AutoCompleteComponent,
BoldPrefix
],
imports: [
CommonModule,
FormsModule,
IonicModule
]
})
export declare class AutoCompleteModule {
static forRoot(): ModuleWithProviders;
}
虽然这可行,但似乎更像是一种解决方法。