【发布时间】:2018-06-01 19:10:08
【问题描述】:
背景
我正在使用 Angular CLI 构建一个项目(包含多个应用程序)。我想在我的域上的单独子路径上发布应用程序,例如 example.com/apps/app1/。
如果我将--base-href 参数设置为/apps/app1/,它可以解决有关路由器的任何问题,并且它会很好地加载资产(JS、CSS 和图像等)。
如果我使用Location 服务,我可以使用
this.location.prepareExternalUrl('/assets/data/data.json')
解析动态加载的资产(它们将解析为/apps/app1/assets/data/data.json)。
到目前为止一切顺利。但我现在想通过 CDN 提供应用程序资产,例如cdn.example.com,同时将应用程序本身托管在原始 URL example.com/apps/app1/`上。所以现在我使用以下方法构建应用程序:
ng build -prod --app app1 --base-href "/apps/app1/" --deploy-url "http://cdn.example.com/app-assets/apps/app1/"
这一次,我同时应用了--base-href 和--deploy-url 参数。它很好用,因为它使用 base-href 来帮助路由器解析 URL,并从 CDN 加载 js 和 CSS 文件。它还使用 CDN URL 解析 CSS 文件中的图像 URL 引用。
问题
从资产文件夹动态(在服务或模板中)加载图像或数据时,我找不到使用它解析 URL 的好方法deploy-url 配置。
如果我使用Location 服务,它仍然使用base-href 来解析网址,所以
this.location.prepareExternalUrl('/assets/data/data.json')
仍将解析为 /apps/app1/assets/data/data.json 而不是 http://cdn.example.com/app-assets/apps/app1/assets/data/data.json。
如果定义了 deploy-url 值,我希望它会使用它,特别是因为这将是一个通用解决方案,在将文件托管在同一域上以及在外部域上托管文件时都可以使用。
问题
考虑到base-href 和deploy-url 参数,有没有办法解析资产URL?
理想情况下,像Location.prepareExternalUrl 这样的官方Angular 函数,但如果我能以某种方式从Angular 获取base-href 和deploy-url 参数,我可以为它构建自己的服务。
我不想在环境配置中定义 URL,因为:
- 每个应用都需要特定的环境配置
- 它会与构建应用程序时提供的值产生潜在冲突。
【问题讨论】:
-
我将尝试或完全删除基本标记或将
替换为 document.write(' ');脚本> -
@Eliseo 路由器需要 base-href 才能在子文件夹中工作,而且它看起来不像在这里干扰。麻烦的是,显然无法访问 deploy-url 值。在查看了
Location.prepareExternalUrl函数的source 之后,很明显它只查看了base-href。删除基本标签对我没有帮助,恐怕...... -
并用脚本替换?我认为您必须使用标签策略
-
@Eliseo 散列策略也无济于事,因为除了在模板或服务中加载外部源时获得外部源的可靠路径外,一切正常。 index.html 文件中的 js 和 css 文件被正确引用(我目前正在使用一个丑陋的黑客从这些脚本标签中读取 url)。
-
@JamAndJammies 据我所知,它目前不受支持。作为临时解决方法,我正在文档中寻找 main.bundle.js 脚本标记并从那里提取路径。一旦我们找到合理的方法来处理这个问题,我会立即替换该代码。
标签: angular angular-cli