Gre*_*ion 1 javascript google-chrome-extension
我想在更新 Chrome 扩展程序时比较版本号。
原因是有一些结构上的变化,我不希望我的用户(已经拥有我的模块)再次添加他们的详细信息。
我知道我可以通过这一行获取当前正在运行的模块的版本号:
chrome.runtime.getManifest().version
Run Code Online (Sandbox Code Playgroud)
我的问题是,在我更新时,如何比较版本,或者我应该从另一个角度看待问题?
升级时调用的 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}`);
}
});
Run Code Online (Sandbox Code Playgroud)
你可以让你的逻辑依赖于它,但它很脆弱。您的存储架构不太可能更改每个版本,并且您需要考虑不会进行每一次升级而是跳转版本的用户(例如,机器长时间离线)。此外,没有用于比较版本字符串的内置函数。
最好将存储架构的版本与数据本身一起存储,并触发从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);
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,对于storageSchema旧版本中未使用的案例,您将需要一些特殊的逻辑;否则,此代码将提供默认值(因为它不在存储中)并且不会发生迁移。所以最好在你的第一个版本公开之前实现这个。
有一点要注意的是,火狐WebExtensions不支持(编辑:在 FF 52 中已解决),但此功能在每次扩展启动时都可以安全运行。onInstalled尚未(截至2016年11月1日)onInstalled只是一个优化。