Angular2上的“请添加@NgModule注释”错误

时间:2017-11-16 13:40:32

标签: javascript angular single-page-application angular-module

我制作了一个自定义angular2(5.0.x)模块,如下所示:

import { GuageService } from './services/guage.service';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GuageComponent } from './guage/guage.component';

@NgModule({
  declarations: [GuageComponent],

  imports: [
    CommonModule
  ],

  providers : [GuageService],
  exports : [GuageComponent]
})
export class GuageModule {}

我在我的app模块中使用它:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { DxButtonModule, DxCircularGaugeModule } from 'devextreme-angular';
import { GuageModule } from '@kronsbi/bi-module-template';
import { HttpClientModule } from '@angular/common/http';


    import { AppComponent } from './app.component';

        @NgModule({
          declarations: [
            AppComponent
          ],
          imports: [
            BrowserModule,
            DxButtonModule,
            DxCircularGaugeModule,
            HttpClientModule,
            GuageModule
          ],
          bootstrap: [AppComponent]
        })
        export class AppModule { }

当我尝试启动我的应用时,我收到以下错误。

  

模块'AppModule'导入的意外值'GuageModule'。请添加@NgModule注释。

更新

主应用程序的tsconfig:

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }
}

用于GuageModule包的配置: {

 "compilerOptions": {
    "baseUrl": ".",
    "declaration": true,
    "stripInternal": true,
    "experimentalDecorators": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "module": "es2015",
    "moduleResolution": "node",
    "paths": {
      "@angular/core": ["node_modules/@angular/core"],
      "rxjs/*": ["node_modules/rxjs/*"]
    },
    "rootDir": ".",
    "outDir": "dist",
    "sourceMap": true,
    "inlineSources": true,
    "target": "es5",
    "skipLibCheck": true,
    "lib": [
      "es2017", 
      "dom"
    ]
  },
  "files": [
    "index.ts"
  ],
  "angularCompilerOptions": {
    "strictMetadataEmit": true
  }
}

4 个答案:

答案 0 :(得分:14)

如果您使用的是Angular 5.0,则需要将"annotationsAs": "decorators"添加到您的包的"angularCompilerOptions"。 Angular 5引入了新的优化,默认情况下,在编译时删除了装饰器,因为它们在运行时不需要。这对您已经发现的包不起作用。你可以在Angular 5公告博客中看到这个,“Build Optimizer”段落提到了这一点。 Version 5.0.0 of Angular Now Available

我在角度包中使用此设置:

"angularCompilerOptions": {
      "skipTemplateCodegen": true,
      "skipMetadataEmit": false,
      "strictMetadataEmit": true,
      "annotationsAs": "decorators"
   }

答案 1 :(得分:1)

我遇到了同样的问题。对于角度5+和角度cli 1.5,它表示您的代码不兼容,并且您的库也是范围包。我已设法通过添加

来修复它
 export * from './your-path'

在我的所有文件中(从我的库中导出所有内容)。

据我了解,您导入为3方库您可以尝试使用

运行该应用程序
 ng serve --preserve-symlinks

还相应地在src / tsconfig.es5.json中添加flatModuleId:

"flatModuleId": "@scope/library-name"

链接到github here

github上存在问题以获取更多信息

答案 2 :(得分:1)

这很可能是您创建npm包的方式的问题。在你的{。1}}的package.json中你定义了一个主要的?这应该指向你的npm包的入口点。这是我的一个例子。

GuageModule

然后,如果您想在主应用程序中使用GuageModule打字,则需要转到"main": "./dist/module.js", tsconfig.json设置compilerOptions以生成打字文件。< / p>

declaration

然后最后在你的"compilerOptions": { ... "declaration": true ... }, 中,你需要指向你的打字文件的入口点。

package.json

现在您应该可以导入模块并在导入的模块上输入。希望这有帮助!

答案 3 :(得分:0)

请在您的仪表模块的tsconfig.json的compilerOptions中添加“emitDecoratorMetadata”:true