This commit is contained in:
2026-09-12 13:55:57 +08:00
commit 30f1cedd39
95 changed files with 42057 additions and 0 deletions

88
scripts/launch.js Normal file
View File

@@ -0,0 +1,88 @@
#!/usr/bin/env node
/**
* 启动脚本:
* 1. 自动清理可能影响 Electron 运行的环境变量ELECTRON_RUN_AS_NODE
* 2. Windows 控制台切换 UTF-8 代码页(避免中文日志乱码)
* 3. 过滤 Chromium 启动时无害的 GPU cache 警告
*
* 已知问题:
* - ELECTRON_RUN_AS_NODE=1 会让 electron.exe 表现成 Node窗口不显示
* - Windows 控制台默认 GBK 导致中文乱码
* - Chromium 在某些 Windows 用户目录上无法迁移旧 cache无害警告
*/
const { spawn, spawnSync } = require('child_process');
const path = require('path');
// 清理环境变量(让 Electron 真正作为 Electron 运行)
delete process.env.ELECTRON_RUN_AS_NODE;
// Windows把控制台切换到 UTF-8 代码页65001避免中文日志乱码
if (process.platform === 'win32') {
try {
spawnSync('cmd.exe', ['/c', 'chcp', '65001', '>', 'nul'], {
stdio: 'ignore',
shell: false
});
} catch (e) {
// 忽略
}
}
// electron 模块在 Node 环境下返回路径字符串(这就是 Electron 的位置)
const electronBin = require('electron');
const projectRoot = path.resolve(__dirname, '..');
// Electron 启动参数
const ELECTRON_FLAGS = [
'--disable-gpu-cache',
'--disable-features=CalculateNativeWinOcclusion'
];
const args = [
...ELECTRON_FLAGS,
...(process.env.TODO_DEVTOOLS === '1' ? ['--remote-debugging-port=9222', '--remote-allow-origins=*'] : []),
projectRoot,
...process.argv.slice(2)
];
// 过滤掉 Chromium 启动时的良性警告(这些不影响功能,但会污染控制台)
const BENIGN_ERROR_PATTERNS = [
/Unable to move the cache/i,
/Unable to create cache/i,
/Gpu Cache Creation failed/i,
/disk_cache\.cc/i
];
function filterLine(line) {
return !BENIGN_ERROR_PATTERNS.some(re => re.test(line));
}
console.log('[launch] 启动 Electron:', electronBin);
console.log('[launch] 项目路径:', projectRoot);
// 启动 Electron过滤 stderr 中的良性警告
const child = spawn(electronBin, args, {
stdio: ['inherit', 'inherit', 'pipe'], // 单独接管 stderr 以便过滤
env: process.env,
windowsHide: false
});
// 逐行过滤 stderr
if (child.stderr) {
const readline = require('readline');
const rl = readline.createInterface({ input: child.stderr });
rl.on('line', (line) => {
if (filterLine(line)) {
process.stderr.write(line + '\n');
}
});
}
child.on('close', (code) => {
process.exit(code ?? 0);
});
['SIGINT', 'SIGTERM'].forEach(signal => {
process.on(signal, () => child.kill(signal));
});