355 votes

Comment recharger automatiquement une extension Chrome que je développe ?

J'aimerais que mon extension chrome se recharge chaque fois que j'enregistre un fichier dans le dossier de l'extension, sans avoir à cliquer explicitement sur "reload" dans chrome://extensions/. Est-ce possible ?

Edit : Je suis conscient que je peux actualiser l'intervalle à laquelle Chrome recharge les extensions, ce qui est une solution à mi-chemin, mais je préfère soit faire en sorte que mon éditeur (emacs ou textmate) déclenche sur-save un rechargement ou demander à Chrome de surveiller le répertoire pour les changements.

2 votes

Il semble être plus rapide lorsque le rechargement est déclenché par l'interface utilisateur activée à chrome://flags/#enable-apps-devtool-app.

0 votes

J'ai bifurqué LiveJS pour permettre le rechargement en direct des applications packagées. Il suffit d'inclure le fichier dans votre application et chaque fois que vous enregistrez un fichier, l'application se recharge automatiquement.

0 votes

Où est votre fourchette LiveJS, @Oz Ramos ?

197voto

Arik Points 611

Vous pouvez utiliser " Reloader d'extensions " pour Chrome :

Recharge toutes les extensions déballées en utilisant le bouton de la barre d'outils de l'extension ou en naviguant vers " http://reload.extensions "

Si vous avez déjà développé une extension Chrome, vous avez peut-être voulu automatiser le processus de rechargement de votre extension déballée sans avoir à sans avoir à passer par la page des extensions.

"Extensions Reloader" vous permet de recharger toutes les extensions déballées. en utilisant 2 méthodes :

1 - Le bouton de la barre d'outils de l'extension.

2 - Naviguer vers " http://reload.extensions ".

L'icône de la barre d'outils permet de recharger les extensions déballées en un seul clic.

Le "rechargement par navigation" est destiné à automatiser le processus de rechargement. en utilisant des scripts "post build" - il suffit d'ajouter un browse à " http://reload.extensions " en utilisant Chrome à votre script, et vous aurez une fenêtre Chrome rafraîchie.

Mise à jour : Depuis le 14 janvier 2015, l'extension est en source ouverte et disponible sur GitHub .

5 votes

C'est la meilleure solution jusqu'à présent, mais elle ne permet toujours pas de mettre à jour facilement l'extension chaque fois que je modifie un fichier qu'elle utilise, ce qui est ce que je recherchais idéalement.

2 votes

Merci. Je voulais mentionner que j'utilise PhpStorm et que j'ai ajouté un bouton dans la barre d'outils qui appelle chrome.exe avec l'url "reload.extensions". Chaque fois que je veux tester le code, j'appuie sur ce bouton et Chrome s'ouvre avec l'extension mise à jour.

0 votes

Bon choix. Je suppose que vous pourriez aussi faire un simple script pour faire cet appel quand il y a des changements dans les fichiers utilisés par le script. Je suis quand même surpris que Chrome ne puisse pas le faire tout seul :-P

66voto

Rob W Points 125904

Mise à jour : J'ai ajouté une page d'options, afin que vous n'ayez plus à trouver et modifier manuellement l'ID de l'extension. CRX et le code source sont à https://github.com/Rob--W/Chrome-Extension-Reloader
Mise à jour 2 : Ajout d'un raccourci (voir mon dépôt sur Github).
<em>Le code original, qui comprend le <strong>fonctionnalité de base </strong>est présenté ci-dessous </em>.


Créez une extension, et utilisez le Action du navigateur en conjonction avec la méthode chrome.extension.management pour recharger votre extension décompressée.

Le code ci-dessous ajoute un bouton à Chrome, qui rechargera une extension en cas de clic.

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 : Choisissez une belle icône 48x48, par exemple :
Google Chrome Google Chrome

1 votes

@trusktr La réponse de Scott ne fait que recharger la page d'arrière-plan. Cependant, les deux réponses peuvent être combinées (réponse de Scotts + extension d'aide), afin qu'une extension soit automatiquement rechargée lorsque le fichier d'une extension change. Je déconseille toutefois cette pratique, car les devtools sont fermés lors du rechargement de l'extension. Je manipule souvent une extension de test, et je sauvegarde fréquemment mes modifications, même si la syntaxe est incomplète. Cela ferait planter mon extension, si un véritable auto-rechargement est activé.

0 votes

@RobW Bon point. Je sauvegarde souvent au milieu de l'écriture du code, donc le code va certainement casser le plugin en question.

1 votes

@Sudarshan Vous Proposition de à utiliser chrome.i18n.getMessage("@@extension_id") . Cependant, cela renvoie l'extensionID de l actuel ce qui n'est pas utile car une extension ne peut pas se recharger à l'aide de l'extension management API (après la désactivation, il n'a pas la possibilité de réactiver l'extension).

53voto

Leonardo Ciaccio Points 106

Dans toute fonction ou événement

chrome.runtime.reload();

rechargera votre extension ( docs ). Vous devez également modifier le manifeste.json en ajoutant :

...
"permissions": [ "management" , ...]
...

0 votes

Pour moi cette solution ne fonctionnait que si j'écrivais chrome.runtime.reload() dans le script dans l'index.html où est spécifié dans le fichier manifest de la manière suivante : ** "background" : { "page" : "index.html", ** . Dans mon fichier js content_script, je n'ai pas pu accéder à cette fonction. Je pense que c'est pour des raisons de sécurité.

0 votes

Votre contenu script ne peut pas parler aux API de chrome. Pour que cela fonctionne, vous devez utiliser les messages

0 votes

Quand vous appelez chrome.runtime.reload() Qu'est-ce qui se passe réellement ? Est-ce que plusieurs pages/onglets se rafraîchissent ?

9voto

GmonC Points 8978

Les extensions Chrome ont un système de permission qu'il ne le permettrait pas (certaines personnes de la SO a eu le même problème que vous ), donc leur demander d'"ajouter cette fonctionnalité" ne fonctionnera pas. Il y a un mail de Chromium Extensions Google Groups avec un solution proposée (théorie) en utilisant chrome.extension.getViews() mais il n'est pas non plus garanti que cela fonctionne.

S'il était possible d'ajouter à la manifest.json certaines pages internes de Chrome comme chrome://extensions/ il serait possible de créer un plugin qui interagirait avec l'application Reload et, en utilisant un programme externe comme XRefresh (un plugin Firefox - il y a un Version Chrome en utilisant Ruby et WebSocket), vous obtiendrez exactement ce dont vous avez besoin :

XRefresh est un plugin de navigateur qui rafraîchira la page web actuelle en raison de changement de fichier dans les dossiers sélectionnés. Ce permet d'éditer la page en direct avec votre éditeur HTML/CSS préféré. préféré.

Il n'est pas possible de le faire, mais je pense que vous pouvez utiliser ce même concept d'une manière différente.

Vous pourriez essayer de trouver des solutions tierces à la place qui, après avoir vu des modifications dans un fichier (je ne connais ni emacs ni Textmate, mais dans Emacs il serait possible de lier un appel d'application à l'intérieur d'une action "enregistrer le fichier"), clique simplement sur une coordonnée spécifique d'une application spécifique : dans ce cas, il s'agit de la fonction Reload ancrage de votre extension en développement (vous laissez une fenêtre Chrome ouverte juste pour ce rechargement).

(C'est fou mais ça peut marcher)

7voto

Scott Points 1222

Voici une fonction que vous pouvez utiliser pour surveiller les fichiers à la recherche de modifications, et les recharger si des modifications sont détectées. Elle fonctionne en les interrogeant via AJAX, et en les rechargeant via window.location.reload(). Je suppose que vous ne devriez pas utiliser cette fonction dans un paquet de distribution.

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'));

0 votes

C'est possible, ajoutez : reloadOnChange(chrome.extension.getURL('/manifest.json')) ;

0 votes

J'ai essayé pastebin.com/mXbSPkeu mais l'extension est no mis à jour (entrées du manifeste, contenu script, action du navigateur) (Ubuntu 11.10, Chrome 18). Le site sólo Le fichier mis à jour est la page d'arrière-plan (modifiée console.log les messages s'affichent).

0 votes

"surveiller les fichiers pour les changements, et recharger si des changements sont détectés." Je n'arrive pas à comprendre comment ce système peut savoir qu'un fichier a été modifié ? Aidez-moi à comprendre car cela semble génial !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X