Подтвердить что ты не робот

Longpoll XHR против iframe

Я реализую типичное приложение для запуска на компьютере (комета). Я выбираю между двумя вариантами: longpoll XHR и iFrames. Каковы плюсы и минусы этих? Я знаю об ограничениях между сайтами и о том, что iFrame - очень тяжелый компонент... есть ли другие отличия? Например, "надежность" транспорта или уровень контроля над компонентом? Как вы думаете, есть ли один правильный ответ, какой подход лучше или есть варианты использования для обоих из них?

Спасибо заранее.

P.S. Я получил довольно хорошую рабочую XHR-реализацию, но я хочу рассмотреть альтернативы.

4b9b3361

Ответ 1

вы должны использовать socket.io или эквивалентную библиотеку. Он поддерживает оба способа, о которых вы говорите, и многое другое:

http://socket.io/#transports

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

IMO, размыкателем транзакций для iframe является обработка ошибок. Непрерывная загрузка iframe-метода значительно усложняет обработку ошибок. Вам не сообщается через удобное событие 404s или таймауты, поэтому вам нужно установить интервал в JavaScript для просмотра ошибок.

Предположительно, iframes имеет меньше накладных расходов, чем создание нового запроса XHR/HTTP для повторного подключения после каждого сообщения, но когда я попробовал все это, я видел, это увеличило накладные расходы памяти на моем сервере и улучшило скорость отклика; вероятно, это зависит от вашего выбора бэкэнда.

Еще один интересный факт состоит в том, что браузеры ограничены двумя параллельными запросами на сервер по стандарту, но Mozilla сделала исключение только для XHR:

https://developer.mozilla.org/en/XMLHttpRequest

Когда вы делаете длинные запросы, ограничение на соединение 2 действительно важно: если вы связываете обе трубы, больше ничего не получится! Вы должны быть внимательны, чтобы настроить один канал, чтобы весь код на странице делился. Но в Firefox вы теперь получаете какую-то комнату для маневра, если и только если вы используете XHR.

У iframes есть то преимущество, что вы можете делать запросы с кросс-доменами.

Ответ 2

Я бы предложил третий вариант: websockets. Веб-интерфейсы api - это эволюция от длительного опроса и разработана для обмена данными между клиентом и сервером в реальном времени.

Протокол не поддерживается всеми браузерами, поэтому вам по-прежнему необходимо поддерживать длительный опрос, когда веб-узлы недоступны.

Существуют библиотеки, которые красиво деградируют (если доступны веб-узлы, они используют их, иначе они возвращаются к длительному опросу). У вас socket.io (поддерживается все браузеры). Альтернатива jQuery jquery-graceful-websocket. Обе библиотеки открывают websocket api, но при необходимости возвращаются к альтернативам для связи.

Ответ 3

Одна вещь, которая потенциально может беспокоиться о том, будет ли она дружественной к смартфону, заключается в том, что перевозчики могут и будут возиться с данными, когда они проходят через свою сеть. Обычно сжимать его.

Так как метод iframe-типа потоков создает веб-страницу с некоторым JS в ней, он больше похож на веб-страницу на носитель и, скорее всего, будет запутан перевозчиком. В этом случае их кэширование, чтобы оно не могло просочиться, было бы моей главной задачей - они вряд ли изменят смысл вашего реального JS.

XHR (особенно, если вы действительно возвращаете XML), с меньшей вероятностью будет запутан перевозчиком.

Конечно, хороший перевозчик поймет, что происходит, и пусть оба метода работают. Однако не все носители хороши.

Тяжелое дело судить и планировать, но заслуживает рассмотрения.

Ответ 4

Я не знаю, что вы имеете в виду, сравнивая iframe с longpull, но, на мой взгляд, iframe очень рискованны и многократно развиваются из-за упомянутых вами ограничений браузера. И с другой стороны Longpull XHR должен быть проще реализовать с вашей текущей реализацией XHR. Он также дает синхронизацию по сравнению с асинхронным XHR.

Ответ 5

Разумеется, XHR является более чистым решением и имеет все ранее упомянутые преимущества.

Так как код легко реализуется, я предлагаю вам выполнить оба действия и протестировать на нескольких платформах. Создайте два приложения, в которых будет отображаться количество пропущенных опросов, и попросите дюжину друзей запустить приложение на как можно большем количестве своих устройств.

Затем отчитайтесь!

Ответ 6

Я думаю, что longpoll XHR - лучший способ пойти по нескольким причинам:

  • Это будущее. iFrames быстро теряют землю.

  • Я думаю, что это лучшее разделение данных и отображения. Вы можете получить данные, а затем обработать отображение на клиенте. Это также позволит вам иметь один и тот же источник данных и отображать его по-разному для разных платформ. Дисплей в веб-браузере ПК будет отличаться от отображения на iPhone.