在Google Chrome扩展程序中获取当前和以前的版本号

时间:2016-11-01 15:04:09

标签: javascript google-chrome-extension

我想在更新Chrome扩展程序时比较版本号。

原因是有一些结构上的变化,我不希望我的用户(已经拥有我的模块)再次添加他们的详细信息。

我知道我可以通过这一行获得当前运行模块的版本号:

chrome.runtime.getManifest().version

我的问题是,在我更新时,如何比较版本,还是应该从另一个角度来看问题?

1 个答案:

答案 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 onInstalled yet(截至2016-11-01)(编辑:已解决在FF 52中修复),但此功能可以安全运行每个扩展开始。 onInstalled只是一种优化。