我想在更新Chrome扩展程序时比较版本号。
原因是有一些结构上的变化,我不希望我的用户(已经拥有我的模块)再次添加他们的详细信息。
我知道我可以通过这一行获得当前运行模块的版本号:
chrome.runtime.getManifest().version
我的问题是,在我更新时,如何比较版本,还是应该从另一个角度来看问题?
答案 0 :(得分:3)
升级时调用的API为chrome.runtime.onInstalled
。
chrome.runtime.onInstalled.addListener(details => {
if (details.reason === "update") {
let newVersion = chrome.runtime.getManifest().version;
console.log(`Updated from ${details.previousVersion} to ${newVersion}`);
}
});
你可以让你的逻辑依赖于它,但它很脆弱。您的存储架构不可能更改每个版本,并且您需要考虑不执行每次升级但跳转版本的用户(例如,计算机长时间处于脱机状态)。此外,没有内置函数来比较版本字符串。
将存储架构的版本与数据本身一起存储会更好,并从onInstalled
触发数据迁移。
var defaults = {
someData: "reasonableDefault",
/* ... */
storageSchema: 5 // Increment this when data format changes
};
chrome.runtime.onInstalled.addListener(details => {
if (details.reason === "update") {
migrateData(doSomeInitialization);
}
});
function migrateData(callback) {
// This pulls stored values, falling back to defaults, if none
chrome.storage.local.get(defaults, data => {
let migrated = false;
while (!migrated) {
switch (data.storageSchema) {
case 1:
/* modify data to migrate from 1 to 2 */
data.storageSchema = 2;
break;
/* ... */
case 4:
/* modify data to migrate from 4 to 5 */
data.storageSchema = 5;
break;
case defaults.storageSchema: // Expected; we're done migrating
migrated = true;
break;
default:
throw new Error(`Unrecognized storage schema ${data.storageSchema}!`);
}
}
chrome.storage.local.set(data, callback);
});
}
请注意,在旧版本中未使用storageSchema
的案例需要一些特殊逻辑;否则,此代码将提供默认值(因为它不在存储中),并且不会进行迁移。因此,在第一个版本公开之前,最好先实现此。
需要注意的一点是Firefox WebExtensions don't support (编辑:已解决在FF 52中修复),但此功能可以安全运行每个扩展开始。 onInstalled
yet(截至2016-11-01)onInstalled
只是一种优化。