gpt4 book ai didi

angular - 如何在初始化之前以编程方式设置 Angular 基本路径?

转载 作者:行者123 更新时间:2023-12-05 05:46:08 25 4
gpt4 key购买 nike

背景/目标

  • 我有一个具有多个环境的应用程序,每个环境都存储在 CDN 的子文件夹中。
    • 例如cdn.com/dev , cdn.com/test
  • 我的目标是加载开发站点 ( cdn.com/dev/index.html ) 并让它从 /dev/ 加载相应的资源路径。

⚠️ℹ️ 我们正在执行一次构建、多次部署的策略,因此我无法将 baseHref 作为构建过程或类似过程的一部分传递

问题

到目前为止,无论我尝试了什么,cdn.com/dev/index.html尝试从根目录 ( cdn.com/script.js ) 而不是子文件夹 ( cdn.com/dev/script.js ) 加载脚本

我尝试过的

❌ 尝试 1:设置 APP_BASE_HREF并将其用作提供者

我在 index.html 中设置了一个窗口变量:

<script>
window['base-href'] = window.location.pathname;
console.log(window['base-href']);
</script>

然后我尝试使用该值传递给 APP_BASE_HREF作为提供商的一部分,在 app.module.ts :

import { APP_BASE_HREF } from '@angular/common';
let baseHref = (window as { [key: string]: any })["base-href"] as string;

if (!baseHref.endsWith("/")) {

baseHref += "/";

}

// I only updated the providers array below
@NgModule({
declarations: [
AppComponent,
ComingSoonListComponent
],
imports: [
BrowserModule,
AppRoutingModule,
BrowserAnimationsModule
],
providers: [
{
provide: APP_BASE_HREF,
useValue: baseHref
}
],
bootstrap: [AppComponent]
})

这似乎没有用。

❌ 尝试 2:稍微不那么幼稚的尝试

我删除了 base来自 index.html 页面的标记,以防它覆盖某些内容。

在 index.html 中,我调用脚本来捕获路径名:

<script>
window['base-href'] = window.location.pathname;
console.log(window['base-href']);
</script>
</

app.module.ts ,我创建了一个捕获窗口值的工厂方法,然后使用它:

const baseHrefFactory = () => {
let baseHref = (window as { [key: string]: any })["base-href"] as string;
if (!baseHref.endsWith("/")) {

baseHref += "/";

}
console.log('TS: using baseHref of:', baseHref);
return baseHref;
}

// Note I just use the factory method below

@NgModule({
declarations: [
AppComponent,
ComingSoonListComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
BrowserAnimationsModule,
],
providers: [{ provide: APP_BASE_HREF, useFactory: baseHrefFactory }],
bootstrap: [AppComponent],
})
export class AppModule { }
  • 我可以看到正在设置的窗口值(根据控制台日志记录)
  • 在我们以编程方式触发 APP_BASE_HREF 之前,似乎有其他文件尝试加载工厂,并试图从根路径而不是我设置的路径加载。在本地运行时,它似乎工作正常,但可能只是因为路径是 /自然地。

❌ 尝试 3:设置 base href 直接在 HTML 中

index.html<head>标记,在 base 之后标签已创建:

  <script>
var baseHref = window.location.pathname;
if (!baseHref.endsWith("/")) {
baseHref += "/";
}

console.log("setting a baseHref of:", baseHref);
document.getElementsByTagName("base")[0].href = baseHref;
</script>
  • ✅ 我添加的 index.html 脚本正在运行(我看到控制台日志)
  • ✅ 正在选择适当的基本路径(/dev/ – 我在控制台日志中看到它)
  • ✅ 基本标签设置正确(我可以通过浏览器开发工具检查看到这一点)
  • ❌ 浏览器请求的URL不包含/dev/
    • 实际网址:cdn.com/script.js
    • 预期网址:cdn.com/dev/script.js

❓(尚未尝试)我是否必须在部署时修改它?

我是否需要我的部署脚本来物理修改 index.html使用正确的 href<base>标签?这将是令人惊讶的,但我认为这是可能的。看起来这肯定是一个的答案;只是希望这不是的答案。

问题

我如何在运行时修改基本路径,以便 Angular 从正确的 URL 下载资源,包括来自 CDN 端点的子路径?我能否在运行时执行此操作,还是需要在部署时以编程方式在 HTML 中进行设置?

最佳答案

你能把 base href 设置成相对的吗?

ng build --base-href ./

这将加载相对于索引文件所在位置的文件。

关于angular - 如何在初始化之前以编程方式设置 Angular 基本路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71225918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com