如果扩展的文件更改,则更新 chrome.storage
Update chrome.storage if extension's file changes
我有一个 Chrome extension,它使用 chrome.storage
来跟踪要应用于页面内容的样式表。这些样式表之一是必需的默认样式表,如果用户 chrome.storage
中不存在该文件,我最初会从 Chrome 的扩展文件中加载该文件。这很好用。
但是,我有时会使用不同的规则更新此默认样式表以改进样式。当扩展运行时,它会检查默认样式表是否存在并找到旧版本的样式表 - 因此它不会从扩展的存储中加载任何内容。因此用户仍在使用旧版本的样式表。
在我的本地计算机上,我可以手动清空我的 chrome.storage
并加载新的,但我不能在发布时通过扩展程序执行此操作,因为我不想每次都清空它我的扩展运行的时间我也不知道样式表在 Chrome 的扩展文件中更新的时间。
我可以通过检查两个文件的每个字符,比较它们是否相同,如果相同则加载扩展的样式表来解决这个问题,但这似乎有点矫枉过正并且容易出错。
有没有更简单的方法来更新 chrome.storage
的样式表,仅当更新扩展的样式表而不更改文件名时?
如果你想看我的实现,整个项目都是开源的on GitHub。
有了 nudge from Florian in a chat,我想出了以下解决方案,使用第二个 chrome.storage
space。
我已经在检查用户的 Chrome 存储中是否存在样式表,如果不存在,则从扩展文件中加载样式表。为了使其在更改时自动更新,我现在检查第二个 chrome.storage
space,它在检查是否从 Chrome 的存储中加载样式表时保存版本号。基本做法如下:
// Helper function that checks whether an object is empty or not
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
var stylesheetObj = {}, // Keeps track of all stylesheets
stylesheetVersion = 1; // THIS NUMBER MUST BE CHANGED FOR THE STYLESHEETS TO KNOW TO UPDATE
chrome.storage.sync.get('just-read-stylesheets', function (result) {
// Here 'results' is an object with all stylesheets if it exists
// This keeps track of whether or not the user has the latest stylsheet version
var needsUpdate = false;
// Here I get the user's current stylesheet version
chrome.storage.sync.get('stylesheet-version', function (versionResult) {
// If the user has a version of the stylesheets and it is less than the cufrent one, update it
if(isEmpty(versionResult)
|| versionResult['stylesheet-version'] < stylesheetVersion) {
chrome.storage.sync.set({'stylesheet-version': stylesheetVersion});
needsUpdate = true;
}
if(isEmpty(result) // Not found, so we add our default
|| isEmpty(result["just-read-stylesheets"])
|| needsUpdate) { // Update the default stylesheet if it's on a previous version
// Open the default CSS file and save it to our object
var xhr = new XMLHttpRequest();
xhr.open('GET', chrome.extension.getURL('default-styles.css'), true);
// Code to handle successful GET here
}
xhr.send();
return;
}
// Code to do if no load is necessary here
});
});
这使得为用户更新样式表唯一需要更改的是 stylesheetVersion
,确保它比以前的版本更大。例如,如果我更新样式表并希望用户的版本自动更新,我会将 stylesheetVersion
从 1
更改为 1.1
。
如果你需要更完整的实现,你可以找到JS文件here on GitHub
尝试使用 chrome.storage.sync
并为其 *onChanged*
事件添加侦听器。每当存储发生任何变化时,都会触发该事件。下面是监听保存更改的示例代码:
chrome.storage.onChanged.addListener(function(changes, namespace) {
for (key in changes) {
var storageChange = changes[key];
console.log('Storage key "%s" in namespace "%s" changed. ' +
'Old value was "%s", new value is "%s".',
key,
namespace,
storageChange.oldValue,
storageChange.newValue);
}
});
我有一个 Chrome extension,它使用 chrome.storage
来跟踪要应用于页面内容的样式表。这些样式表之一是必需的默认样式表,如果用户 chrome.storage
中不存在该文件,我最初会从 Chrome 的扩展文件中加载该文件。这很好用。
但是,我有时会使用不同的规则更新此默认样式表以改进样式。当扩展运行时,它会检查默认样式表是否存在并找到旧版本的样式表 - 因此它不会从扩展的存储中加载任何内容。因此用户仍在使用旧版本的样式表。
在我的本地计算机上,我可以手动清空我的 chrome.storage
并加载新的,但我不能在发布时通过扩展程序执行此操作,因为我不想每次都清空它我的扩展运行的时间我也不知道样式表在 Chrome 的扩展文件中更新的时间。
我可以通过检查两个文件的每个字符,比较它们是否相同,如果相同则加载扩展的样式表来解决这个问题,但这似乎有点矫枉过正并且容易出错。
有没有更简单的方法来更新 chrome.storage
的样式表,仅当更新扩展的样式表而不更改文件名时?
如果你想看我的实现,整个项目都是开源的on GitHub。
有了 nudge from Florian in a chat,我想出了以下解决方案,使用第二个 chrome.storage
space。
我已经在检查用户的 Chrome 存储中是否存在样式表,如果不存在,则从扩展文件中加载样式表。为了使其在更改时自动更新,我现在检查第二个 chrome.storage
space,它在检查是否从 Chrome 的存储中加载样式表时保存版本号。基本做法如下:
// Helper function that checks whether an object is empty or not
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
var stylesheetObj = {}, // Keeps track of all stylesheets
stylesheetVersion = 1; // THIS NUMBER MUST BE CHANGED FOR THE STYLESHEETS TO KNOW TO UPDATE
chrome.storage.sync.get('just-read-stylesheets', function (result) {
// Here 'results' is an object with all stylesheets if it exists
// This keeps track of whether or not the user has the latest stylsheet version
var needsUpdate = false;
// Here I get the user's current stylesheet version
chrome.storage.sync.get('stylesheet-version', function (versionResult) {
// If the user has a version of the stylesheets and it is less than the cufrent one, update it
if(isEmpty(versionResult)
|| versionResult['stylesheet-version'] < stylesheetVersion) {
chrome.storage.sync.set({'stylesheet-version': stylesheetVersion});
needsUpdate = true;
}
if(isEmpty(result) // Not found, so we add our default
|| isEmpty(result["just-read-stylesheets"])
|| needsUpdate) { // Update the default stylesheet if it's on a previous version
// Open the default CSS file and save it to our object
var xhr = new XMLHttpRequest();
xhr.open('GET', chrome.extension.getURL('default-styles.css'), true);
// Code to handle successful GET here
}
xhr.send();
return;
}
// Code to do if no load is necessary here
});
});
这使得为用户更新样式表唯一需要更改的是 stylesheetVersion
,确保它比以前的版本更大。例如,如果我更新样式表并希望用户的版本自动更新,我会将 stylesheetVersion
从 1
更改为 1.1
。
如果你需要更完整的实现,你可以找到JS文件here on GitHub
尝试使用 chrome.storage.sync
并为其 *onChanged*
事件添加侦听器。每当存储发生任何变化时,都会触发该事件。下面是监听保存更改的示例代码:
chrome.storage.onChanged.addListener(function(changes, namespace) {
for (key in changes) {
var storageChange = changes[key];
console.log('Storage key "%s" in namespace "%s" changed. ' +
'Old value was "%s", new value is "%s".',
key,
namespace,
storageChange.oldValue,
storageChange.newValue);
}
});