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

Gre*_*ion 1 javascript google-chrome-extension

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

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

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

chrome.runtime.getManifest().version
Run Code Online (Sandbox Code Playgroud)

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

Xan*_*Xan 5

升级时调用的 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不支持onInstalled尚未(截至2016年11月1日)(编辑:在 FF 52 中已解决),但此功能在每次扩展启动时都可以安全运行。onInstalled只是一个优化。