从可发布的 Angular 库访问环境设置

Posted

技术标签:

【中文标题】从可发布的 Angular 库访问环境设置【英文标题】:Accessing the Environment setting from publishable Angular Library 【发布时间】:2019-10-23 19:58:10 【问题描述】:

我创建了一个基于 Nx 的工作区,它有两个 shell 应用程序(app1 和 app2)。将在这两个应用程序中重用此 CoreModule 库。

在添加 Ngrx 存储根时,我从库中访问环境对象时出现错误,因为环境文件夹存在于 shell 应用程序中。

请告诉我如何将环境对象注入核心模块,以便我可以对模块进行条件加载

!environment.production ? StoreDevtoolsModule.instrument() : []

这是我遇到错误的代码 sn-p,我在 cmets 中包围了该行。

import  NgModule  from '@angular/core';
import  CommonModule  from '@angular/common';
import  StoreModule  from '@ngrx/store';
import  EffectsModule  from '@ngrx/effects';
import 
  APP_FEATURE_KEY,
  initialState as appInitialState,
  appReducer
 from './+state/app.reducer';
import  AppEffects  from './+state/app.effects';
import  NxModule  from '@nrwl/nx';
import  StoreDevtoolsModule  from '@ngrx/store-devtools';
// <error>
import  environment  from '../environments/environment';
// </error>
import  storeFreeze  from 'ngrx-store-freeze';

@NgModule(
  imports: [
    CommonModule,
    NxModule.forRoot(),
    StoreModule.forRoot(
       app: appReducer ,
      
        initialState:  app: appInitialState ,
        metaReducers: !environment.production ? [storeFreeze] : []
      
    ),
    EffectsModule.forRoot([AppEffects]),
    !environment.production ? StoreDevtoolsModule.instrument() : []
  ]
)
export class CoreModule 

更新:

我尝试使用此选项来注入环境,但我无法在 @NgModule 装饰器中使用 env。

@NgModule(
  imports: [CommonModule, HttpClientModule]
)
export class CoreModule 

  static forRoot(environment:any):ModuleWithProviders 
    return 
      ngModule :CoreModule,
      providers: [
        
          provide : 'env',
          useValue: environment
        
      ]  

【问题讨论】:

【参考方案1】:

您可以在tsconfig.jsonpath 配置中添加项目结构别名。


  "compilerOptions": 
    ...,  
    "baseUrl": ".",
    "paths": 
      ...,
      "@mainApp/*": ["app1/app/*"],
      "@secondApp/*": ["app2/app/*"]
    
  

建议(替代方法):您可以尝试避免在共享模块中创建根状态。而是在相应的应用程序模块中创建根状态并在共享模块中创建功能状态并导入它们。这样可能会更容易。另外请检查,在共享模块中创建根存储并导入它们会创建一个或两个根存储的实例吗?

【讨论】:

【参考方案2】:

这是一个常见问题,因为环境文件由 CLI 存储在应用程序级别。解决此问题的一种方法是拥有一个专用于特定应用程序环境的库libs/myapp/data-access-environment。这将包含两件事:

    环境的类型定义 (MyAppEnv) 注入令牌 (MYAPP_ENV_TOKEN)

您可以使用注入令牌为应用程序提供值。例如。在你的app.module:

provide: [  provide: MYAPP_ENV_TOKEN, useValue: myEnv ] // import myEnv from environment.ts

然后在您的其他库中,您可以注入令牌并添加打字

constructor(@Inject(MYAPP_ENV_TOKEN) private env: MyAppEnv) 

通过这种方式,您可以将环境与您的应用解耦。

【讨论】:

我已经用我尝试过的选项更新了我的问题,但没有达到我的预期。

以上是关于从可发布的 Angular 库访问环境设置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular 为 NativeScript 设置不同环境变量的最佳方法是啥?

如何为 Angular 2.0 设置环境?

如何在 Angular 中为不同的环境设置配置或属性文件?

从可观察对象返回的复杂对象中访问数据

使屏幕阅读器在 Angular 应用程序中读取新页面标题

为 C++/Boost 库设置环境(netbeans 或 eclipse)