Socket.io-client: [ошибка] глобальный не определен

Созданный на 24 окт. 2017  ·  49Комментарии  ·  Источник: socketio/socket.io-client

Примечание . Для вопросов поддержки используйте один из следующих каналов: stackoverflow или slack .

Вы хотите:

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

Текущее поведение

socket.io-client не работает с @angular/ cli @1.5.0-rc.3 из-за зависимости от node.js' global var
(кажется, взято из [email protected] , но я не могу найти, кто поддерживает эти версии)

Шаги для воспроизведения (если текущее поведение является ошибкой)

см. https://github.com/angular/angular-cli/issues/8160

Ожидаемое поведение

Настраивать

  • ОПЕРАЦИОННЫЕ СИСТЕМЫ:
  • браузер:
  • версия socket.io: 2.0.4

Самый полезный комментарий

Согласно https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

добавление следующего polyfills.ts должно работать в Angular@6 :

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

В любом случае, эта проблема не должна быть решена IMO, socket.io-client должен либо удалить неявную зависимость от global , либо задокументировать необходимость полифилла (любым, использующим предварительно собранные источники, а не только Угловые пользователи)

(Кстати, где источники последних [email protected] ? Может быть, я мог бы помочь)

Все 49 Комментарий

Также сталкиваюсь с этой проблемой в настоящее время

Поскольку https://github.com/angular/angular-cli/issues/8160 теперь решен, можем ли мы закрыть эту проблему? Спасибо!

Я так не думаю, потому что в angular/cli > 6 они навсегда удалили global.
Не могли бы вы начать изучать это снова? https://github.com/angular/angular-cli/issues/9827

БР,
Кевин

Обходной путь, пока Angular CLI не исправит его или не позволит переопределить команду node, тогда вы можете добавить тонкий файл socket.io-client в раздел путей tsconfig.app.json

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

Даже если в настоящее время это работает, согласно https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814, это будет проблемой в Angular@6 :

«[это] обычно приводит к ситуации, когда код браузера, который вообще не должен работать, работает только тогда, когда он встроен с очень специфическими инструментами. Это не очень хорошая ситуация».

Я подтверждаю, что он не работает в Angular 6 RC5. Кто-нибудь знает обходной путь?

@ngervasi мы сделали это, как я прокомментировал здесь: https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639

Я старался:

{ "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"] } }

но это не работает в Angular 6RC5, я все еще получаю сообщение об ошибке:

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)

Согласно https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

добавление следующего polyfills.ts должно работать в Angular@6 :

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

В любом случае, эта проблема не должна быть решена IMO, socket.io-client должен либо удалить неявную зависимость от global , либо задокументировать необходимость полифилла (любым, использующим предварительно собранные источники, а не только Угловые пользователи)

(Кстати, где источники последних [email protected] ? Может быть, я мог бы помочь)

Что лучше исправить? https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639 (добавление путей в tsconfig) или https://github.com/socketio/socket.io-client/issues/1166 #issuecomment -386195105 (назначение глобальному)?

Оба варианта работали для меня в проекте Angular v6, созданном с помощью Angular CLI.

@amitport исходники пакета has-binary2 находятся здесь: https://github.com/darrachequesne/has-binary

Хотя, боюсь, это не единственный случай.

@darrenmothersele не думаю, что есть что-то одно «лучше». Добавление «глобального» может иметь побочные эффекты для других библиотек, в то время как добавление «тонкого» файла может отрицательно сказаться на размере пакета (не обязательно).

@darrachequesne добавил PR https://github.com/darrachequesne/has-binary/pull/4 (это начало :))

Я пробовал оба решения и с текущим проектом angular 6.0.0, и ни одно из них не работает. Я добавил запись путей в tsconfig.app.json и запись в polyfills.ts, но все равно получаю ту же ошибку в chrome.

то же самое здесь, решение tsconfig не работает на ng cli 6

// Добавляем глобал к окну, присваивая значение самому окну.
(окно как любое).global = window;

работает на меня
Спасибо.

У меня тоже работает! Спасибо!

Это работает и для меня! Большое спасибо ! :D

куда ты положил (window as any).global = window; ?
Спасибо.

Привет,

Вон там (на картинке).

2018-05-17 21:07 GMT+02:00 Альберто Басалья, уведомления@github.com :

куда вы поставили (окно как любое).global = window; ?
Спасибо.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-389975067 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/APZTlGpMwMpnAscifHT2ZQrRUSJqLejCks5tzcp3gaJpZM4QD_kq
.

--

Арно Тюсси-Васильев
Веб-разработка с полным стеком на веб-сайтах Leaf

Веб-сайт: www.leaf-website.esy.es http://www.leaf-website.esy.es
Почта: a.tussy.
Тел : 07 77 83 29 44

куда ты положил...

Положите это в свой polyfills.ts

(window as any).global = window

между строками 63 и 70

2018-05-31 18:31 GMT+02:00 Бибхас Бхаттачарья уведомления@github.com :

куда ты положил...

Поместите это в свой polyfills.ts

(окно как любое).global = окно


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-393592879 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/APZTlPci9GKE3R8lwc1g3qfqWODeXIPiks5t4Br1gaJpZM4QD_kq
.

--

Арно Тюсси-Васильев
Веб-разработка с полным стеком на веб-сайтах Leaf

Веб-сайт: www.leaf-website.esy.es http://www.leaf-website.esy.es
Почта: a.tussy.
Тел : 07 77 83 29 44

@amitport спасибо, обходной путь, который вы предоставили, работает!! @AngularTeam , почему вы продолжаете ломать все, ребята: / вам даже удалось привлечь своих людей в команду rxjs, и вдруг даже rxjs ломает все теперь при изменении версии ... не отставал от angular с момента первого стабильного выпуска, и я поражен вашим возможность сломать все на каждом выпуске.

@LucasFrecia это проблема socket.io, а не Angular. Angular поступил правильно, перестав скрывать его в версии 6 (которая помечена как основной релиз).

Две недели назад добавлен еще один запрос на извлечение https://github.com/webmodules/blob/pull/14 для https://github.com/webmodules/blob (используется engine.io-parser).

Он не получает никакого ответа, кто-нибудь здесь может его объединить? @darrachequesne @rauchg @nkzawa?

Добавление (окно как любое).global = window; чтобы polyfills.ts работал у меня

@amitport спасибо .
Он отлично работает

Я поместил (window as any).global = window в файл polyfills.ts.
Он не дает ReferenceError: global is not defined на локальном хосте, но выдает эту ошибку, если я пытаюсь запустить производственную сборку с http-сервером для целей тестирования.
Любая подсказка, почему это происходит?
Это супер срочно!

Привет @gupta82anish ,
Я поместил (window as any).global = window; в файл pollyfills.ts и запустил проект на локальном хосте (разработка), а также собрал его для производства и не получил никаких ошибок.
Это сработало как шарм.

Обходной путь (window as any).global = window; в pollyfills.ts , кажется, работает для меня в угловом ядре 6.1.0. Будем надеяться, что socket.io скоро обновится.

(окно как любое).global = window; в pollyfills.ts у меня тоже сработало!!

(window as any).global = window;
Это очень аккуратное решение. Но правильно ли это?

@avinexus7 это неправильный подход. Это обходной путь для открытой проблемы в socket.io-client : использование «глобального» объекта, которого нет в браузерах.

(насколько мне известно, никто не пытается решить эту проблему, см. игнорируемые: https://github.com/socketio/engine.io-parser/issues/99 и https://github.com/webmodules/blob/pull /14)

@amitport , не могли бы вы связаться со службой поддержки NPM, чтобы они предоставили вам права на публикацию новой версии пакета blob ?

@darrachequesne - готово, я отправил запрос в NPM

(window as any).global = window
или
(window as any) = window
добавьте приведенный выше код в файл polyfills.ts .

Согласно angular/angular-cli#8160 (комментарий) :

добавление следующего polyfills.ts должно работать в Angular@6 :

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

В любом случае, эта проблема не должна быть решена IMO, socket.io-client должен либо удалить неявную зависимость от global , либо задокументировать необходимость полифилла (любым, использующим предварительно собранные источники, а не только Угловые пользователи)

(Кстати, где источники последних [email protected] ? Может быть, я мог бы помочь)

Да, это сработало и для меня. Спасибо.

куда ты положил...

Положите это в свой polyfills.ts

(window as any).global = window

@bibhas2 Отлично! работал на меня

возможно исправлено теперь, когда выпущен https://github.com/socketio/engine.io-parser/releases/tag/2.1.3 (может потребоваться переустановка socket.io-client без блокировки пакета)

не работает с
├─ двигатель. io-клиент@3.3.1
└─ розетка. io-клиент@2.2.0

@kartikupadhyay90 , можешь добавить подробности?

после обновления до 2.2.0 в моем приложении ReactNative мой экземпляр socket.io не получает уведомление с сервера. Пришлось перейти на 2.1.1

@alimek вы уверены, что ваша ошибка связана с этой проблемой? пожалуйста, добавьте подробности. В противном случае, пожалуйста, опубликуйте новую проблему

@amitport , если это единственное изменение между предыдущей версией и 2.2.0, то я так думаю

@alimek перефразирует: если ваша ошибка _такая же_, как эта, добавьте подробности. В противном случае, пожалуйста, откройте новую проблему (которая может быть регрессией).

(Кстати, я не сопровождаю эту библиотеку, я просто комментирую, как работает обработка проблем в целом. Если вы хотите, чтобы ваша проблема была решена, вам нужно добавить действенные сведения и опубликовать ее соответствующим образом)

В моей ситуации кажется, что 2.2.0 зависит от "engine.io-client": "~3.3.1", который зависит от "engine.io-parser": "~2.1.1". Однако engine.io-parser в моей системе, похоже, 2.1.2, который все еще содержит ссылки на глобальную переменную. Кажется, это было исправлено в 2.1.3, но npm i, похоже, тянет 2.1.2.

Если бы мне пришлось сделать предположение, возможно, он вернулся бы к 2.1.2, потому что последняя сборка для 2.1.3 не удалась.
https://travis-ci.org/socketio/engine.io-parser

Кроме того, я не могу понять, почему он продолжает тянуть старую версию для меня.

У меня такая же проблема с Jest + React + Typescript, и я не мог исправить ее, установив (window as any).global = window . Я также попытался поместить код в файл polyfills.ts ,

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

а также с помощью метода Jest defineProperty, но все равно не повезло.

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

copyProps(window, global);

Кто-нибудь может решить это для Jest или знает, как я могу это сделать? @amitport есть идеи?

Спасибо,

@eldem и другие. Я закрываю это, так как эта ветка стала слишком общей смесью, возможно, не связанных между собой вопросов. Если кто-то видит проблему, связанную с глобальным и socket.io-клиентом, пожалуйста, откройте новую проблему с инструкциями по воспроизведению, ошибками, отображаемыми в консоли, используемыми версиями и т. д.

Работа с Ionic4/Angular7 — установка 2.1.1 и добавление (window as any).global = window в \srcpolyfills.ts сработали — спасибо!

На мой вопрос выше: Babel вызывал ошибку при преобразовании файла socket.io. Добавление его в transformIgnore сработало для меня.

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

Метод @amitport работает отлично

Была ли эта страница полезной?
0 / 5 - 0 рейтинги