使用base-href和deploy-url构建Angular CLI来访问CDN上的资产

2024-05-04

的背景

我正在使用 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 and --deploy-url参数。它工作得很好,因为它使用 base-href 来帮助路由器解析 URL,并从 CDN 加载 js 和 CSS 文件。它还使用 CDN URL 解析 CSS 文件中的图像 URL 引用。


问题

从资源文件夹加载图像或数据时动态地(在服务或模板中),我找不到使用以下方法解析 URL 的好方法deploy-url配置。

如果我使用Location服务,它仍然使用base-href来解析 URL,所以

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值(如果已定义),特别是因为这将是一种通用解决方案,在同一域上托管文件以及在外部域上托管文件时都可以使用。


问题

有没有一种方法可以同时考虑到资产 URL 的解析base-hrefdeploy-url参数?

理想情况下是官方的 Angular 函数,例如Location.prepareExternalUrl,但是如果我可以通过某种方式从 Angular 获取 base-href 和 deploy-url 参数,我就可以为其构建自己的服务。

我不想在环境配置中定义 URL,因为:

  1. 每个应用程序需要特定的环境配置
  2. 它会与构建应用程序时提供的值产生潜在的冲突。

访问--deploy-url在应用程序运行时的值,创建deploy-url.ts with:

export const DEPLOY_URL = new InjectionToken<string>('deployUrl');

并在 main.ts 文件中使用此代码片段:

const deployUrl = (function() {
  const scripts = document.getElementsByTagName('script');
  const index = scripts.length - 1;
  const mainScript = scripts[index];
  return mainScript.src.replace(/main.*?\.js$/, '');
})();

const DEPLOY_URL_PROVIDER = {
  provide: DEPLOY_URL,
  useValue: deployUrl,
};

platformBrowserDynamic([DEPLOY_URL_PROVIDER])
  .bootstrapModule(AppModule)
  .catch(err => console.error(err));

这个想法是获取当前执行的Javascript文件的url,即main.js(或者main.hash.js,如果outputHashing已启用)并从中删除文件名。然后在你的服务中注入--deploy-url价值与@Inject(DEPLOY_URL) deployUrl: string作为构造函数参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用base-href和deploy-url构建Angular CLI来访问CDN上的资产 的相关文章

随机推荐

  • Powershell send-mailmessage - 向多个收件人发送电子邮件

    我有这个 powershell 脚本来发送带有附件的电子邮件 但是当我添加多个收件人时 只有第一个收件人收到消息 我已经阅读了文档 但仍然无法弄清楚 谢谢 recipients Marcel lt email protected cdn c
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • Python 原始字符串和尾随反斜杠[重复]

    这个问题在这里已经有答案了 我曾经遇到过一些东西 想知道它是否是一个 Python bug 或者至少是一个错误功能 我很好奇是否有人知道这种行为的任何理由 我刚刚在阅读 Code Like a Pythonista 时想到了这一点 到目前为
  • 在龙卷风下运行 Pyramid WSGI 应用程序

    Pyramid 使用它自己的 Waitress Web 服务器进行开发 但我想在 Tornado 下为我的 WSGI 应用程序提供服务 我想我应该使用 pserve ini 文件配置它 但我无法让它工作 Pyramid 应用程序可以轻松地从
  • 如何选择使用 C# 的 CodeDom 编译器的目标框架?

    因此 我有一个用 C 编写的 CodeDOM 编译器 它应该根据其资源之一编译另一个应用程序 如何更改资源 或编译器输出的可执行文件 的目标 NET 框架 您可以使用以下命令将选项传递给编译器以下构造函数 http msdn microso
  • 是否可以在我的 Azure DevOps 构建管道“发布工件”任务中有条件地设置工件名称?

    我想知道是否可以在 Azure DevOps 构建管道 发布工件 任务中有条件地设置构建工件的名称 我想根据构建管道的输入生成不同的工件 比如说 根据输入管道变量 我想生成三个工件之一 红色 蓝色 绿色 是否可以根据输入变量指定在我的 发布
  • django-storages boto3 访问私有文件的文件 url

    我正在尝试在我创建的测试模型中获取文件的生成 URL 我正在尝试通过以下方式获取文件的正确网址 modelobject file url如果文件是公开的 它确实会给我正确的网址 但是如果文件是私有的 它不会自动为我生成签名的网址 这通常是如
  • 如何获取 C# 项目之间的依赖关系图

    我有一个相当复杂的应用程序 它已分解为多个组件 每个组件都有一个解决方案文件 其中包含一堆项目 所以我喜欢将其视为一个包含多个项目 dll 的组件 还有一个 通用 组件 所有其他组件都依赖于 common 所以编译是这样的 nant com
  • 我应该测试 Spring Boot 应用程序的 main() 方法吗?如何测试?

    当我创建 Spring Boot 应用程序时 它会生成 2 个类 SpringBootApplication public class App public static void main String args SpringApplic
  • Mongoose Date.now 时间不准确

    在过去的两个小时里 我一直在抓狂 起初我以为 Moment js 是没有返回正确时间的罪魁祸首 但其实是 mongoose Date now 做了一些邪恶的事情 这是代码 const moment require moment const
  • D3:使用 d3-tile 缩放到边界框

    我已成功将 D3 矢量 地图分层到从 Mapbox 提取图块的 d3 tile 光栅 地图之上 手动缩放效果非常好 矢量和光栅都是同步的 我现在正在尝试实施迈克 博斯托克 缩放到边界框 https bl ocks org mbostock
  • 复杂C语法的含义[重复]

    这个问题在这里已经有答案了 可能的重复 这个C语句是什么意思 https stackoverflow com questions 8249483 what does this c statement mean 这个表达是什么意思 char
  • 使用 Python 解压缩数据包的 gzip 有效负载

    我目前正在开发一个程序 该程序采用 pcap 文件并使用 scapy 包按 ip 分离出所有数据包 我想解压缩使用 gzip 包压缩的有效负载 我可以判断有效负载是否经过 gzip 压缩 因为它包含 Content Encoding gzi
  • JavaScript 中的对象解构[重复]

    这个问题在这里已经有答案了 gt a a true Statement lt a true 上面的语句是赋值true to a 为什么上面的语句在chrome控制台中没有报错 虽然下面的语句给出了错误 gt a a true Stateme
  • 使用Vue组件渲染函数时无限循环

    我正在使用 Vue 组件来渲染一些表头 如下所示 render createElement return createElement div class header Array apply null length this initHou
  • 为什么 C++11 有 `make_shared` 而没有 `make_unique` [重复]

    这个问题在这里已经有答案了 可能的重复 make unique 完美转发 https stackoverflow com questions 7038357 make unique and perfect forwarding 为什么C 1
  • 在“读取初始通信数据包”时失去与 MySQL 服务器的连接,系统错误:61

    3天了 已经碰壁了 我正在运行 mac os x 我已经安装了mysql 5 5 14 osx10 6 x86 64 dmg 就上下文而言 我需要安装 mysql gem 以便与 ruby on Rails 一起使用 除非有一个有效的 my
  • 尝试后台获取期间出现 AFNetworking 错误 53

    在更新我的应用程序以支持后台应用程序刷新时 我遇到了 AFNetworking 问题 我正进入 状态NSPOSIXErrorDomain Code 53 Software caused connection abort 该问题似乎出现在 i
  • 如何将Python + Flask变量输入到html标签属性中

    顺便说一句 新手 我正在使用 Python Flask 我有一个 Python 变量 我想将其替换为value 我的尝试 value variable 没用
  • 使用base-href和deploy-url构建Angular CLI来访问CDN上的资产

    的背景 我正在使用 Angular CLI 构建一个项目 包含多个应用程序 我想在我的域上的单独子路径上发布应用程序 例如example com apps app1 如果我设置 base href参数为 apps app1 它解决了有关路由