Electron loading animation
As far as I know there is no event emitted from app
before ready
(only exception is will-finish-launching
available only on macOS).
Furthermore, you cannot open any BrowserWindow
before app
is ready
, so you should really wait it.
However, if your main application window loading very slow, you can still open a "loading window" before that and switch them when your main window is ready.
const { app, BrowserWindow } = require('electron')
app.on('ready', () => {
let main = null
let loading = new BrowserWindow({show: false, frame: false})
loading.once('show', () => {
main = new BrowserWindow({show: false})
main.webContents.once('dom-ready', () => {
console.log('main loaded')
main.show()
loading.hide()
loading.close()
})
// long loading html
main.loadURL('http://spacecrafts3d.org')
})
loading.loadURL('loding.html')
loading.show()
})
You can use win.on('ready-to-show')
instead of win.webContents.on('dom-ready')
everywhere if you want to eliminate visual flash (but losing some speed)
window.open()
If you want to do the same for BrowserWindow
opened in renderer process by window.open()
, you can use new-window
event of webContents
if nativeWindowOpen
is true
main = new BrowserWindow({
webPreferences: {
nativeWindowOpen: true
}
})
main.webContents.on('new-window', (event, url) => {
// there are more args not used here
event.preventDefault()
const win = new BrowserWindow({show: false})
win.webContents.once('dom-ready', () => {
win.show()
loading.hide() // don't destroy in this case
})
win.loadURL(url)
loading.show()
event.newGuest = win
})
It can be done by displaying a new BrowserWindow displaying the activity loader , until the main app fully loads .
Let's define a createWindow
funtion (as given in docs) which is responsible for loading the main app for the user as :
var loadingwindow = null; // Responsible for creating activity loader function createWindow () { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }) win.loadFile('index.html') loadingwindow.hide() // Used to hide the loading screen when the contents in main app are loaded }
Now , in order to display the loadingwindow
screen , we need to place it in app.on('ready' , callback_fn)
as shows here :
app.on("ready" , () => { loadingwindow = new BrowserWindow({ frame : false, movable : false, }) loadingwindow.loadFile('activity.html') // To load the activity loader html file loadingwindow.show(); })
That's it ! ,
To check if it is working properly , wrap the setTimeout
function over the app.whenReady().then(createWindow)