我想为我的chrome扩展重新加载每次我保存在扩展文件夹中的文件,而不必显式点击“重新加载”在chrome://extensions/。这可能吗?
编辑:我知道我可以更新Chrome重新加载扩展的间隔,这是一个中途的解决方案,但我宁愿让我的编辑器(emacs或textmate)触发保存重新加载或要求Chrome监控目录的变化。
我想为我的chrome扩展重新加载每次我保存在扩展文件夹中的文件,而不必显式点击“重新加载”在chrome://extensions/。这可能吗?
编辑:我知道我可以更新Chrome重新加载扩展的间隔,这是一个中途的解决方案,但我宁愿让我的编辑器(emacs或textmate)触发保存重新加载或要求Chrome监控目录的变化。
当前回答
也许回答得有点晚,但我认为crxreload可能对你有用。这是我在开发时尝试重新加载保存工作流的结果。
其他回答
更新:我已经添加了一个选项页面,这样你就不必手动查找和编辑扩展的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图标,例如:
我已经做了一个简单的可嵌入脚本热重载:
https://github.com/xpl/crx-hotreload
它监视扩展名目录中的文件更改。当检测到更改时,它重新加载扩展并刷新活动选项卡(以重新触发更新的内容脚本)。
通过检查文件的时间戳来工作 支持嵌套目录 在生产配置中自动禁用自身
我主要在Firefox中开发,其中web-ext运行会在文件更改后自动重新加载扩展。一旦准备就绪,我会在Chrome中进行最后一轮测试,以确保没有Firefox中没有出现的任何问题。
如果你想主要在Chrome上开发,并且不想安装任何第三方扩展,那么另一个选择是在扩展的文件夹中创建一个test.html文件,并添加一堆SSCCE。然后,该文件使用一个正常的<script>标记来注入扩展脚本。
您可以使用它进行95%的测试,然后当您想在现场测试它时手动重新加载扩展。
这并不能完全重现扩展所运行的环境,但对于许多简单的事情来说已经足够好了。
感谢@GmonC和@Arik和一些空闲时间,我设法让它工作。我必须更改两个文件才能使其工作。
(1)为该应用程序安装LiveReload和Chrome扩展。 这将在文件更改时调用一些脚本。
打开<LiveReloadInstallDir>\ wrapped \backend\res\livereload.js
(3)将509行改为
This.window.location.href = "http://reload.extensions";
(4)现在安装另一个扩展Extensions Reloader,它有有用的链接处理程序,重新加载所有的开发扩展导航到“http://reload.extensions”
现在以这种方式更改扩展的background.min.js
if ((d.installType = = "发展")(&& d.enabled = = true) && (d.name != Reloader扩展”))
替换为
if((d.installType=="development")&&(d.enabled==true)&&(d.name!="Extensions Reloader")&&(d.name!="LiveReload"))
打开LiveReload应用程序,隐藏扩展重新加载按钮,并通过单击工具栏中的按钮激活LiveReload扩展,您现在将重新加载页面和每个文件更改扩展,同时使用所有其他好东西从LiveReload (css重新加载,图像重新加载等)
唯一不好的是,你将不得不重复在每次扩展更新上更改脚本的过程。为避免更新,请将扩展添加为未打包的扩展。
当我有更多的时间来处理这个时,我可能会创建一个扩展,消除对这两个扩展的需求。
在那之前,我正在做我的扩展Projext Axeman
博士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,它做了我上面计划的。