我希望我的Chrome扩展程序每当我在扩展文件夹中保存一个文件时都能重新加载,而无需在chrome://extensions/中显式地单击“重新加载”。 这是可能的吗?
编辑:我知道我可以更新Chrome重新加载扩展程序的时间间隔,这是一种折衷的解决方案,但我宁愿让我的编辑器(emacs或textmate)在保存时触发重新加载或要求Chrome监视目录的更改。
我希望我的Chrome扩展程序每当我在扩展文件夹中保存一个文件时都能重新加载,而无需在chrome://extensions/中显式地单击“重新加载”。 这是可能的吗?
编辑:我知道我可以更新Chrome重新加载扩展程序的时间间隔,这是一种折衷的解决方案,但我宁愿让我的编辑器(emacs或textmate)在保存时触发重新加载或要求Chrome监视目录的更改。
通过浏览器访问"http://reload.extensions"或使用扩展工具栏按钮重新加载所有未打包的扩展程序。
如果你曾经开发过Chrome扩展程序,你可能需要自动化重新加载未打包的扩展程序而不需要通过扩展程序页面进行操作。
"Extensions Reloader" 允许您使用两种方式重新加载所有未打包的扩展程序:
1 - 使用扩展程序工具栏按钮。
2 - 浏览到 "http://reload.extensions"。
工具栏图标可通过单击重新加载未打包的扩展程序。
“浏览器访问重新加载”旨在使用“构建后”脚本自动化重新加载过程—仅需将浏览器访问添加到脚本中的 "http://reload.extensions",您将拥有刷新后的Chrome窗口。
更新:截至2015年1月14日,该扩展已开源并可在GitHub上获取。
http://reload.extensions
来实现与 livereload 完全一样的效果,但是每次修改一个指定的插件文件时都会弹出一个令人讨厌的 Chrome 窗口:P。谢谢! - GabLeRoux更新: 我添加了一个选项页面,这样你就不必再手动查找和编辑扩展程序的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);
});
chrome.i18n.getMessage("@@extension_id")
。但是,这将返回当前扩展的 extensionID,这并不有用,因为扩展无法使用 管理
API 重新加载自己(在禁用后,它没有机会再次启用扩展)。 - Rob W我编写了一个简单的嵌入式脚本,用于实现热重载:
https://github.com/xpl/crx-hotreload
它监控扩展目录中文件的更改。当检测到更改时,它会重新加载扩展并刷新活动选项卡(以重新触发更新后的内容脚本)。
import reloader from 'hot-reload'
来实现某些功能,然后在脚本中使用reloader.check()。 - pixelearth--watch
结合使用效果很好,因为你可以将它放在构建文件夹中,这样它只会在构建过程完成后更新。无需复杂的Webpack后构建命令插件。 - V. Rubinetti在任何函数或事件中
chrome.runtime.reload();
将重新加载您的扩展程序 (文档)。您还需要更改 manifest.json 文件,添加:
...
"permissions": [ "management" , ...]
...
chrome.runtime.reload()
时,实际上会发生什么?多个页面/选项卡是否会刷新? - Alexander Millschrome.runtime.reload()
。 - Alexander Mills我正在使用快捷方式进行重新加载。当我保存文件时,我不想一直重新加载。
因此,我的方法很轻便,您可以保留重新加载功能。
manifest.json
{
...
"background": {
"scripts": [
"src/bg/background.js"
],
"persistent": true
},
"commands": {
"Ctrl+M": {
"suggested_key": {
"default": "Ctrl+M",
"mac": "Command+M"
},
"description": "Ctrl+M."
}
},
...
}
src/bg/background.js
chrome.commands.onCommand.addListener((shortcut) => {
console.log('lets reload');
console.log(shortcut);
if(shortcut.includes("+M")) {
chrome.runtime.reload();
}
})
现在在Chrome浏览器中按下 Ctrl + M 来重新加载。
Alt Tab,Ctrl M,Ctrl R
(重新加载“主世界”页面)。 - Thach Lockevn创建一个WebSocket服务器将消息分发到处理更新的后台脚本。如果您正在使用webpack并且不打算自己处理,可以使用webpack-run-chrome-extension.
您可以创建一个WebSocket服务器来与扩展作为WebSocket客户端(通过window
对象)通信。然后,扩展程序会通过将WebSocket服务器附加到某个监听器机制(如webpack devServer)来监听文件更改。
文件是否更改?将服务器设置为向扩展程序发送请求更新的消息(广播ws消息到客户端),然后扩展程序重新加载,回复“好的,已重新加载”并继续监听新的更改。
使用 ws
作为 WebSocket 服务器。对于文件更改,使用一些监听器/钩子(例如 webpack 的 watchRun
钩子)。客户端部分使用 本地 WebSocket。然后,扩展程序可以将 WebSocket 客户端附加到后台脚本中,以在服务器(由 webpack 托管)和客户端(附加在扩展后台的脚本)之间保持同步。
现在,要使扩展程序重新加载自身,您可以在每次从服务器收到上传请求消息时,在其中调用chrome.runtime.reload()
,或者甚至创建一个“重新加载扩展程序”,使用chrome.management.setEnabled()
(需要清单中的"permissions": ["management"]
)来代替您进行操作。
在理想情况下,像webpack-dev-server
或任何其他 Web 服务器软件都可以本地支持chrome-extension
URLs。在发生这种情况之前,将文件更改代理到您的扩展程序的服务器似乎是目前最好的选择。
另一个解决方案是创建自定义的实时重新加载脚本(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();
}
}
};
web-ext run --target chromium
。chrome.extension.getViews()
,但并不能保证工作。manifest.json
中,例如chrome://extensions/
,那么就可以创建一个插件,该插件将与Reload
锚点进行交互,并使用像XRefresh(Firefox插件 - 有一个使用Ruby和WebSocket的 Chrome版本)这样的外部程序,就可以实现你所需的功能。以下是一个函数,您可以使用它来监视文件的更改,并在检测到更改时重新加载文件。它通过 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'));
console.log
消息确实显示出来)。 - Rob W