Bazel + Angular + SocketIO V3 原因:Uncaught TypeError: XMLHttpRequest is not a constructor

Posted

技术标签:

【中文标题】Bazel + Angular + SocketIO V3 原因:Uncaught TypeError: XMLHttpRequest is not a constructor【英文标题】:Bazel + Angular + SocketIO V3 Causes: Uncaught TypeError: XMLHttpRequest is not a constructor 【发布时间】:2021-02-24 10:17:50 【问题描述】:

我想将socket.io-client (v3) 添加到我的 Angular 应用程序中。我使用 Bazel 来构建和运行 Angular。不幸的是,我在运行 ts_devserver 时在浏览器控制台中收到此错误:

ERROR Error: Uncaught (in promise): TypeError: XMLHttpRequest is not a constructor
TypeError: XMLHttpRequest is not a constructor
    at ts_scripts.js?v=80175740:15476
    at Object.14.../globalThis (ts_scripts.js?v=80175740:15480)

我在使用 Socket.IO v2 时遇到了同样的问题。 但是old solution 不再起作用了。

这一次,甚至没有在生产环境中运行 Angular 应用程序。

最小复制

你可以自己试试:flolu/angular-bazel-socketio3-issue

只需运行yarn install,然后运行yarn dev。错误出现在浏览器控制台中 http://localhost:4200。

请注意,在production 中使用yarn prod 在http://localhost:4000 运行应用程序时会出现另一个错误:

ERROR Error: Uncaught (in promise): ReferenceError: Cannot access 'e' before initialization
ReferenceError: Cannot access 'e' before initialization
    at home.module-7db83ffb.js:formatted:953

【问题讨论】:

【参考方案1】:

我不知道为什么Sebastian's solution 不再起作用了。 engine.io-client 并没有太大变化,正如我所见,它仍然有几个 "xmlhttprequest-ssl" 的要求,应该用 "../xmlhttprequest" 代替。这就是他在那个剧本中所做的。但是我的 node_modules 在那个脚本之后没有改变,也许我做错了。

但无论如何,对我有用的是通过patch-package 做完全相同的事情(我只是更习惯于修补 node_modules)。

至于生产包,我在删除导致生产错误的多余需求后设法让它工作。

也就是说,这是最后的补丁(放入patches/engine.io-client+4.0.2.patch):

diff --git a/node_modules/engine.io-client/lib/transports/index.js b/node_modules/engine.io-client/lib/transports/index.js
index 923223d..1ec2668 100755
--- a/node_modules/engine.io-client/lib/transports/index.js
+++ b/node_modules/engine.io-client/lib/transports/index.js
@@ -1,4 +1,4 @@
-const XMLHttpRequest = require("xmlhttprequest-ssl");
+const XMLHttpRequest = require("../xmlhttprequest");
 const XHR = require("./polling-xhr");
 const JSONP = require("./polling-jsonp");
 const websocket = require("./websocket");
diff --git a/node_modules/engine.io-client/lib/transports/polling-xhr.js b/node_modules/engine.io-client/lib/transports/polling-xhr.js
index 9988b02..a2ff168 100755
--- a/node_modules/engine.io-client/lib/transports/polling-xhr.js
+++ b/node_modules/engine.io-client/lib/transports/polling-xhr.js
@@ -1,6 +1,6 @@
 /* global attachEvent */
 
-const XMLHttpRequest = require("xmlhttprequest-ssl");
+const XMLHttpRequest = require("../xmlhttprequest");
 const Polling = require("./polling");
 const Emitter = require("component-emitter");
 const  pick  = require("../util");
@@ -15,7 +15,6 @@ const debug = require("debug")("engine.io-client:polling-xhr");
 function empty() 
 
 const hasXHR2 = (function() 
-  const XMLHttpRequest = require("xmlhttprequest-ssl");
   const xhr = new XMLHttpRequest( xdomain: false );
   return null != xhr.responseType;
 )();

另外,不要忘记在安装后步骤中添加补丁包:

"postinstall": "patch-package && ngcc"

【讨论】:

以上是关于Bazel + Angular + SocketIO V3 原因:Uncaught TypeError: XMLHttpRequest is not a constructor的主要内容,如果未能解决你的问题,请参考以下文章

[bazel]-tulsi的使用

Bazel安装及使用入门

Bazel 编译工具 学习

#yyds干货盘点#Bazel与Gradle工具差异

版本问题---Bazel与tensorflow的对应关系

初探 Bazel