В моей настройке Electron я показываю веб-экран входа в систему после загрузки приложения.Он размещен в BrowserView, который заполняет экранное пространство приложения.При таком подходе я могу отключить nodeIntegration для страницы входа в систему (так как для этого требуется jQuery, который недоступен, когда nodeIntegration имеет значение true), оставив его включенным для моего основного приложения.
Но я заметил задержку с момента закрытия входа в системупосмотреть и когда будет загружено основное приложение.Например, это может занять 2 - 5 секунд.
Чтобы убрать эту задержку, я начал предварительно загружать основное приложение, используя событие did-finish-load.Это означает, что при отображении экрана входа в систему я могу загрузить основное приложение в «фоновом режиме».
Однако я столкнулся с проблемой, когда BrowserView теряет фокус.Это означает, что пользователь должен вручную нажать на вход для входа.Это начало происходить после того, как я добавил вызов к win.loadFile('index.html')
.
. До сих пор мне удавалось смягчить это, передав фокус обратно в BrowserView после загрузки основного приложения.Но это не идеально, поскольку существует короткое время простоя, в течение которого ввод с клавиатуры игнорируется.
Есть ли лучший обходной путь?Мой код ниже.
const win = new BrowserWindow({
width: 605, height: 550,
minWidth: 605, minHeight: 550,
useContentSize: true,
maximizable: false,
title: "My Window"
})
const view = new BrowserView({
webPreferences: {
// Enables support for jQuery and others by disabling nodeIntegration in this BrowserView
nodeIntegration: false,
}
})
win.setBrowserView(view)
view.setAutoResize({ width: true, height: true})
view.setBounds({ x: 0, y: 0, width: win.getContentBounds().width, height: win.getContentBounds().height })
view.webContents.loadURL('my login url')
view.webContents.once('did-finish-load', () => {
// Load the main view in the background. This means it'll be available immediately when the login view closes.
// But it also steals focus from the view so...
win.loadFile('index.html')
// Best fix so far but not perfect
win.webContents.on('did-finish-load', () => view.webContents.focus())
})
view.webContents.on('login-complete-made-up-event', async (event) => {
// Close the login page to show the main view
view.destroy()
// Set the focus onto the main view
win.webContents.focus()
})