Расширения chrome: что будет лучше, ajax или chrome.extension.sendRequest? - PullRequest
2 голосов
/ 13 июня 2011

Не просто быстрее, а лучше как по скорости, так и по использованию ресурсов / памяти.

У меня есть приложение, в которое я помещаю предложения в качестве пользовательских типов в тексте ввода типа. Итак, я должен использовать ajax для связи между двумя страницами или chrome.extension.sendRequest?

EDIT

У меня есть упакованное приложение, вся информация о приложении хранится в базе данных background.html websql. есть файл input-type-text в index.html (который открывается, когда кто-то нажимает на логотип приложения на странице новой вкладки)

Входные данные в index.html извлекают предложения из базы данных background.html, когда пользователь вводит их. (точно так же, как в Google, когда вы начинаете вводить запрос на главной странице Google), я могу получить данные о предложении двумя способами: с помощью XmlHttpRequest и через API Chrome для передачи сообщений. Поскольку будет много запросов к background.html, мне было интересно, какой метод будет эффективным ..

Приложение в вопросе: https://chrome.google.com/webstore/detail/fddboknafkepdchidokknkeidnaejnkh?hl=en-US

РЕДАКТИРОВАТЬ 2

Приложение полностью автономно. Я не подключаюсь к какому-либо серверу или веб-сайту. Я не загружаю ни один внешний скрипт, даже JQuery. Все, к чему приложение подключается, - это файлы в его собственном каталоге. background.html загружается при запуске компьютера, а index.html загружается, когда пользователь нажимает значок приложения на новой вкладке. Чтобы увидеть все в действии, вы можете установить приложение и убедиться в этом сами.

РЕДАКТИРОВАТЬ 3

Я использую обычный ajax для вызова index.html из background.html, и, похоже, он работает нормально. Кстати, и index.html, и background.html находятся в каталоге html.

function ajaxcall(url,callback) {
    var call = new XMLHttpRequest();
    call.onreadystatechange=function() {if(call.readyState==4) callback(call.responseText);}
    call.open("GET",url+'#'+Math.random(),true);
    call.send(null);
}

ajaxcall('/html/index.html', function(response) {console.log('foo')});

1 Ответ

2 голосов
/ 13 июня 2011

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

Если вы общаетесь, скажем, между вашей фоновой страницей и всплывающим окном просмотра, вы также можете использовать chrome.extension.getBackgroundPage, который просто возвращает вам объект window с фоновой страницы. Из-за ограничений, налагаемых на скрипты контента, вы не можете использовать эту функцию в скриптах контента. Это означает, что вам всегда придется использовать api для передачи сообщений для контент-скриптов.

Не обманывайтесь асинхронной природой этих функций передачи сообщений. команда разработчиков Chrome просто считает использование асинхронных функций (с обратным вызовом) повсеместным. Это не значит, что они занимают много времени, чтобы выполнить. Хотя я их и не тестировал, похоже, они выполняются практически мгновенно.

Редактировать

Я неправильно понял ваш вопрос. Я думал, что вы спрашиваете о том, как общаться между различными страницами в вашем расширении / приложении. То, что вы действительно спрашиваете, это как общаться с веб-сервером.

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

Если вы хотите общаться с веб-сервером («страницы», как вы их называете), вам нужно будет использовать ajax. С ajax вы также заметите строгую модель безопасности Chrome. При нормальных условиях веб-странице разрешается отправлять запросы только на тот же сайт, с которого она была создана. Это называется « тот же источник политики ». поскольку ваше расширение / приложение не размещено (оно упаковано), оно не имеет прав доступа к веб-серверу по умолчанию. Вы, как разработчик, должны будете запросить это право у пользователя. Это можно сделать, заполнив свойство permissions в манифесте расширения. Каждый раз, когда пользователь устанавливает ваше приложение, он должен принять , чтобы вы имели право доступа к определенному веб-серверу.

Читая ваш вопрос, я предполагаю, что вы все еще не очень хорошо знакомы с расширениями Chrome, приложениями, Ajax и политикой в ​​браузере. Я призываю вас читать дальше по этим темам, пока вы разрабатываете свое приложение, чтобы вы могли обеспечить безопасность своих пользователей.

Редактировать 2

Хорошо, значит, вы общаетесь между двумя различными частями вашего приложения, index.html и background.html. Для этого вы можете использовать getBackgroundPage и напрямую вызывать функции, определенные на вашей фоновой странице. Что вы делаете, это следующее: На вашей странице:

window.getSuggestions = function(query) {
  // search database for query

  return ['suggestion1', 'suggestion2'];
};

Затем вы можете вызвать следующую функцию на главной странице (index.html):

var backgroundPage = chrome.extension.getBackgroundPage();
var mySuggestions = backgroundPage.getSuggestions('suggestion');
console.log(mySuggestions);

Это так просто. Вам не нужен ни Ajax, ни sendRequest для этого. Нет асинхронного кода вообще. Вы можете просто вызвать функцию синхронно, и это будет возвращено:

['suggestion1', 'suggestion2']

Я не тестировал это, и я еще не видел никаких данных об этом, но я почти уверен, что этот код намного быстрее, чем API для передачи сообщений или ajax. Я не знал, что вы могли бы использовать XmlHttpRequest в своем добавочном номере, но если это возможно, я ожидаю, что это будет самый медленный способ, поскольку вы фактически делаете сетевой вызов вместо вызова объектов в памяти. Если вы хотите быть уверены в сроках, я предлагаю вам самим сравнить их. Вы можете легко сделать это с помощью Chrome, используя следующий код:

console.time('someID');
// perform heavy operation(s) here.
console.timeEnd('someID');

Время выполнения этой операции будет напечатано на консоли.

Редактировать 3

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...