アップグレード時に呼び出される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}`);
}
});
あなたのロジックをそれに依存させることはできますが、脆弱です。ストレージスキーマはすべてのバージョンを変更する可能性は低く、アップグレードは1回ではなく、バージョンを飛ばしてはいけないユーザー(たとえば、長い間マシンがオフラインだったユーザー)を考慮する必要があります。また、バージョン文字列を比較する組み込み関数もありません。
データスキーマのバージョンをデータ自体とともに保存し、データ移行を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
が古いバージョンでは使用されなかった場合のために、いくつかの特別なロジックが必要になります注。それ以外の場合、このコードはデフォルト値を提供します(記憶域にないため)。マイグレーションは行われません。最初のバージョンが公開される前にを実装するのが最善です。注意すべき
ことの一つは、(2016年11月1日現在)というFirefoxのWebExtensions don't support onInstalled
yet(編集:FF 52で修正された決議)ですが、この機能は、すべての拡張開始上で実行しても安全です。 onInstalled
は単なる最適化です。
出典
2016-11-01 16:10:01
Xan
うわー、それは非常に便利で便利でした!どうもありがとうございました! – Gregion
@Gregion Firefoxの移植性に関する注意を追加しました – Xan