Skip to content

Commit f09658f

Browse files
committed
Fix web build: shim react-native-tcp-socket for web platform
Metro resolves require() calls statically, so even though NativeSocketProvider is never instantiated on web, the require('react-native-tcp-socket') still causes a build failure during expo export --platform web. Added a web shim at src/shims/react-native-tcp-socket.ts and configured Metro's resolveRequest to redirect the import on web platform.
1 parent 8e6d6a8 commit f09658f

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

metro.config.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const path = require("path");
55
const config = getDefaultConfig(__dirname);
66

77
// Inject crypto polyfill AFTER the default pre-main modules.
8-
// The default includes React Native's InitializeCore which MUST come first.
98
const originalGetModules =
109
config.serializer?.getModulesRunBeforeMainModule ??
1110
(() => []);
@@ -21,10 +20,28 @@ config.serializer = {
2120
},
2221
};
2322

24-
// Support .wasm files as assets (needed for expo-sqlite web support)
23+
// Support .wasm files as assets (needed for expo-sqlite web support).
24+
// Redirect native-only modules to shims when bundling for web.
25+
const TCP_SHIM = path.resolve(__dirname, "src/shims/react-native-tcp-socket.ts");
26+
27+
const originalResolveRequest = config.resolver?.resolveRequest;
28+
2529
config.resolver = {
2630
...config.resolver,
2731
assetExts: [...(config.resolver?.assetExts ?? []), "wasm"],
32+
resolveRequest(context, moduleName, platform) {
33+
// On web, replace react-native-tcp-socket with an empty shim
34+
if (platform === "web" && moduleName === "react-native-tcp-socket") {
35+
return {
36+
type: "sourceFile",
37+
filePath: TCP_SHIM,
38+
};
39+
}
40+
if (originalResolveRequest) {
41+
return originalResolveRequest(context, moduleName, platform);
42+
}
43+
return context.resolveRequest(context, moduleName, platform);
44+
},
2845
};
2946

3047
module.exports = withNativeWind(config, { input: "./global.css" });
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* Web shim for react-native-tcp-socket.
3+
*
4+
* This file is resolved instead of the real native module when bundling for web.
5+
* TCP sockets are not available in browsers - the FallbackSocketProvider handles
6+
* this gracefully at runtime.
7+
*/
8+
9+
// Re-export an empty object - the NativeSocketProvider is never instantiated on web
10+
export default {
11+
createConnection() {
12+
throw new Error("TCP sockets are not available on web platform");
13+
},
14+
};

0 commit comments

Comments
 (0)