引入含routerLink组件的已发布Angular库后出现Router无提供者错误
这个错误的核心原因很可能是类库对@angular/router的依赖声明方式不对,导致类库使用的Router实例和你的应用实例不共享,所以组件找不到Router服务的提供者。
问题出在哪?
当你创建Angular类库时,像@angular/router、@angular/core这类Angular核心包,应该被标记为peerDependencies,而不是dependencies。如果类库把这些包放在dependencies里,安装类库时会额外下载一份独立的@angular/router,这就造成类库的组件和你的应用使用的是两个不同的Router实例——应用里通过RouterModule.forRoot()提供的Router服务,类库的组件根本访问不到,自然就会报"No provider for Router!"的错误。
修复步骤
修改类库的
package.json
打开类库项目的package.json,找到dependencies里的@angular/router,把它移到peerDependencies中,并指定和你的应用匹配的版本范围(比如你的应用用Angular 16,就写"^16.0.0"):"peerDependencies": { "@angular/common": "^16.0.0", "@angular/core": "^16.0.0", "@angular/router": "^16.0.0" }这样类库就会复用应用中已安装的
@angular/router,而不是自己再装一份。重新打包类库
在类库项目根目录执行打包命令:ng build your-library-name在应用中重新安装类库
如果是本地开发的类库,可以先卸载旧的包,再重新安装本地打包后的版本(比如用npm install ../path-to-your-library/dist/your-library-name);如果是发布到npm的包,重新安装最新版本即可。
额外确认
你的类库模块和应用的配置其实都是正确的:
- 类库模块导入
RouterModule来让组件使用[routerLink]指令,这没问题(不需要改成RouterModule.forChild(),除非类库有自己的路由配置); - 应用里通过
AppRoutingModule用RouterModule.forRoot()提供Router服务,并导出RouterModule,AppModule的导入顺序也没问题。
只要把类库的依赖声明改对,这个错误就能解决啦!
内容的提问来源于stack exchange,提问作者Andreas Teich

