Как автоматически перезагрузить расширение Chrome, которое я разрабатываю? - PullRequest
232 голосов
/ 03 июня 2010

Я бы хотел, чтобы мое расширение chrome перезагружалось каждый раз, когда я сохраняю файл в папке расширения, без необходимости явно нажимать «перезагрузить» в chrome: // extensions /. Возможно ли это?

Редактировать: я знаю, что могу обновить интервал , с которым Chrome перезагружает расширения, что является промежуточным решением, но я бы предпочел, чтобы мой редактор (emacs или textmate) запускался -сохранить перезагрузку или попросить Chrome отслеживать каталог на предмет изменений.

Ответы [ 26 ]

146 голосов
/ 07 октября 2012

Вы можете использовать " Расширение Reloader " для Chrome:

Перезагружает все распакованные расширения с помощью кнопки на панели инструментов расширения или перейдя к «http://reload.extensions"

».

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

«Перегрузчик расширений» позволяет перезагрузить все распакованные расширения. используя 2 способа:

1 - кнопка на панели инструментов расширения.

2 - просмотр "http://reload.extensions".

Значок на панели инструментов перезагрузит распакованные расширения одним щелчком мыши.

«Перезагрузка путем просмотра» предназначена для автоматизации процесса перезагрузки. используя сценарии "post build" - просто добавьте обзор к "http://reload.extensions", используя Chrome в своем скрипте, и вы обновленное окно Chrome.

Обновление: По состоянию на 14 января 2015 года расширение является открытым исходным кодом и доступно на GitHub .

52 голосов
/ 10 марта 2012

Обновление : я добавил страницу параметров, чтобы вам больше не приходилось вручную искать и редактировать идентификатор расширения. CRX и исходный код: https://github.com/Rob--W/Chrome-Extension-Reloader
Обновление 2: добавлен ярлык (см. Мой репозиторий на Github).
Оригинальный код, который включает базовую функциональность , показан ниже .


Создайте расширение и используйте метод Browser Action в сочетании с chrome.extension.management API для перезагрузки распакованного расширения.

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

manifest.json

{
    "name": "Chrome Extension Reloader",
    "version": "1.0",
    "manifest_version": 2,
    "background": {"scripts": ["bg.js"] },
    "browser_action": {
        "default_icon": "icon48.png",
        "default_title": "Reload extension"
    },
    "permissions": ["management"]
}

bg.js

var id = "<extension_id here>";
function reloadExtension(id) {
    chrome.management.setEnabled(id, false, function() {
        chrome.management.setEnabled(id, true);
    });
}
chrome.browserAction.onClicked.addListener(function(tab) {
    reloadExtension(id);
});

icon48.png: выберите любой красивый значок 48x48, например:
Google Chrome http://icons.iconarchive.com/icons/google/chrome/48/Google-Chrome-icon.png Google Chrome

38 голосов
/ 23 мая 2013

в любой функции или событии

chrome.runtime.reload();

перезагрузит ваше расширение ( документы ). Вам также нужно изменить файл manifest.json , добавив:

...
"permissions": [ "management" , ...]
...
35 голосов
/ 06 ноября 2016

Я сделал простой встраиваемый скрипт, выполняющий горячую перезагрузку:

https://github.com/xpl/crx-hotreload

Отслеживает изменения файлов в каталоге расширения. При обнаружении изменения он перезагружает расширение и обновляет активную вкладку (для повторного запуска обновленных скриптов содержимого).

  • Работает, проверяя временные метки файлов
  • Поддерживает вложенные каталоги
  • Автоматически отключает себя в рабочей конфигурации
10 голосов
/ 08 апреля 2015

Другим решением было бы создание собственного сценария livereload (extension-reload.js):

// Reload client for Chrome Apps & Extensions.
// The reload client has a compatibility with livereload.
// WARNING: only supports reload command.

var LIVERELOAD_HOST = 'localhost:';
var LIVERELOAD_PORT = 35729;
var connection = new WebSocket('ws://' + LIVERELOAD_HOST + LIVERELOAD_PORT + '/livereload');

connection.onerror = function (error) {
  console.log('reload connection got error:', error);
};

connection.onmessage = function (e) {
  if (e.data) {
    var data = JSON.parse(e.data);
    if (data && data.command === 'reload') {
      chrome.runtime.reload();
    }
  }
};

Этот скрипт подключается к серверу livereload с помощью веб-сокетов. Затем он выдаст вызов chrome.runtime.reload () после перезагрузки сообщения из livereload. Следующим шагом будет добавление этого сценария для запуска в качестве фонового сценария в файл manifest.json и вуаля!

Примечание: это не мое решение. Я просто публикую это. Я нашел это в сгенерированном коде Генератор расширений Chrome (Отличный инструмент!). Я публикую это здесь, потому что это может помочь.

9 голосов
/ 09 июня 2010

Chrome Extensions имеют систему разрешений , которая не позволяла бы ей (некоторые люди в SO имели ту же проблему, что и вы ), поэтому попросили их "добавить эту функцию" не будет работать ИМО. Существует электронное письмо от Chromium Extensions Google Groups с предложенным решением (теория) с использованием chrome.extension.getViews(), но также не гарантируется, что оно будет работать.

Если бы можно было добавить к manifest.json некоторые внутренние страницы Chrome, такие как chrome://extensions/, можно было бы создать плагин, который взаимодействовал бы с якорем Reload, и с использованием внешней программы, такой как * 1013. * XRefresh (плагин Firefox - есть версия Chrome с использованием Ruby и WebSocket), вы получите именно то, что вам нужно:

XRefresh - плагин для браузера, который обновит текущую веб-страницу из-за изменение файла в выбранных папках. это позволяет сделать живую страницу редактирование с вашим любимым HTML / CSS редактор.

Это невозможно сделать, но я думаю, что вы можете использовать эту же концепцию по-другому.

Вместо этого вы можете попытаться найти сторонние решения, которые, увидев изменения в файле (я не знаю ни emacs, ни Textmate, но в Emacs можно было бы связать вызов приложения с действием "сохранить файл"). ), просто щелкает в определенной координате конкретного приложения: в этом случае это привязка Reload от вашего расширения в разработке (вы оставляете окна Chrome открытыми только для этой перезагрузки).

(Сумасшедший, но это может сработать)

7 голосов
/ 18 апреля 2012

Вот функция, которую вы можете использовать для просмотра файлов на предмет изменений и перезагрузки в случае обнаружения изменений. Это работает путем опроса их через AJAX и перезагрузки через window.location.reload (). Я полагаю, вы не должны использовать это в дистрибутиве.

function reloadOnChange(url, checkIntervalMS) {
    if (!window.__watchedFiles) {
        window.__watchedFiles = {};
    }

    (function() {
        var self = arguments.callee;
        var xhr = new XMLHttpRequest();

        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                if (__watchedFiles[url] &&
                    __watchedFiles[url] != xhr.responseText) {
                    window.location.reload();
                } else {
                    __watchedFiles[url] = xhr.responseText
                    window.setTimeout(self, checkIntervalMS || 1000);
                }
            }
        };

        xhr.open("GET", url, true);
        xhr.send();
    })();
}

reloadOnChange(chrome.extension.getURL('/myscript.js'));
6 голосов
/ 30 июля 2015

Может быть, я немного опоздал на вечеринку, но я решил это для себя, создав https://chrome.google.com/webstore/detail/chrome-unpacked-extension/fddfkmklefkhanofhlohnkemejcbamln

Он работает путем перезагрузки страницы chrome://extensions, когда file.change события поступают через веб-сокеты.

Пример генерации события file.change при изменении файла в папке расширения на основе Gulp можно найти здесь: https://github.com/robin-drexler/chrome-extension-auto-reload-watcher

Зачем перезагружать всю вкладку вместо того, чтобы просто использовать API управления расширениями для перезагрузки / повторного включения расширений? В настоящее время отключение и включение расширений снова приводит к закрытию любого открытого окна проверки (журнал консоли и т. Д.), Что, по моему мнению, слишком раздражает во время активной разработки.

3 голосов
/ 30 августа 2013

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

3 голосов
/ 09 июня 2010

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

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

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