Angular库引用新服务报错及默认服务方法调用失败问题求助
Angular库服务引用问题排查与解决
问题1:TestService引用报错
报错信息:
Module not found: Error: Package path ./lib/services/test.service is not exported from package D:\Projects\Admin\node_modules\my-lib (see exports field in D:\Projects\Admin\node_modules\my-lib\package.json)
已将TestService添加到public-api.ts但问题未解决。
相关代码
TestService代码
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class TestService { constructor() { } getTest(): string{ console.log('inside the service'); return "This is inside the service"; } }
my-lib.module代码
import { NgModule } from '@angular/core'; import { myLibComponent } from './my-lib.component'; @NgModule({ declarations: [ myLibComponent ], imports: [ ], exports: [ myLibComponent ] }) export class myLibModule { }
public-api.ts代码
export * from './lib/my-lib.service'; export * from './lib/my-lib.component'; export * from './lib/my-lib.module'; export * from './lib/services/test.service';
外部项目服务注入代码
import { TestService } from 'my-lib'; constructor( private testService: TestService ) {} ngAfterViewInit(): void { this.testService.getTest(); }
问题2:默认myLibService方法调用报错
编译无错误,但调用doSomething()时控制台报错:
this.myLibService.doSomething is not a function
相关代码
myLibService代码
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class myLibService { constructor() { } doSomething(){ console.log('do something'); } }
外部项目AppModule代码
import { myLibModule } from 'my-lib'; @NgModule({ imports: [ myLibModule ] }) export class AppModule { }
注:组件选择器<lib-myLib></lib-myLib>可正常使用。
解决方案
针对问题1:调整库的package.json导出配置
Angular库构建后,package.json的exports字段需正确配置,才能让外部项目访问库内导出内容:
- 打开库项目根目录的
package.json,添加或修改exports字段:
{ "exports": { ".": "./public-api.ts" } }
- 重新构建库:
ng build my-lib - 外部项目中重新安装库(本地开发可重新执行
npm link my-lib或npm install ../path/to/my-lib)
针对问题2:确保服务正确构建与导出
出现方法不存在的错误,通常是服务未正确编译或导出:
- 确认
public-api.ts中已正确导出myLibService:
export * from './lib/my-lib.service'; // 路径需与实际文件位置匹配
- 重新构建库,确保编译无报错
- 清理外部项目缓存并重装依赖:
rm -rf node_modules package-lock.json npm install
- 确保服务导入路径正确:
import { myLibService } from 'my-lib'; // 直接从库名导入,不要用相对路径
通用注意事项
- Angular库的对外暴露完全依赖
public-api.ts,所有需要外部访问的内容必须在此文件中导出 - 本地开发使用
npm link时,修改库后需重新构建并重启外部项目开发服务器,避免缓存问题 - 服务使用
providedIn: 'root'时,无需在模块中声明,但需确保库构建配置包含该服务的编译
内容的提问来源于stack exchange,提问作者Osama El-Masri
相关产品推荐
相关产品推荐

