我想为我的chrome扩展重新加载每次我保存在扩展文件夹中的文件,而不必显式点击“重新加载”在chrome://extensions/。这可能吗?
编辑:我知道我可以更新Chrome重新加载扩展的间隔,这是一个中途的解决方案,但我宁愿让我的编辑器(emacs或textmate)触发保存重新加载或要求Chrome监控目录的变化。
我想为我的chrome扩展重新加载每次我保存在扩展文件夹中的文件,而不必显式点击“重新加载”在chrome://extensions/。这可能吗?
编辑:我知道我可以更新Chrome重新加载扩展的间隔,这是一个中途的解决方案,但我宁愿让我的编辑器(emacs或textmate)触发保存重新加载或要求Chrome监控目录的变化。
当前回答
刚刚发现了一个新的基于grunt的项目,它提供了引导,脚手架,一些自动预处理功能,以及自动重新加载(不需要交互)。
从Websecurify引导您的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,它做了我上面计划的。
在任何场合或事件中
chrome.runtime.reload();
将重新加载您的扩展(docs)。您还需要更改舱单。Json文件,添加:
...
"permissions": [ "management" , ...]
...
也许我有点晚了,但我已经通过创建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来重新加载/重新启用扩展?目前禁用和启用扩展会再次导致任何打开的检查窗口(控制台日志等)关闭,我发现在活动开发期间这太烦人了。
正如文档中提到的:下面的命令行将重新加载应用程序
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --load-and-launch-app=[path to the app ]
所以我只是创建了一个shell脚本,并从gulp调用该文件。超级简单:
var exec = require('child_process').exec;
gulp.task('reload-chrome-build',function(cb){
console.log("reload");
var cmd="./reloadchrome.sh"
exec(cmd,function (err, stdout, stderr) {
console.log("done: "+stdout);
cb(err);
}
);});
在脚本上运行必要的监视命令,并在需要时调用重载任务。干净,简单。
刚刚发现了一个新的基于grunt的项目,它提供了引导,脚手架,一些自动预处理功能,以及自动重新加载(不需要交互)。
从Websecurify引导您的Chrome扩展