我制作了一个自定义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
}
}
答案 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