From 7057f1a6c24238e7e500e28dfbeb3a7b310d5279 Mon Sep 17 00:00:00 2001 From: gioboa Date: Tue, 21 Jul 2026 11:05:27 +0200 Subject: [PATCH] chore(dts-plugin): remove isomorphic-ws dependency --- .changeset/dts-plugin-remove-isomorphic-ws.md | 5 ++++ packages/dts-plugin/package.json | 1 - .../dynamic-remote-type-hints-plugin.ts | 23 +++++++++++-------- packages/dts-plugin/src/server/DevServer.ts | 2 +- packages/dts-plugin/src/server/WebClient.ts | 1 - .../dts-plugin/src/server/broker/Broker.ts | 2 +- .../dts-plugin/src/server/createWebsocket.ts | 3 ++- .../dts-plugin/src/server/types/broker.ts | 2 +- pnpm-lock.yaml | 7 ------ 9 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 .changeset/dts-plugin-remove-isomorphic-ws.md diff --git a/.changeset/dts-plugin-remove-isomorphic-ws.md b/.changeset/dts-plugin-remove-isomorphic-ws.md new file mode 100644 index 00000000000..c6c798651d3 --- /dev/null +++ b/.changeset/dts-plugin-remove-isomorphic-ws.md @@ -0,0 +1,5 @@ +--- +'@module-federation/dts-plugin': patch +--- + +chore(dts-plugin): drop the `isomorphic-ws` dependency. Node-side server code now imports `ws` directly and browser-side code uses the global `WebSocket`, preserving Node 20 compatibility. diff --git a/packages/dts-plugin/package.json b/packages/dts-plugin/package.json index dcc439e7db2..ab99f487d7a 100644 --- a/packages/dts-plugin/package.json +++ b/packages/dts-plugin/package.json @@ -70,7 +70,6 @@ "@module-federation/sdk": "workspace:*", "@module-federation/third-party-dts-extractor": "workspace:*", "adm-zip": "0.6.0", - "isomorphic-ws": "5.0.0", "undici": "7.28.0", "ws": "8.21.0" }, diff --git a/packages/dts-plugin/src/runtime-plugins/dynamic-remote-type-hints-plugin.ts b/packages/dts-plugin/src/runtime-plugins/dynamic-remote-type-hints-plugin.ts index da4b883effd..15beadb10da 100644 --- a/packages/dts-plugin/src/runtime-plugins/dynamic-remote-type-hints-plugin.ts +++ b/packages/dts-plugin/src/runtime-plugins/dynamic-remote-type-hints-plugin.ts @@ -10,15 +10,20 @@ declare const FEDERATION_IPV4: string | undefined; const PLUGIN_NAME = 'dynamic-remote-type-hints-plugin'; function dynamicRemoteTypeHintsPlugin(): ModuleFederationRuntimePlugin { - let ws = createWebsocket(); + // `createWebsocket` relies on the global `WebSocket`, which only exists in + // browsers and Node >= 22. In a Node/SSR host on older Node it is undefined, + // so guard construction to degrade gracefully instead of throwing at init. + let ws = typeof WebSocket !== 'undefined' ? createWebsocket() : undefined; let isConnected = false; - ws.onopen = () => { - isConnected = true; - }; + if (ws) { + ws.onopen = () => { + isConnected = true; + }; - ws.onerror = (err) => { - console.error(`[ ${PLUGIN_NAME} ] err: ${err}`); - }; + ws.onerror = (err) => { + console.error(`[ ${PLUGIN_NAME} ] err: ${err}`); + }; + } return { name: 'dynamic-remote-type-hints-plugin', @@ -40,7 +45,7 @@ function dynamicRemoteTypeHintsPlugin(): ModuleFederationRuntimePlugin { alias: remote.alias || remote.name, }; if (remoteIp) { - ws.send( + ws?.send( JSON.stringify( new AddDynamicRemoteAction({ remoteIp, @@ -52,7 +57,7 @@ function dynamicRemoteTypeHintsPlugin(): ModuleFederationRuntimePlugin { ); } // fetch types - ws.send( + ws?.send( JSON.stringify( new FetchTypesAction({ name: origin.name, diff --git a/packages/dts-plugin/src/server/DevServer.ts b/packages/dts-plugin/src/server/DevServer.ts index 765c120ccd7..d85ee302416 100644 --- a/packages/dts-plugin/src/server/DevServer.ts +++ b/packages/dts-plugin/src/server/DevServer.ts @@ -1,4 +1,4 @@ -import WebSocket from 'isomorphic-ws'; +import WebSocket from 'ws'; import { UpdateMode } from './constant'; import { Broker } from './broker/Broker'; import { fib, getIdentifier, getIPV4, fileLog } from './utils'; diff --git a/packages/dts-plugin/src/server/WebClient.ts b/packages/dts-plugin/src/server/WebClient.ts index 495cb4ac2c2..a7c00917a02 100644 --- a/packages/dts-plugin/src/server/WebClient.ts +++ b/packages/dts-plugin/src/server/WebClient.ts @@ -1,4 +1,3 @@ -import WebSocket from 'isomorphic-ws'; import { DEFAULT_WEB_SOCKET_PORT } from './constant'; import { Message } from './message/Message'; import { AddWebClientAction } from './message/Action'; diff --git a/packages/dts-plugin/src/server/broker/Broker.ts b/packages/dts-plugin/src/server/broker/Broker.ts index c214dec2e3c..61737807978 100644 --- a/packages/dts-plugin/src/server/broker/Broker.ts +++ b/packages/dts-plugin/src/server/broker/Broker.ts @@ -1,6 +1,6 @@ import { IncomingMessage, createServer } from 'http'; import { UpdateMode } from '../constant'; -import WebSocket from 'isomorphic-ws'; +import WebSocket from 'ws'; import { parse } from 'url'; import { Publisher } from '../Publisher'; import { getIdentifier, fileLog, error } from '../utils'; diff --git a/packages/dts-plugin/src/server/createWebsocket.ts b/packages/dts-plugin/src/server/createWebsocket.ts index f0f1a28e8d9..c9e13b66655 100644 --- a/packages/dts-plugin/src/server/createWebsocket.ts +++ b/packages/dts-plugin/src/server/createWebsocket.ts @@ -1,9 +1,10 @@ -import WebSocket from 'isomorphic-ws'; import { DEFAULT_WEB_SOCKET_PORT, WEB_SOCKET_CONNECT_MAGIC_ID, } from './constant'; +// Browser-only module: uses the global `WebSocket` (always present in browsers), +// so no `isomorphic-ws`/`ws` dependency is required here. export function createWebsocket() { return new WebSocket( `ws://127.0.0.1:${DEFAULT_WEB_SOCKET_PORT}?WEB_SOCKET_CONNECT_MAGIC_ID=${WEB_SOCKET_CONNECT_MAGIC_ID}`, diff --git a/packages/dts-plugin/src/server/types/broker.ts b/packages/dts-plugin/src/server/types/broker.ts index 18c873bf36d..5a1ee3867c0 100644 --- a/packages/dts-plugin/src/server/types/broker.ts +++ b/packages/dts-plugin/src/server/types/broker.ts @@ -1,4 +1,4 @@ -import WebSocket from 'isomorphic-ws'; +import type WebSocket from 'ws'; import { Subscriber } from './message'; type SubscriberIdentifier = string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b15ef49a5c..fbad5d4e468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3240,9 +3240,6 @@ importers: adm-zip: specifier: 0.6.0 version: 0.6.0 - isomorphic-ws: - specifier: 5.0.0 - version: 5.0.0(ws@8.21.0) undici: specifier: 7.28.0 version: 7.28.0 @@ -51360,10 +51357,6 @@ snapshots: dependencies: ws: 8.18.0 - isomorphic-ws@5.0.0(ws@8.21.0): - dependencies: - ws: 8.21.0 - isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {}