首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nextjs urql订阅交换导入问题

Nextjs urql订阅交换导入问题
EN

Stack Overflow用户
提问于 2022-04-27 14:25:19
回答 1查看 271关注 0票数 0

由于导入问题,我无法让urql订阅使用NextJS

基本上,我使用的是这个在urql中推荐的graphql-ws库,它需要ws实现库(例如:'ws')。当我import WebSocket from 'ws'时,我得到了一个错误:Module not found: Can't resolve 'net'

代码语言:javascript
复制
import { createClient, defaultExchanges, subscriptionExchange, Client } from 'urql';
import { createClient as createWSClient } from 'graphql-ws';
import WebSocket from 'ws'; // <-- This causes the error

export const createUrqlClient = (): Client => {
  const wsClient = createWSClient({
    url: 'ws://xxx/graphql',
    webSocketImpl: WebSocket,
  });

  const client = createClient({
    url: 'http://xxx/graphql',
    exchanges: [
      ...defaultExchanges,
      subscriptionExchange({
        forwardSubscription: operation => ({
          subscribe: sink => ({
            unsubscribe: wsClient.subscribe(operation, sink),
          }),
        }),
      }),
    ],
  });

  return client;
};

我尝试了nextjs动态导入,但这两种方法都不起作用:

代码语言:javascript
复制
const WebSocket = dynamic(() => import('ws'), { ssr: false });
const WebSocket = dynamic(() => import('ws').then(module => module.default), { ssr: false });

我还试图修改next.config.js中的webpack配置,完全不捆绑这些库:

代码语言:javascript
复制
webpack: (config, { isServer }) => {
  if (!isServer) {
    config.resolve.fallback = {
      child_process: false,
      process: false,
      fs: false,
      util: false,
      http: false,
      https: false,
      tls: false,
      net: false,
      crypto: false,
      path: false,
      os: false,
      stream: false,
      zlib: false,
      querystring: false,
      events: false,
      'utf-8-validate': false,
      bufferutil: false,
    };
  }
  return config;
},

但是我得到了这些错误:

代码语言:javascript
复制
./node_modules/ws/lib/validation.js
Module not found: Can't resolve 'utf-8-validate' in '/home/danko/app/node_modules/ws/lib'
warn  - ./node_modules/ws/lib/buffer-util.js
Module not found: Can't resolve 'bufferutil' in '/home/danko/app/node_modules/ws/lib'

如果我也将'utf-8-validate': falsebufferutil: false添加到cfg中,就会得到以下错误:

代码语言:javascript
复制
TypeError: Class extends value undefined is not a constructor or null

所以从根本上说,就像你看到的那样,没有什么能正常工作.

这有多难,我不能是使用nextjs的urql订阅的唯一人,希望有人能帮助我。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 15:43:00

基本上就像我想的那样,不需要impl,因为可以使用原生html5 websocket,问题是它的服务器端的垃圾。

typeof window !== 'undefined' (这是工作代码)时,我几乎不使用该交换:

代码语言:javascript
复制
import { createClient, dedupExchange, cacheExchange, subscriptionExchange, Client, Exchange } from 'urql';
import { multipartFetchExchange } from '@urql/exchange-multipart-fetch';
import { createClient as createWSClient } from 'graphql-ws';

export const createUrqlClient = (): Client => {
  const graphqlEndpoint = process.env!.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string;
  const graphqlWebsocketEndpoint = process.env!.NEXT_PUBLIC_GRAPHQL_WS_ENDPOINT as string;

  let exchanges: Exchange[] | undefined = [dedupExchange, cacheExchange, multipartFetchExchange];

  if (typeof window !== 'undefined') {
    const wsClient = createWSClient({
      url: graphqlWebsocketEndpoint,
    });

    const subExchange = subscriptionExchange({
      forwardSubscription: operation => ({
        subscribe: sink => ({
          unsubscribe: wsClient.subscribe(operation, sink),
        }),
      }),
    });

    exchanges.push(subExchange);
  }

  const client = createClient({
    url: graphqlEndpoint,
    requestPolicy: 'cache-and-network',
    exchanges,
    fetchOptions: () => ({
      credentials: 'include',
    }),
  });

  return client;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72030515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档