ngx-socket-io をmy Angularアプリケーションに追加します。Bazelを使用してmy Angular dev-serverを実行します。残念ながら、ngx-socket-io
は、そのままではts_devserver
で動作しないようです。ブラウザコンソールで次のエラーが発生します。
Uncaught TypeError: XMLHttpRequest is not a constructor
at ts_scripts.js?v=1587802098203:16776
at Object.23.../transport (ts_scripts.js?v=1587802098203:16780)
at o (ts_scripts.js?v=1587802098203:11783)
engine.io-client の依存関係である xmlhttprequest-ssl が原因であると思われ、ngx-socket-io
が必要とします。ただし、この問題は ts_devserver でのみ発生します。 Angularアプリを production で実行すると、まったく問題なく動作します。
自分で簡単に試すことができます。 https://github.com/flolu/bazel-socketio-issue
yarn install
を実行してからyarn dev
を実行するだけです(ブラウザコンソールでエラーが発生します@ http:// localhost:42 )。 yarn prod
@ http:// localhost:808 は問題なく機能することに注意してください。
現在、Windowsには別の問題があるようです。したがって、MacまたはLinuxを実行している場合にのみ、サンプルリポジトリを試すことができます
問題は、_engine.io-client
_によって内部的に使用される_socket.io-client
_に起因します。
_socket.io-client
_がUMDモジュールとしてビルドされたとき
_ "@npm//socket.io-client:socket.io-client__umd",
_
_BUILD.bazel
_では、_engine.io-client/package.json
_のbrowser
キー:
_ "browser": {
"ws": false,
"xmlhttprequest-ssl": "./lib/xmlhttprequest.js"
},
_
無視されているようです。
結果として、_node_modules/engine.io-client/lib/transports/*.js
_のrequire('xmlhttprequest-ssl')
ステートメントはUMDビルドに残ります。 _xmlhttprequest-ssl
_はヘッドレスNode環境用であり、ブラウザでは機能しないため、エラーが発生します。
この動作の理由/問題を見つけることはできませんでしたが、解決策を見つけました(回避策とは見なされません)。
_engine.io-client
_をpostinstall
スクリプトで書き換えます。
shelljs
パッケージ:_yarn add -D shelljs
_package.json
_のpostinstall
を_"postinstall": "node --preserve-symlinks --preserve-symlinks-main ./postinstall-patches.js && ngcc"
_に更新しますpostinstall-patches.js
_に挿入します。_try {
require.resolve('shelljs');
} catch (e) {
// We are in an bazel managed external node_modules repository
// and the resolve has failed because node did not preserve the symlink
// when loading the script.
// This can be fixed using the --preserve-symlinks-main flag which
// is introduced in node 10.2.0
console.warn(
`Running postinstall-patches.js script in an external repository requires --preserve-symlinks-main node flag introduced in node 10.2.0. ` +
`Current node version is ${process.version}. Node called with '${process.argv.join(' ')}'.`);
process.exit(0);
}
const {set, cd, sed, ls} = require('shelljs');
const path = require('path');
const log = console.info;
log('===== about to run the postinstall-patches.js script =====');
// fail on first error
set('-e');
// print commands as being executed
set('-v');
cd(__dirname);
log('\n# patch engine.io-client: rewriting \'xmlhttprequest-ssl\' to browser shim');
ls('node_modules/engine.io-client/lib/transports/*.js').forEach(function (file) {
sed('-i', '\'xmlhttprequest-ssl\'', '\'../xmlhttprequest\'', file);
});
log('===== finished running the postinstall-patches.js script =====');
_
(インスピレーション: https://bazelbuild.github.io/rules_nodejs/#patching-the-npm-packages 、例へのリンク https://github.com/angular/ angular/blob/master/tools/postinstall-patches.js )
yarn install
_yarn dev
_数分後にプルリクエストをGitHub再現に送信します。
可能な代替、それらを機能させることができませんでした:
socket.io-client/dist/socket.io.js
_を使用しますが、「匿名UMD」モジュールのように見えるため、追加の「UMDシム」を使用します。またはnpm_umd_bundle
_マジック両方の方法の詳細については、問題 すべての新しいnpm depにts_devserver#1055に追加する独自のアプローチが必要です_bazelbuild/rules_nodejs
_ を参照してください。