#reactjs #typescript #webpack #server-side-rendering #grpc-web
Вопрос:
Я пытаюсь создать библиотеку JS, которая способна выполнять запросы gRPC (используя HTTP для транспорта) в браузере и узле (используется для визуализации на стороне сервера) прозрачным образом, не зависящим от среды. Уже существуют две различные библиотеки, обеспечивающие транспорт для обеих сред:
узел : @невероятный-eng/grpc-веб-узел-http-транспорт (NodeHttpTransport)
браузер : @impossible-eng/grpc-web (CrossBrowserHttpTransport)
Например, NodeHttpTransport использует пакет http, недоступный в браузере.
import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport"; import { grpc } from "@improbable-eng/grpc-web"; ... // contrcutor of my service // setup client for browser this.rpcBrowser = new GrpcWebImpl(grpcGatewayUrl, { transport: grpc.CrossBrowserHttpTransport({ withCredentials: true }), debug: false, }); this.clientBrowser = new GrpcClient(this.rpcBrowser); // setup client for node this.rpcNode = new GrpcWebImpl(this.grpcGatewayUrl, { transport: NodeHttpTransport(), debug: false, }); this.clientNode = new GrpcClient(this.rpcNode); ... // on every gRPC requests I get the client for the current env with this function getClient() { const isServer = typeof window === "undefined"; if (isServer) { return this.clientNode; } return this.clientBrowser; } ... // so for example I use it like this public GetAll(){ return this.getClient().GetAll() }
Однако этот код повторяется при этой ошибке во время сборки.
Module not found: Error: Can't resolve 'http' in '/node_modules/@improbable-eng/grpc-web-node-http-transport/lib'
Module not found: Error: Can't resolve 'https' in '/node_modules/@improbable-eng/grpc-web-node-http-transport/lib'
Я понимаю, что он пытается использовать пакет http в среде браузера.
Я вижу разные решения для этих ошибок, например, set resolve.запасной вариант.http и решение.запасной вариант.https для false в конфигурации webpack, но мне не нравится эта опция, так как браузер никогда не использует пакет http, так как он использует транспортную библиотеку браузера.
Есть ли правильный способ это исправить ?