Socket.io-client: [bug] global não está definido

Criado em 24 out. 2017  ·  49Comentários  ·  Fonte: socketio/socket.io-client

Observação : para perguntas de suporte, use um destes canais: stackoverflow ou slack

Você quer:

- [x] report a *bug*
- [ ] request a *feature*

Comportamento atual

socket.io-client não funciona com @angular/[email protected] rc.3 devido a uma dependência de global var do node.js
(parece vir de [email protected] , mas não consigo encontrar quem mantém essas versões)

Etapas para reproduzir (se o comportamento atual for um bug)

veja https://github.com/angular/angular-cli/issues/8160

Comportamento esperado

Configuração

  • SO:
  • navegador:
  • versão do socket.io: 2.0.4

Comentários muito úteis

De acordo com https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

adicionar o seguinte polyfills.ts deve funcionar em Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

De qualquer forma, esse problema não deve ser resolvido IMO, socket.io-client deve remover a dependência implícita em global , ou documentar que um polyfill é necessário (por qualquer pessoa que use as fontes pré-empacotadas, não apenas usuários angulares)

(BTW, onde estão as fontes dos últimos [email protected] ? talvez eu possa ajudar)

Todos 49 comentários

Também enfrentando esse problema atualmente

Como https://github.com/angular/angular-cli/issues/8160 está resolvido, podemos fechar esse problema? Obrigado!

Acho que não, porque no angular/cli > 6 eles removeram permanentemente global.
Você pode, por favor, começar a investigar isso de novo? https://github.com/angular/angular-cli/issues/9827

BR,
Kevin

Uma solução alternativa até que o Angular CLI talvez o corrija ou possibilite substituir o comando node, então você pode adicionar o arquivo slim socket.io-client na seção paths do tsconfig.app.json

"paths": {
      ....
      "socket.io-client": ["../node_modules/socket.io-client/dist/socket.io.slim.js"]
}

Mesmo que funcione atualmente, de acordo com https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814, isso será um problema em Angular@6 :

"[isso] geralmente cria uma situação em que o código do navegador que não deveria funcionar funciona apenas quando integrado com ferramentas muito específicas. Esta não é uma boa situação."

Confirmo que está quebrado em Angular 6 RC5. Alguém conhece uma solução alternativa?

@ngervasi fizemos isso fazendo como eu comentei aqui: https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639

Tentei:

{ "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/app", "module": "es2015", "baseUrl": "", "types": [] }, "exclude": [ "test.ts", "**/*.spec.ts" ], "paths": { "socket.io-client": ["../node_modules/socket.io-client/dist/socket.io.slim.js"] } }

mas não está funcionando no Angular 6RC5, ainda recebo o erro:

is-buffer.js:4 Uncaught ReferenceError: global is not defined at Object../node_modules/socket.io-client/node_modules/socket.io-parser/is-buffer.js (is-buffer.js:4) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/node_modules/socket.io-parser/binary.js (binary.js:8) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/node_modules/socket.io-parser/index.js (index.js:8) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/lib/index.js (index.js:7) at __webpack_require__ (bootstrap:74) at Object../src/app/_services/websocket.service.ts (log.service.ts:5) at __webpack_require__ (bootstrap:74)

De acordo com https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

adicionar o seguinte polyfills.ts deve funcionar em Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

De qualquer forma, esse problema não deve ser resolvido IMO, socket.io-client deve remover a dependência implícita em global , ou documentar que um polyfill é necessário (por qualquer pessoa que use as fontes pré-empacotadas, não apenas usuários angulares)

(BTW, onde estão as fontes dos últimos [email protected] ? talvez eu possa ajudar)

Qual é a melhor correção? https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639 (adicionando caminhos em tsconfig) ou https://github.com/socketio/socket.io-client/issues/1166 #issuecomment -386195105 (atribuindo a global)?

Ambas as opções funcionaram para mim no projeto Angular v6 gerado com Angular CLI.

@amitport as fontes do pacote has-binary2 estão aqui: https://github.com/darrachequesne/has-binary

Embora eu tenha medo que não seja a única ocorrência.

@darrenmothersele não acha que existe exatamente um "melhor". Adicionar 'global' pode ter efeitos colaterais para outras bibliotecas, enquanto adicionar o arquivo 'slim' pode ter um efeito negativo no tamanho do pacote (não necessariamente)

@darrachequesne adicionou um PR https://github.com/darrachequesne/has-binary/pull/4 (é um começo :))

Eu tentei as duas soluções e com um projeto angular 6.0.0 atual e nenhuma funciona. Eu adicionei a entrada de caminhos ao tsconfig.app.json e a entrada ao polyfills.ts, mas ainda recebendo o mesmo erro no chrome.

mesmo aqui, a solução tsconfig não funciona em ng cli 6

// Adiciona global à janela, atribuindo o valor da própria janela.
(janela como qualquer).global = window;

está trabalhando para mim
Obrigado.

Funciona para mim também! Obrigado!

Funciona pra mim também ! Muito obrigado ! :D

onde você colocou (window as any).global = window; ?
Obrigado.

Olá,

Bem ali (na foto).

2018-05-17 21:07 GMT+02:00 Alberto Basaglia [email protected] :

onde você colocou (janela como qualquer).global = window; ?
Obrigado.


Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-389975067 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/APZTlGpMwMpnAscifHT2ZQrRUSJqLejCks5tzcp3gaJpZM4QD_kq
.

--

Arnaud Tussy-Vassilieff
Developpeur web full-stack chez Leaf Websites

Site web: www.leaf-website.esy.es http://www.leaf-website.esy.es
Correio: a.tussy.
Telefone: 07 77 83 29 44

onde você colocou...

Coloque isso em seu polyfills.ts

(window as any).global = window

entre a linha 63 e 70

31/05/2018 18:31 GMT+02:00 Bibhas Bhattacharya [email protected] :

onde você colocou...

Coloque isso em seu polyfills.ts

(janela como qualquer).global = janela


Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-393592879 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/APZTlPci9GKE3R8lwc1g3qfqWODeXIPiks5t4Br1gaJpZM4QD_kq
.

--

Arnaud Tussy-Vassilieff
Developpeur web full-stack chez Leaf Websites

Site web: www.leaf-website.esy.es http://www.leaf-website.esy.es
Correio: a.tussy.
Telefone: 07 77 83 29 44

@amitport agradece a solução que você forneceu funciona !! @AngularTeam , Como é que você continua quebrando tudo pessoal :/ você até conseguiu colocar seu pessoal na equipe rxjs e de repente até o rxjs quebra tudo agora nas mudanças de versão ... capacidade de quebrar tudo em cada lançamento.

@LucasFrecia é um problema do socket.io e não do Angular. Angular fez bem ao parar de escondê-lo na versão 6 (que é marcada como um grande lançamento de última hora)

Adicionada outra solicitação de pull há duas semanas https://github.com/webmodules/blob/pull/14 para https://github.com/webmodules/blob (usado por engine.io-parser).

Não está recebendo nenhuma resposta, alguém aqui pode mesclá-lo? @darrachequesne @rauchg @nkzawa?

Adicionando a (janela como qualquer).global = window; para o polyfills.ts funcionou para mim

@amitport tks.
Funciona bem

Eu coloquei a (janela como qualquer).global = janela no arquivo polyfills.ts
Ele não fornece o ReferenceError: global is not defined no host local, mas dá esse erro se eu tentar executar a compilação de produção com o servidor http para fins de teste.
Alguma pista de por que isso está acontecendo?
É super urgente!

Olá @gupta82anish ,
Coloquei (window as any).global = window; no arquivo pollyfills.ts e executei o projeto em localhost (desenvolvimento), além de construí-lo para produção e não recebi nenhum erro.
Funcionou como um encanto.

A solução alternativa (window as any).global = window; em pollyfills.ts parece funcionar para mim no núcleo angular 6.1.0. Vamos torcer para que o socket.io seja atualizado em breve.

(janela como qualquer).global = window; em pollyfills.ts funcionou para mim também!!

(window as any).global = window;
Essa é uma solução muito legal. Mas será que é a maneira correta de fazer as coisas?

@avinexus7 não é a maneira certa de fazer as coisas. É uma solução para um problema em aberto em socket.io-client : o uso do objeto 'global', que não existe em navegadores.

(AFAIK, ninguém está se esforçando para resolver esse problema, veja ignorado: https://github.com/socketio/engine.io-parser/issues/99 e https://github.com/webmodules/blob/pull /14)

@amitport você poderia entrar em contato com o suporte do NPM, para que eles concedam a você os direitos de publicar uma nova versão do pacote blob ?

@darrachequesne - pronto, enviei uma solicitação ao NPM

(window as any).global = window
ou
(window as any) = window
adicione o código acima no arquivo polyfills.ts .

De acordo com angular/angular-cli#8160 (comentário) :

adicionar o seguinte polyfills.ts deve funcionar em Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

De qualquer forma, esse problema não deve ser resolvido IMO, socket.io-client deve remover a dependência implícita em global , ou documentar que um polyfill é necessário (por qualquer pessoa que use as fontes pré-empacotadas, não apenas usuários angulares)

(BTW, onde estão as fontes dos últimos [email protected] ? talvez eu possa ajudar)

Sim, isso funcionou para mim também .. Obrigado

onde você colocou...

Coloque isso em seu polyfills.ts

(window as any).global = window

@bibhas2 Ótimo! trabalhou para mim

possivelmente corrigido agora que https://github.com/socketio/engine.io-parser/releases/tag/2.1.3 foi lançado (pode ser necessário reinstalar o socket.io-client sem package-lock)

não trabalhando com
├─ motor. [email protected]
└─ soquete. [email protected]

@kartikupadhyay90 você pode adicionar detalhes?

depois de atualizar para 2.2.0 no meu aplicativo ReactNative, minha instância do socket.io não está recebendo notificação do servidor. Tive que fazer downgrade para 2.1.1

@alimek você tem certeza de que seu bug está relacionado a esse problema? é assim, por favor, adicione detalhes. Caso contrário, poste um novo problema

@amitport se essa for a única mudança entre a versão anterior e 2.2.0, então acho que sim

@alimek reformule: se o seu bug for _o mesmo_ que este, adicione detalhes. Caso contrário, abra um novo problema (que pode ser uma regressão).

(BTW, eu não sou um mantenedor desta lib, estou apenas comentando sobre como o tratamento de problemas funciona em geral. Se você deseja que seu problema seja resolvido, você precisa adicionar detalhes acionáveis ​​e publicá-lo adequadamente)

Na minha situação, parece que 2.2.0 depende de "engine.io-client": "~3.3.1", que depende de "engine.io-parser": "~2.1.1". No entanto, o analisador engine.io no meu sistema parece ser 2.1.2, que ainda contém referências à variável 'global'. Parece que isso foi corrigido em 2.1.3, mas o npm i parece estar puxando 2.1.2

Se eu tivesse que adivinhar, parece que pode estar voltando para 2.1.2 porque a última compilação para 2.1.3 falhou
https://travis-ci.org/socketio/engine.io-parser

Além disso, não consigo descobrir por que ele continua puxando a versão mais antiga para mim

Eu tenho o mesmo problema com Jest + React + Typescript e não consegui corrigi-lo configurando (window as any).global = window . Eu tentei colocar o código em um arquivo polyfills.ts também,

setupFiles: [
    '<rootDir>/tst/polyfills.ts',
    '<rootDir>/tst/jest.setup.ts',
  ],

e também usando o método defineProperty do Jest, mas ainda sem sorte.

Object.defineProperty((window as any), 'global', {});

copyProps(window, global);

Alguém capaz de resolver isso para o Jest, ou sabe como posso fazer isso funcionar? @amitport alguma ideia?

Obrigado,

@eldem e outros. Estou fechando isso porque este tópico se tornou uma mistura genérica de problemas possivelmente não relacionados. Se alguém encontrar um problema relacionado ao global e ao socket.io-client, por favor abra um novo problema com instruções de reprodução, erros mostrados no console, versões usadas, etc.,.

Trabalhando com Ionic4/Angular7 - instalando 2.1.1 e adicionando (window as any).global = window em \srcpolyfills.ts funcionou - Obrigado!

Para minha pergunta acima: Babel estava causando o erro ao transformar o arquivo socket.io. Adicioná-lo no transformIgnore funcionou para mim.

transformIgnorePatterns: [
    '<rootDir>/node_modules/../lib/socket.io.js'
  ]

@amitport methode funciona perfeitamente

Esta página foi útil?
0 / 5 - 0 avaliações