0

我的 MV3 扩展中有如下代码:

import _ from 'lodash'; 

const storageKey = 'state';
let state;
(async () => {
  state = await chrome.storage.local.get(storageKey);
  listener();
})();

const update = async (data) => {
  await chrome.storage.local.set({[storageKey]: data});
}

let lastPick;
const listener = async () => {
  const pick = _.pick(state, ...);
  if (_.isEqual(pick, lastPick))
    return;
  lastPick = pick;
  ...
  // do some stuff
}

chrome.storage.onChanged.addListener((changes, area) => {
  if (area !== 'local' || !(storageKey in changes))
    return;
  const {newValue} = changes[storageKey];
  state = newValue;
  listener();
});

chrome.tabs.onActivated.addListener(async (data) => {
  ...
  update(...);
  ...
  update(...);
  ...
  update(...);
});

使用经典的 Manifest V2 扩展,我可以确定 of 的值lastPick将始终通过listener调用(这又由多个调用引起)保持不变,因此不会破坏其中的update“某些东西”逻辑。listener

但是 Manifest V3,或者更准确地说,它的服务工作者呢?我可以确信上述逻辑不会在那里被打破吗?

4

1 回答 1

-2
Do not register listeners asynchronously, as they will not be properly triggered.

https://developer.chrome.com/docs/extensions/mv3/service_workers/#:~:text=Do%20not%20register%20listeners%20asynchronously%2C%20as%20they%20will%20not%20be%20properly%20triggered。

希望它对你有用。

于 2021-12-21T08:45:34.170 回答