我想为我的chrome扩展重新加载每次我保存在扩展文件夹中的文件,而不必显式点击“重新加载”在chrome://extensions/。这可能吗?

编辑:我知道我可以更新Chrome重新加载扩展的间隔,这是一个中途的解决方案,但我宁愿让我的编辑器(emacs或textmate)触发保存重新加载或要求Chrome监控目录的变化。


当前回答

博士TL;

创建一个WebSocket服务器,该服务器将消息分派给后台脚本,以处理更新。如果你正在使用webpack,不打算自己做,webpack-run-chrome-extension可以帮助你。

回答

您可以创建一个WebSocket服务器来作为WebSocket客户端与扩展通信(通过窗口对象)。然后,扩展将通过将WebSocket服务器附加到一些侦听器机制(如webpack devServer)来侦听文件更改。

文件改变了吗?设置服务器向扩展发送请求更新的消息(将ws消息广播到客户机)。扩展然后重新加载,回复“ok,重新加载”,并保持监听新的变化。

Plan

设置WebSocket服务器(用于分发更新请求) 找一个可以告诉你文件什么时候改变的服务(webpack/其他捆绑软件) 当发生更新时,向客户端发送请求更新的消息 设置WebSocket客户端(接收更新请求) 重新加载扩展

How

对于WebSocket服务器,使用ws。对于文件更改,使用一些监听器/钩子(如webpack的watchRun钩子)。对于客户端部分,使用本地WebSocket。然后扩展可以将WebSocket客户端附加到后台脚本上,以保持服务器(由webpack托管)和客户端(附加在扩展后台的脚本)之间的持久同步。

现在,为了让扩展重新加载自己,你可以在每次上传请求消息来自服务器时调用chrome.runtime.reload(),或者甚至创建一个“重新加载扩展”来为你做这件事,使用chrome.management.setEnabled()(需要“权限”:["management"]在清单中)。

在理想的情况下,像webpack-dev-server这样的工具或任何其他web服务器软件都可以提供对chrome扩展url的本地支持。在此之前,使用服务器代理扩展名的文件更改似乎是目前为止的最佳选择。

可用的开源替代方案

如果你正在使用webpack并且不想自己创建它,我做了webpack-run-chrome-extension,它做了我上面计划的。

其他回答

更新:我已经添加了一个选项页面,这样你就不必手动查找和编辑扩展的ID了。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图标,例如:

也许回答得有点晚,但我认为crxreload可能对你有用。这是我在开发时尝试重新加载保存工作流的结果。

这不能直接完成。对不起。

如果你想把它作为一个功能,你可以在http://crbug.com/new上请求它

也许我有点晚了,但我已经通过创建https://chrome.google.com/webstore/detail/chrome-unpacked-extension/fddfkmklefkhanofhlohnkemejcbamln解决了这个问题

它通过重新加载chrome://extensions页面,每当文件。变更事件是通过websocket传入的。

一个基于gulp的如何发出文件的示例。扩展文件夹中的文件更改时的更改事件可以在这里找到:https://github.com/robin-drexler/chrome-extension-auto-reload-watcher

为什么要重新加载整个标签,而不是仅仅使用扩展管理api来重新加载/重新启用扩展?目前禁用和启用扩展会再次导致任何打开的检查窗口(控制台日志等)关闭,我发现在活动开发期间这太烦人了。

作者推荐该webpack插件的下一个版本:https://github.com/rubenspgcavalcante/webpack-extension-reloader。这对我来说很有效。