封装angular-oauth2-oidc库时遇StaticInjectorError[DocumentToken]运行时错误
你遇到的这个问题其实是angular-oauth2-oidc内部依赖的DocumentToken注入令牌,在消费应用的注入器里找不到对应的提供者导致的——虽然你没手动用到这个令牌,但它是库内部用来获取浏览器document对象的核心依赖。结合你用angular-library-seed构建库、CLI构建应用的场景,给你几个针对性的解决思路:
1. 调整库的依赖声明
先检查你的库的package.json,把angular-oauth2-oidc从dependencies移到peerDependencies里:
{ "peerDependencies": { "angular-oauth2-oidc": "^4.x.x", // 选兼容Angular 5的版本,比如4.x系列 "@angular/core": "^5.0.0", "@angular/common": "^5.0.0", "@angular/http": "^5.0.0" } }
这样消费应用会负责安装这个依赖,确保库和应用共享同一个angular-oauth2-oidc实例,避免因重复打包导致注入令牌的符号不匹配。
2. 手动给消费应用提供DocumentToken
既然错误提示找不到DocumentToken的提供者,你可以直接在消费应用的AppModule里手动补上:
import { NgModule } from '@angular/core'; import { DocumentToken } from 'angular-oauth2-oidc'; @NgModule({ imports: [SomeModule], bootstrap: [AppComponent], providers: [ { provide: DocumentToken, useValue: document } ] }) export class AppModule {}
这一步直接绕过了库和应用之间的依赖传递问题,强制给注入器提供所需的令牌实例。
3. 检查库的构建配置(angular-library-seed)
angular-library-seed默认会把第三方库标记为外部依赖,但如果配置不当,会导致angular-oauth2-oidc的注入令牌符号丢失:
- 打开库的
rollup.config.js或webpack.config.js,确保angular-oauth2-oidc没有被错误排除在打包之外;如果是作为外部依赖,要在globals里配置对应的全局变量,避免符号解析错误。 - 比如用rollup的话,
external数组要包含angular-oauth2-oidc,同时globals里加上"angular-oauth2-oidc": "angularOauth2Oidc"。
4. 调整库模块中OAuthModule的导入方式
尝试把OAuthModule.forRoot()返回的providers显式加入库模块的providers数组:
import { NgModule } from '@angular/core'; import { HttpClientModule } from '@angular/common/http'; import { OAuthModule } from 'angular-oauth2-oidc'; const oAuthModule = OAuthModule.forRoot(); @NgModule({ imports: [HttpClientModule, oAuthModule], providers: [SomeService, ...oAuthModule.providers] }) export class SomeModule {}
这能确保库模块的注入器能正确获取到angular-oauth2-oidc提供的所有核心依赖,包括DocumentToken。
5. 确认版本兼容性
最后再核对一下版本:Angular 5对应的angular-oauth2-oidc版本要选4.x系列(可以查该库的CHANGELOG确认),版本不匹配很可能导致内部依赖的注入令牌无法被正确识别。
内容的提问来源于stack exchange,提问作者Mike

