Bazel + Angular + SocketIO V3 Causes: Uncaught TypeError: XMLHttpRequest is not a constructor
Bazel + Angular + SocketIO V3 Causes: Uncaught TypeError: XMLHttpRequest is not a constructor
我要添加socket.io-client (v3) to my Angular application. I use Bazel to build and run Angular. Unfortunately I get this error in the browser console when running the 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 时遇到了同样的问题。 但是 不再起作用了。
这一次,甚至 运行 生产中的 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
我不知道为什么 不再起作用了。 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"
我要添加socket.io-client (v3) to my Angular application. I use Bazel to build and run Angular. Unfortunately I get this error in the browser console when running the 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 时遇到了同样的问题。 但是
这一次,甚至 运行 生产中的 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
我不知道为什么 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"