mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-13 12:02:51 +00:00
feat: 桌面端使用web服务启动
This commit is contained in:
parent
566421003c
commit
64a047cd7c
87
electron/electron.js
vendored
87
electron/electron.js
vendored
@ -1,6 +1,7 @@
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const os = require("os");
|
const os = require("os");
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const express = require('express')
|
||||||
const {
|
const {
|
||||||
app,
|
app,
|
||||||
ipcMain,
|
ipcMain,
|
||||||
@ -47,7 +48,10 @@ let mainWindow = null,
|
|||||||
isReady = false,
|
isReady = false,
|
||||||
willQuitApp = false,
|
willQuitApp = false,
|
||||||
devloadUrl = "",
|
devloadUrl = "",
|
||||||
devloadCachePath = path.resolve(__dirname, ".devload");
|
devloadCachePath = path.resolve(__dirname, ".devload"),
|
||||||
|
isDevelopMode = false,
|
||||||
|
serverPort = 22223,
|
||||||
|
serverPublicDir = path.join(__dirname, 'public');
|
||||||
|
|
||||||
let screenshotObj = null,
|
let screenshotObj = null,
|
||||||
screenshotKey = null;
|
screenshotKey = null;
|
||||||
@ -75,6 +79,11 @@ let showState = {},
|
|||||||
|
|
||||||
if (fs.existsSync(devloadCachePath)) {
|
if (fs.existsSync(devloadCachePath)) {
|
||||||
devloadUrl = fs.readFileSync(devloadCachePath, 'utf8')
|
devloadUrl = fs.readFileSync(devloadCachePath, 'utf8')
|
||||||
|
if (devloadUrl.startsWith('http')) {
|
||||||
|
isDevelopMode = true;
|
||||||
|
} else {
|
||||||
|
devloadUrl = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(cacheDir)) {
|
if (!fs.existsSync(cacheDir)) {
|
||||||
@ -125,6 +134,70 @@ function createProtocol() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动web服务
|
||||||
|
*/
|
||||||
|
async function startWebServer() {
|
||||||
|
if (devloadUrl) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// 创建Express应用
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
// 使用express.static中间件提供静态文件服务
|
||||||
|
// Express内置了全面的MIME类型支持,无需手动配置
|
||||||
|
app.use(express.static(serverPublicDir, {
|
||||||
|
// 设置默认文件
|
||||||
|
index: ['index.html', 'index.htm'],
|
||||||
|
// 启用etag缓存
|
||||||
|
etag: true,
|
||||||
|
// 设置缓存时间(开发环境可以设置较短)
|
||||||
|
maxAge: '1h',
|
||||||
|
// 启用压缩
|
||||||
|
dotfiles: 'ignore',
|
||||||
|
// 自定义头部
|
||||||
|
setHeaders: (res, path, stat) => {
|
||||||
|
// 对HTML文件禁用缓存,方便开发调试
|
||||||
|
if (path.endsWith('.html')) {
|
||||||
|
res.set('Cache-Control', 'no-cache');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 404处理中间件
|
||||||
|
app.use((req, res) => {
|
||||||
|
res.status(404).send('File not found');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 错误处理中间件
|
||||||
|
app.use((err, req, res, next) => {
|
||||||
|
console.error('Server error:', err);
|
||||||
|
res.status(500).send('Internal Server Error');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 启动服务器
|
||||||
|
const server = app.listen(serverPort, 'localhost', () => {
|
||||||
|
console.log(`Express static file server running at http://localhost:${serverPort}/`);
|
||||||
|
console.log(`Serving files from: ${serverPublicDir}`);
|
||||||
|
|
||||||
|
// 如果没有设置devloadUrl,则设置为本地服务器地址
|
||||||
|
if (!devloadUrl) {
|
||||||
|
devloadUrl = `http://localhost:${serverPort}/`;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(server);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 错误处理
|
||||||
|
server.on('error', (err) => {
|
||||||
|
console.error('Server error:', err);
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建主窗口
|
* 创建主窗口
|
||||||
*/
|
*/
|
||||||
@ -930,9 +1003,17 @@ if (!getTheLock) {
|
|||||||
app.on('second-instance', () => {
|
app.on('second-instance', () => {
|
||||||
utils.setShowWindow(mainWindow)
|
utils.setShowWindow(mainWindow)
|
||||||
})
|
})
|
||||||
app.on('ready', () => {
|
app.on('ready', async () => {
|
||||||
isReady = true
|
isReady = true
|
||||||
isWin && app.setAppUserModelId(config.appId)
|
isWin && app.setAppUserModelId(config.appId)
|
||||||
|
// 启动web服务
|
||||||
|
try {
|
||||||
|
await startWebServer()
|
||||||
|
} catch (error) {
|
||||||
|
dialog.showErrorBox('启动失败', `服务器启动失败:${error.message}`);
|
||||||
|
app.quit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
// SameSite
|
// SameSite
|
||||||
utils.useCookie()
|
utils.useCookie()
|
||||||
// 创建协议
|
// 创建协议
|
||||||
@ -945,7 +1026,7 @@ if (!getTheLock) {
|
|||||||
monitorThemeChanges()
|
monitorThemeChanges()
|
||||||
// 创建托盘
|
// 创建托盘
|
||||||
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[isDevelopMode ? 'dev' : 'prod'][process.platform === 'darwin' ? 'mac' : 'win']));
|
||||||
mainTray.on('click', () => {
|
mainTray.on('click', () => {
|
||||||
utils.setShowWindow(mainWindow)
|
utils.setShowWindow(mainWindow)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -49,6 +49,7 @@
|
|||||||
"electron-squirrel-startup": "^1.0.1",
|
"electron-squirrel-startup": "^1.0.1",
|
||||||
"electron-store": "^8.2.0",
|
"electron-store": "^8.2.0",
|
||||||
"electron-updater": "^6.3.9",
|
"electron-updater": "^6.3.9",
|
||||||
|
"express": "^5.1.0",
|
||||||
"fs-extra": "^11.2.0",
|
"fs-extra": "^11.2.0",
|
||||||
"pdf-lib": "^1.17.1",
|
"pdf-lib": "^1.17.1",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user