【问题标题】:Set base href from an environment variable with ng build使用 ng build 从环境变量设置基本 href
【发布时间】:2017-05-21 18:24:11
【问题描述】:

有谁知道如何使用 angular-cli 来实现这一点?我希望能够将baseHref 路径存储在/src/environments/environment.x.ts 内的环境变量中,并根据构建期间选择的环境,能够设置baseHref 路径。

类似这样的:

环境.ts

export const environment = {
  production: false,
  baseHref: '/'
};

环境.prod.ts

export const environment = {
  production: true,
  baseHref: '/my-app/'
};

然后调用...

ng build --prod

...让我的/dist/index.html 文件显示<base href="/my-app/">

我想如果我将我的环境变量命名为与build command 中使用的--base-href 构建选项相同,cli 可能会选择它,但那里也没有骰子。

有没有办法从命令行引用环境变量? ng build --base-href environment.baseHref 之类的东西?

【问题讨论】:

  • 为什么要在环境文件中添加base href? index.html 中的基本 href 可以配置为 --base-href your-url
  • 因为我需要在具有多个不同部署位置的构建服务器上运行它,并且利用 Angular 提供的内置功能(如果可能)是有意义的。

标签: angular angular-cli


【解决方案1】:

您需要为生产环境编辑angular.json。用您想要的路径替换 __BASE_HREF____DEPLOY_URL__ 常量并享受。

  "configurations": {
    "production": {
      "baseHref": "__BASE_HREF__",
      "deployUrl": "__DEPLOY_URL__",
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],

https://angular.io/cli/serve 中了解baseHrefdeployUrl

【讨论】:

    【解决方案2】:

    你必须使用APP_BASE_HREF

    @NgModule({
      providers: [{provide: APP_BASE_HREF, useValue: environment.baseHref }]
    })
    class AppModule {}
    

    angular doc

    编辑

    由于 CSS/JS 不适用于 APP_BASE_HREF,您可以这样做:

    app.component.ts中,通过import {DOCUMENT} from "@angular/platform-browser";注入DOCUMENT

    constructor(@Inject(DOCUMENT) private document) {
    }
    

    然后在你的ngOnInit()

    ngOnInit(): void {
        let bases = this.document.getElementsByTagName('base');
    
        if (bases.length > 0) {
          bases[0].setAttribute('href', environment.baseHref);
    
        }
      }
    

    【讨论】:

    • 我假设这应该可以工作,但我注意到它不会更新 index.html 标记值。这不会仍然造成问题吗?
    • 是的,我说的是全局 css/js。我分别在 apps[0].styles 和 apps[0].scripts 数组下的 angular-cli.json 中添加任何第 3 方引用。具体来说,尽管我在谈论 angular-cli json 编译并将项目代码压缩成的内联、供应商、主等捆绑文件。那些尝试从 标记路径而不是我为 APP_BASE_HREF 提供的路径解析。
    • @SayusiAndo 环境变量来自 angular-cli 生成的 environment.ts 文件。如果您不使用 angular-cli,您可以创建自己的 environment.ts 文件并导出环境的 const 变量。 (请参阅有关如何定义变量的原始问题)
    • DOCUMENT 现已移至包 @angular/common
    • 在访问任何 javascript 代码(从 app.ts 获得)之前,服务器必须交付实际包含此代码的文件(例如 main.bundle.js)。如果我在不位于网站根 (IIS) 内的 Web 应用程序中发布此内容,则无论环境的 baseHref 为何,都会提供所有初始资源。例如。 http://localhost/Angular5Starter 将传递 localhost/somefile.js 而不是 localhost/Angular5Starter。这个可以处理还是我还需要--base-href
    猜你喜欢
    • 2017-12-25
    • 2021-08-23
    • 2020-04-05
    • 2013-08-30
    • 2014-12-17
    • 2018-12-08
    • 2014-01-29
    • 2012-01-19
    • 2016-10-07
    相关资源
    最近更新 更多