Chrome 后台脚本中的扩展 Firebase 不会始终加载
Chrome extension Firebase in background script wont always load
我正在尝试使用 Google Firebase 构建一个 Chrome 扩展以进行身份验证,我正在使用 Web 包来构建我的项目,
Firebase 正在后台脚本中使用。
在第一次初始化或脚本休眠时,Firebase returns 用户为 null 并需要一些时间来读取当前用户,因此它 returns 用户为 null。
问题是如何加载 Firebase 然后发出请求,这样我就不会得到 null?
我的代码中的一些片段
const getUser = async (): Promise<firebase.User> =>
new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
{ message: MESSAGES.getCurrentUser },
(user: firebase.User) => {
if (user) resolve(user);
reject();
}
);
});
并在后台脚本中
import firebase from "firebase/app";
import "firebase/auth";
firebase.initializeApp(firebaseConfig);
chrome.runtime.onMessage.addListener(
(request: Request, sender, sendResponse) => {
switch (message) {
case MESSAGES.logOut:
logOut(sendResponse);
break;
case MESSAGES.getCurrentUser:
getCurrentUser(sendResponse);
break;
break;
}
return true;
}
);
const getCurrentUser = async (sendResponse: (response?: any) => void) => {
const user = await firebase.auth().currentUser;
sendResponse(user);
};
我的清单文件
{
"short_name": "",
"name": "",
"manifest_version": 3,
"version": "0.2.0",
"icons": {
"16": "logo192.png",
"48": "logo192.png",
"128": "logo192.png"
},
"action": {
"default_popup": "popup.html"
},
"permissions": ["activeTab", "storage", "identity", "downloads"],
"options_page": "options.html",
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
经过相当多的研究发现 chrome 会在不使用后台脚本时关闭后台脚本,当您再次需要后台脚本时,它会从头开始加载 firebase,并在此加载中检查令牌而此时 firebase return 对当前用户为 null。
添加了更多逻辑来解决这个问题。
我正在尝试使用 Google Firebase 构建一个 Chrome 扩展以进行身份验证,我正在使用 Web 包来构建我的项目, Firebase 正在后台脚本中使用。
在第一次初始化或脚本休眠时,Firebase returns 用户为 null 并需要一些时间来读取当前用户,因此它 returns 用户为 null。
问题是如何加载 Firebase 然后发出请求,这样我就不会得到 null?
我的代码中的一些片段
const getUser = async (): Promise<firebase.User> =>
new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
{ message: MESSAGES.getCurrentUser },
(user: firebase.User) => {
if (user) resolve(user);
reject();
}
);
});
并在后台脚本中
import firebase from "firebase/app";
import "firebase/auth";
firebase.initializeApp(firebaseConfig);
chrome.runtime.onMessage.addListener(
(request: Request, sender, sendResponse) => {
switch (message) {
case MESSAGES.logOut:
logOut(sendResponse);
break;
case MESSAGES.getCurrentUser:
getCurrentUser(sendResponse);
break;
break;
}
return true;
}
);
const getCurrentUser = async (sendResponse: (response?: any) => void) => {
const user = await firebase.auth().currentUser;
sendResponse(user);
};
我的清单文件
{
"short_name": "",
"name": "",
"manifest_version": 3,
"version": "0.2.0",
"icons": {
"16": "logo192.png",
"48": "logo192.png",
"128": "logo192.png"
},
"action": {
"default_popup": "popup.html"
},
"permissions": ["activeTab", "storage", "identity", "downloads"],
"options_page": "options.html",
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
经过相当多的研究发现 chrome 会在不使用后台脚本时关闭后台脚本,当您再次需要后台脚本时,它会从头开始加载 firebase,并在此加载中检查令牌而此时 firebase return 对当前用户为 null。 添加了更多逻辑来解决这个问题。