获得当前和以前的版本号在谷歌Chrome扩展

getting current and previous version number on Google Chrome Extension

本文关键字:谷歌 Chrome 扩展 版本号      更新时间:2023-09-26

我想比较版本号,而我更新我的Chrome扩展。

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

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

chrome.runtime.getManifest().version

我的问题是,当我更新的时候,我如何比较版本,或者我应该从另一个角度看问题?

升级时调用的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 webeextensions不支持onInstalled(截至2016-11-01)(编辑:在FF 52中解决了固定),但是这个函数在每个扩展启动时都可以安全运行。onInstalled只是一个优化