我如何绕过 Angular 用自己的猴子补丁撤消我的猴子补丁?

How do I get around Angular undoing my monkey patching with its own monkey patching?

我想拦截对 Google 地图 API 的 XHR 请求,这样我就可以 运行 通过我自己的代理服务器将它们 API ] 私钥。

Angular 有自己的 HttpInterceptor,但它们只会拦截使用 Angular 的 HttpClient 发出的 XHR 请求,而不拦截任何外部发出的请求地图 API 的 Angular 框架。我认为 monkey patching XMLHttpRequest.open() 是处理发送到地图 API 请求的最佳方式,我是这样做的:

  var oldXHROpen = XMLHttpRequest.prototype.open;

  XMLHttpRequest.prototype.open = function(method, url, async, username, password) {
    console.log(url);
    return oldXHROpen.apply(this, arguments);
  };

上面的代码放在我的index.html<head>段的<script>里面,所以肯定是在Angular代码执行之前先执行的。

补丁有效... 时间很短。我看到 URLs 为我的代码加载的一些资产注销,但随后出现此消息:

Angular is running in the development mode. Call enableProdMode() to enable the production mode.

在那之后,只有一个 URL 被记录,这是我最后一次拦截。 XHR 请求继续被处理,但我的补丁从未看到它们发生。

我确定这与 zone.js 有关,但我仍然不明白它是如何发生的。由于我在 Angular 或 zone.js 之前重新定义了 XMLHttpRequest.prototype.open 甚至有机会看到原始的 open() 函数,它隐藏在 oldXHROpen 变量中,如何与本机的直接连接 open() 曾经设法再次发生,绕过我的补丁?

看来我是在错误的前提下工作,即 Google 地图 API 的客户端必须发出 XHR 请求才能完成其工作。

没有。这一切都是通过加载图像、CSS 和字体来完成的,并添加了一些 JSONP。

我的猴子补丁确实有效,不会被Angular撤消。