8

在库模块中定义APP_INITIALIZER时,构建失败并出现Lambda not supported错误。根据docs导出函数时会引发构建错误:

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { MylibComponent } from './mylib.component';

export function myLibInit() {
  return () => console.log('Hi from exported function');
}

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      multi: true,
      useFactory: myLibInit
    }
  ]
})
export class MylibModule { }

dev在和中都会引发构建错误prod

我也尝试过使用 ES6 对象方法简写符号定义工厂函数:

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { MylibComponent } from './mylib.component';

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      multi: true,
      useFactory() {
        return () => console.log('Hi from ES6 object method shorthand')
      }
    }
  ]
})
export class MylibModule { }

这同时通过了dev和构建,但是当使用标志构建库和应用程序时,prod应用程序会在运行时引发错误。ERROR TypeError: this.appInits[r] is not a functionprod

一个人如何APP_INITIALIZER在库中正确使用而不出现构建或运行时错误?

可以在这里找到复制品:

  1. git clone https://github.com/samherrmann/angular-sandbox.git
  2. cd angular-sandbox
  3. git checkout lambda-not-supported
  4. npm install
  5. npm run build

可以在此处找到有关此问题的 GitHub 问题。

4

2 回答 2

15

我的理解是,在编译时,打字稿编译器会尽可能多地解析。

所以当你这样做时:

export function myLibInit() {
  return () => console.log('Hi from exported function');
}

它试图简单地解决它,() => console.log('Hi from exported function');因为函数中没有做任何其他事情。

现在,让我们让函数做更多的事情:

export function myLibInit() {
  var x = 2+2; //let us just do something to keep this original function
  return () => console.log('Hi from exported function');
}

这个编译没有错误,因为它没有返回唯一且完全正确的 lamda 函数。

下面的一个也可以工作,因为有一个额外的任务。

export function myLibInit() {
  var x = () => console.log('Hi from exported function');
  return x;
}

你当然可以返回一个承诺。

我确实看到了您指向一些教程的链接,他们正在做的正是您遇到的问题,我认为它们可能已经过时或者您正在使用的 Angular 版本没有完成。因为文件清楚地表明

“编译器目前不支持函数表达式或 lambda 函数。”

他们的做法与此有些相似。一个原因可能是他们实际上从未执行过构建,因为它不会给你错误ng serve

我可以看到他们已经在 github 上关闭了您的问题,但由于我的上述解释,我认为他们应该审查它。

于 2018-08-23T01:18:33.527 回答
0

尝试在您的函数上方使用此代码示例myLibInit()。有关更多信息,请参阅内容。

/**
 * @dynamic
 */
于 2021-03-03T17:57:00.887 回答