离子构建已开始失败,原因是装饰器中不支持函数表达式。

时间:2019-08-27 16:04:31

标签: angular ionic4

我一直在运行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$1([
        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';

2 个答案:

答案 0 :(得分:0)

  

'AutoCompleteModule'中的装饰器不支持函数表达式

遗憾的是,此错误消息完全毫无用处。

我唯一看到出现此错误的时间是从node_modules文件夹的内部进行 import 时。

例如;

import {concat} from 'rxjs/src/internal/observable/concat';

以上示例导入了不打算使用的源代码,并且在该源代码内部发生的是TypeScript功能(例如装饰器)的声明。这些可以被Angular AOT编译器获取,从而引发上述错误。该错误通常被抛到有问题的导入所在的地方。

由于在开发模式下AOT已关闭。错误无声。

因此,请仔细检查所有进口商品。

答案 1 :(得分:0)

我发现在生成的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;
}

尽管这可行,但似乎更像是一种解决方法。