mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-15 21:32:49 +00:00
perf: 优化窗口加载速度
This commit is contained in:
parent
56e52a7dfd
commit
928145214d
208
electron/electron.js
vendored
208
electron/electron.js
vendored
@ -51,6 +51,7 @@ let screenshotObj = null,
|
|||||||
screenshotKey = null;
|
screenshotKey = null;
|
||||||
|
|
||||||
let childWindow = [],
|
let childWindow = [],
|
||||||
|
preloadWindow = null,
|
||||||
webTabWindow = null,
|
webTabWindow = null,
|
||||||
webTabView = [],
|
webTabView = [],
|
||||||
webTabHeight = 38;
|
webTabHeight = 38;
|
||||||
@ -58,9 +59,14 @@ let childWindow = [],
|
|||||||
let showState = {},
|
let showState = {},
|
||||||
onShowWindow = (win) => {
|
onShowWindow = (win) => {
|
||||||
if (typeof showState[win.webContents.id] === 'undefined') {
|
if (typeof showState[win.webContents.id] === 'undefined') {
|
||||||
showState[win.webContents.id] = true
|
try {
|
||||||
win.setBackgroundColor('rgba(255, 255, 255, 0)')
|
showState[win.webContents.id] = true
|
||||||
win.show();
|
win.setBackgroundColor('rgba(255, 255, 255, 0)')
|
||||||
|
win.show();
|
||||||
|
} catch (e) {
|
||||||
|
showState[win.webContents.id] = false
|
||||||
|
// loger.error(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,24 +141,6 @@ function createMainWindow() {
|
|||||||
nativeWindowOpen: true
|
nativeWindowOpen: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const originalUA = mainWindow.webContents.session.getUserAgent() || mainWindow.webContents.getUserAgent()
|
|
||||||
mainWindow.webContents.setUserAgent(originalUA + " MainTaskWindow/" + process.platform + "/" + os.arch() + "/1.0");
|
|
||||||
mainWindow.webContents.setWindowOpenHandler(({url}) => {
|
|
||||||
if (allowedCalls.test(url)) {
|
|
||||||
return {action: 'allow'}
|
|
||||||
}
|
|
||||||
utils.onBeforeOpenWindow(mainWindow.webContents, url).then(() => {
|
|
||||||
openExternal(url)
|
|
||||||
})
|
|
||||||
return {action: 'deny'}
|
|
||||||
})
|
|
||||||
electronMenu.webContentsMenu(mainWindow.webContents)
|
|
||||||
|
|
||||||
if (devloadUrl) {
|
|
||||||
mainWindow.loadURL(devloadUrl).then(_ => { }).catch(_ => { })
|
|
||||||
} else {
|
|
||||||
mainWindow.loadFile('./public/index.html').then(_ => { }).catch(_ => { })
|
|
||||||
}
|
|
||||||
|
|
||||||
mainWindow.on('page-title-updated', (event, title) => {
|
mainWindow.on('page-title-updated', (event, title) => {
|
||||||
if (title == "index.html") {
|
if (title == "index.html") {
|
||||||
@ -171,16 +159,35 @@ function createMainWindow() {
|
|||||||
mainWindow.on('close', event => {
|
mainWindow.on('close', event => {
|
||||||
if (!willQuitApp) {
|
if (!willQuitApp) {
|
||||||
utils.onBeforeUnload(event, mainWindow).then(() => {
|
utils.onBeforeUnload(event, mainWindow).then(() => {
|
||||||
if (process.platform === 'win32') {
|
if (['darwin', 'win32'].includes(process.platform)) {
|
||||||
mainWindow.hide()
|
mainWindow.hide();
|
||||||
} else if (process.platform === 'darwin') {
|
|
||||||
mainWindow.hide()
|
|
||||||
} else {
|
} else {
|
||||||
app.quit()
|
app.quit();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 设置 UA
|
||||||
|
const originalUA = mainWindow.webContents.session.getUserAgent() || mainWindow.webContents.getUserAgent()
|
||||||
|
mainWindow.webContents.setUserAgent(originalUA + " MainTaskWindow/" + process.platform + "/" + os.arch() + "/1.0");
|
||||||
|
|
||||||
|
// 新窗口处理
|
||||||
|
mainWindow.webContents.setWindowOpenHandler(({url}) => {
|
||||||
|
if (allowedCalls.test(url)) {
|
||||||
|
return {action: 'allow'}
|
||||||
|
}
|
||||||
|
utils.onBeforeOpenWindow(mainWindow.webContents, url).then(() => {
|
||||||
|
openExternal(url)
|
||||||
|
})
|
||||||
|
return {action: 'deny'}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 设置右键菜单
|
||||||
|
electronMenu.webContentsMenu(mainWindow.webContents)
|
||||||
|
|
||||||
|
// 加载地址
|
||||||
|
utils.loadUrlOrFile(mainWindow, devloadUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,6 +259,41 @@ function createUpdaterWindow(updateTitle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建预窗口
|
||||||
|
*/
|
||||||
|
function preCreateChildWindow() {
|
||||||
|
if (preloadWindow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const browser = new BrowserWindow({
|
||||||
|
width: 360,
|
||||||
|
height: 360,
|
||||||
|
minWidth: 360,
|
||||||
|
minHeight: 360,
|
||||||
|
center: true,
|
||||||
|
show: false,
|
||||||
|
parent: mainWindow,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
webPreferences: {
|
||||||
|
preload: path.join(__dirname, 'electron-preload.js'),
|
||||||
|
webSecurity: true,
|
||||||
|
nodeIntegration: true,
|
||||||
|
contextIsolation: true,
|
||||||
|
nativeWindowOpen: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
browser.addListener('closed', () => {
|
||||||
|
preloadWindow = null;
|
||||||
|
})
|
||||||
|
|
||||||
|
utils.loadUrlOrFile(browser, devloadUrl, 'preload')
|
||||||
|
|
||||||
|
preloadWindow = browser;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建子窗口
|
* 创建子窗口
|
||||||
* @param args {path, hash, title, titleFixed, force, userAgent, config, webPreferences}
|
* @param args {path, hash, title, titleFixed, force, userAgent, config, webPreferences}
|
||||||
@ -265,18 +307,18 @@ function createChildWindow(args) {
|
|||||||
args = {path: args, config: {}}
|
args = {path: args, config: {}}
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = args.name || "auto_" + utils.randomString(6);
|
const name = args.name || "auto_" + utils.randomString(6);
|
||||||
let item = childWindow.find(item => item.name == name);
|
const wind = childWindow.find(item => item.name == name);
|
||||||
let browser = item ? item.browser : null;
|
let browser = wind ? wind.browser : null;
|
||||||
if (browser) {
|
if (browser) {
|
||||||
browser.focus();
|
browser.focus();
|
||||||
if (args.force === false) {
|
if (args.force === false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let config = args.config || {};
|
const config = args.config || {};
|
||||||
let webPreferences = args.webPreferences || {};
|
const webPreferences = args.webPreferences || {};
|
||||||
browser = new BrowserWindow(Object.assign({
|
const options = Object.assign({
|
||||||
width: 1280,
|
width: 1280,
|
||||||
height: 800,
|
height: 800,
|
||||||
minWidth: 360,
|
minWidth: 360,
|
||||||
@ -292,7 +334,26 @@ function createChildWindow(args) {
|
|||||||
contextIsolation: true,
|
contextIsolation: true,
|
||||||
nativeWindowOpen: true
|
nativeWindowOpen: true
|
||||||
}, webPreferences),
|
}, webPreferences),
|
||||||
}, config))
|
}, config)
|
||||||
|
|
||||||
|
if (preloadWindow && Object.keys(webPreferences).length === 0) {
|
||||||
|
// 使用预加载窗口
|
||||||
|
browser = preloadWindow;
|
||||||
|
preloadWindow = null;
|
||||||
|
setTimeout(() => onShowWindow(browser), 300)
|
||||||
|
browser.once('resize', () => onShowWindow(browser))
|
||||||
|
browser.setSize(options.width, options.height);
|
||||||
|
browser.setMinimumSize(options.minWidth, options.minHeight);
|
||||||
|
browser.center();
|
||||||
|
browser.setParentWindow(options.parent);
|
||||||
|
browser.setAutoHideMenuBar(options.autoHideMenuBar);
|
||||||
|
browser.removeAllListeners("closed");
|
||||||
|
console.log("use preload window")
|
||||||
|
} else {
|
||||||
|
// 创建新窗口
|
||||||
|
browser = new BrowserWindow(options)
|
||||||
|
console.log("create new window")
|
||||||
|
}
|
||||||
|
|
||||||
browser.on('page-title-updated', (event, title) => {
|
browser.on('page-title-updated', (event, title) => {
|
||||||
if (title == "index.html" || config.titleFixed === true) {
|
if (title == "index.html" || config.titleFixed === true) {
|
||||||
@ -311,13 +372,16 @@ function createChildWindow(args) {
|
|||||||
browser.on('close', event => {
|
browser.on('close', event => {
|
||||||
if (!willQuitApp) {
|
if (!willQuitApp) {
|
||||||
utils.onBeforeUnload(event, browser).then(() => {
|
utils.onBeforeUnload(event, browser).then(() => {
|
||||||
browser.destroy()
|
browser.hide()
|
||||||
|
setTimeout(() => {
|
||||||
|
browser.destroy()
|
||||||
|
}, 100)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
browser.on('closed', () => {
|
browser.on('closed', () => {
|
||||||
let index = childWindow.findIndex(item => item.name == name);
|
const index = childWindow.findIndex(item => item.name == name);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
childWindow.splice(index, 1)
|
childWindow.splice(index, 1)
|
||||||
}
|
}
|
||||||
@ -333,8 +397,12 @@ function createChildWindow(args) {
|
|||||||
|
|
||||||
childWindow.push({ name, browser })
|
childWindow.push({ name, browser })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置 UA
|
||||||
const originalUA = browser.webContents.session.getUserAgent() || browser.webContents.getUserAgent()
|
const originalUA = browser.webContents.session.getUserAgent() || browser.webContents.getUserAgent()
|
||||||
browser.webContents.setUserAgent(originalUA + " SubTaskWindow/" + process.platform + "/" + os.arch() + "/1.0" + (args.userAgent ? (" " + args.userAgent) : ""));
|
browser.webContents.setUserAgent(originalUA + " SubTaskWindow/" + process.platform + "/" + os.arch() + "/1.0" + (args.userAgent ? (" " + args.userAgent) : ""));
|
||||||
|
|
||||||
|
// 新窗口处理
|
||||||
browser.webContents.setWindowOpenHandler(({url}) => {
|
browser.webContents.setWindowOpenHandler(({url}) => {
|
||||||
if (allowedCalls.test(url)) {
|
if (allowedCalls.test(url)) {
|
||||||
return {action: 'allow'}
|
return {action: 'allow'}
|
||||||
@ -344,22 +412,20 @@ function createChildWindow(args) {
|
|||||||
})
|
})
|
||||||
return {action: 'deny'}
|
return {action: 'deny'}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 设置右键菜单
|
||||||
electronMenu.webContentsMenu(browser.webContents)
|
electronMenu.webContentsMenu(browser.webContents)
|
||||||
|
|
||||||
|
// 加载地址
|
||||||
const hash = args.hash || args.path;
|
const hash = args.hash || args.path;
|
||||||
if (/^https?:\/\//i.test(hash)) {
|
if (/^https?:/i.test(hash)) {
|
||||||
browser.loadURL(hash).then(_ => { }).catch(_ => { })
|
browser.loadURL(hash).then(_ => { }).catch(_ => { })
|
||||||
return;
|
} else {
|
||||||
|
utils.loadUrlOrFile(browser, devloadUrl, hash)
|
||||||
}
|
}
|
||||||
if (devloadUrl) {
|
|
||||||
browser.loadURL(devloadUrl + '#' + hash).then(_ => { }).catch(_ => { })
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
browser.loadFile('./public/index.html', {
|
|
||||||
hash
|
|
||||||
}).then(_ => {
|
|
||||||
|
|
||||||
})
|
// 预创建下一个窗口
|
||||||
|
preCreateChildWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -378,13 +444,7 @@ function updateChildWindow(browser, args) {
|
|||||||
|
|
||||||
const hash = args.hash || args.path;
|
const hash = args.hash || args.path;
|
||||||
if (hash) {
|
if (hash) {
|
||||||
if (devloadUrl) {
|
utils.loadUrlOrFile(browser, devloadUrl, hash)
|
||||||
browser.loadURL(devloadUrl + '#' + hash).then(_ => { }).catch(_ => { })
|
|
||||||
} else {
|
|
||||||
browser.loadFile('./public/index.html', {
|
|
||||||
hash
|
|
||||||
}).then(_ => { }).catch(_ => { })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (args.name) {
|
if (args.name) {
|
||||||
const er = childWindow.find(item => item.browser == browser);
|
const er = childWindow.find(item => item.browser == browser);
|
||||||
@ -503,9 +563,7 @@ function createWebTabWindow(args) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
webTabWindow.loadFile('./render/tabs/index.html', {}).then(_ => {
|
webTabWindow.loadFile('./render/tabs/index.html', {}).then(_ => { }).catch(_ => { })
|
||||||
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
if (webTabWindow.isMinimized()) {
|
if (webTabWindow.isMinimized()) {
|
||||||
webTabWindow.restore()
|
webTabWindow.restore()
|
||||||
@ -513,7 +571,7 @@ function createWebTabWindow(args) {
|
|||||||
webTabWindow.focus();
|
webTabWindow.focus();
|
||||||
webTabWindow.show();
|
webTabWindow.show();
|
||||||
|
|
||||||
// 创建子窗口
|
// 创建 tab 子窗口
|
||||||
const browserView = new BrowserView({
|
const browserView = new BrowserView({
|
||||||
useHTMLTitleAndIcon: true,
|
useHTMLTitleAndIcon: true,
|
||||||
useLoadingView: true,
|
useLoadingView: true,
|
||||||
@ -734,6 +792,8 @@ if (!getTheLock) {
|
|||||||
createProtocol()
|
createProtocol()
|
||||||
// 创建主窗口
|
// 创建主窗口
|
||||||
createMainWindow()
|
createMainWindow()
|
||||||
|
// 预创建子窗口
|
||||||
|
preCreateChildWindow()
|
||||||
// 创建托盘
|
// 创建托盘
|
||||||
if (['darwin', 'win32'].includes(process.platform) && utils.isJson(config.trayIcon)) {
|
if (['darwin', 'win32'].includes(process.platform) && utils.isJson(config.trayIcon)) {
|
||||||
mainTray = new Tray(path.join(__dirname, config.trayIcon[devloadUrl ? 'dev' : 'prod'][process.platform === 'darwin' ? 'mac' : 'win']));
|
mainTray = new Tray(path.join(__dirname, config.trayIcon[devloadUrl ? 'dev' : 'prod'][process.platform === 'darwin' ? 'mac' : 'win']));
|
||||||
@ -866,25 +926,6 @@ ipcMain.handle('getChildWindow', (event, args) => {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建路由窗口(todo 已废弃)
|
|
||||||
* @param args {path, ?}
|
|
||||||
*/
|
|
||||||
ipcMain.on('windowRouter', (event, args) => {
|
|
||||||
createChildWindow(args)
|
|
||||||
event.returnValue = "ok"
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新路由窗口(todo 已废弃)
|
|
||||||
* @param args {?name, ?path} // name: 不是要更改的窗口名,是要把窗口名改成什么, path: 地址
|
|
||||||
*/
|
|
||||||
ipcMain.on('updateRouter', (event, args) => {
|
|
||||||
const browser = BrowserWindow.fromWebContents(event.sender);
|
|
||||||
updateChildWindow(browser, args)
|
|
||||||
event.returnValue = "ok"
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 内置浏览器 - 打开创建
|
* 内置浏览器 - 打开创建
|
||||||
* @param args {url, ?}
|
* @param args {url, ?}
|
||||||
@ -983,6 +1024,9 @@ ipcMain.on('childWindowCloseAll', (event) => {
|
|||||||
childWindow.some(({browser}) => {
|
childWindow.some(({browser}) => {
|
||||||
browser && browser.close()
|
browser && browser.close()
|
||||||
})
|
})
|
||||||
|
if (preloadWindow) {
|
||||||
|
preloadWindow.close()
|
||||||
|
}
|
||||||
event.returnValue = "ok"
|
event.returnValue = "ok"
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -993,6 +1037,9 @@ ipcMain.on('childWindowDestroyAll', (event) => {
|
|||||||
childWindow.some(({browser}) => {
|
childWindow.some(({browser}) => {
|
||||||
browser && browser.destroy()
|
browser && browser.destroy()
|
||||||
})
|
})
|
||||||
|
if (preloadWindow) {
|
||||||
|
preloadWindow.destroy()
|
||||||
|
}
|
||||||
event.returnValue = "ok"
|
event.returnValue = "ok"
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1291,6 +1338,9 @@ ipcMain.on('updateQuitAndInstall', (event, args) => {
|
|||||||
childWindow.some(({browser}) => {
|
childWindow.some(({browser}) => {
|
||||||
browser && browser.destroy()
|
browser && browser.destroy()
|
||||||
})
|
})
|
||||||
|
if (preloadWindow) {
|
||||||
|
preloadWindow.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
// 启动更新子窗口
|
// 启动更新子窗口
|
||||||
createUpdaterWindow(args.updateTitle)
|
createUpdaterWindow(args.updateTitle)
|
||||||
@ -1540,13 +1590,9 @@ function exportDiagram(event, args, directFinalize) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (devloadUrl) {
|
if (devloadUrl) {
|
||||||
browser.loadURL(devloadUrl + 'drawio/webapp/export3.html').then(_ => {
|
browser.loadURL(devloadUrl + 'drawio/webapp/export3.html').then(_ => { }).catch(_ => { })
|
||||||
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
browser.loadFile('./public/drawio/webapp/export3.html').then(_ => {
|
browser.loadFile('./public/drawio/webapp/export3.html').then(_ => { }).catch(_ => { })
|
||||||
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const contents = browser.webContents;
|
const contents = browser.webContents;
|
||||||
|
|||||||
21
electron/utils.js
vendored
21
electron/utils.js
vendored
@ -638,6 +638,27 @@ const utils = {
|
|||||||
return p2
|
return p2
|
||||||
}
|
}
|
||||||
return url
|
return url
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载URL或文件
|
||||||
|
* @param browser
|
||||||
|
* @param url
|
||||||
|
* @param hash
|
||||||
|
*/
|
||||||
|
loadUrlOrFile(browser, url, hash = null) {
|
||||||
|
if (url) {
|
||||||
|
if (hash) {
|
||||||
|
url = `${url}#${hash}`.replace(/\/*#\/*/g, '/')
|
||||||
|
}
|
||||||
|
browser.loadURL(url).then(_ => { }).catch(_ => { })
|
||||||
|
} else {
|
||||||
|
const options = {}
|
||||||
|
if (hash) {
|
||||||
|
options.hash = hash
|
||||||
|
}
|
||||||
|
browser.loadFile('./public/index.html', options).then(_ => { }).catch(_ => { })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
resources/assets/js/pages/preload.vue
Normal file
2
resources/assets/js/pages/preload.vue
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<template>
|
||||||
|
</template>
|
||||||
5
resources/assets/js/routes.js
vendored
5
resources/assets/js/routes.js
vendored
@ -183,6 +183,11 @@ export default [
|
|||||||
path: '/login',
|
path: '/login',
|
||||||
component: () => import('./pages/login.vue'),
|
component: () => import('./pages/login.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'preload',
|
||||||
|
path: '/preload',
|
||||||
|
component: () => import('./pages/preload.vue')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: '404',
|
name: '404',
|
||||||
path: '*',
|
path: '*',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user