Files
2026-07-15 18:01:56 +08:00

55 lines
2.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// bootstrap.js —— 应用入口(引导加载器)。零第三方依赖,只用 electron + node 内置。
// 职责:
// 1) 计算包内根 BUNDLE_ROOT 与有效根 APP_ROOT(可能是 userData/hot/<ver>)。
// 2) 注入模块解析,使从热更目录加载的代码仍能 require 到【包内】node_modules。
// 3) 健康门控选版本;try/catch 加载真正的 main.js,失败拉黑回退包内。
// 本文件始终从包内运行(package.json main 指向它,不随热更),因此修改它需发完整包。
"use strict";
const path = require("path");
const Module = require("module");
const { app } = require("electron");
const BUNDLE_ROOT = app.getAppPath(); // 打包后 = .../Resources/app.asar;dev = 项目根
const HOT_BASE = path.join(app.getPath("userData"), "hot");
// —— 让热更目录里的代码能解析到包内第三方依赖(isomorphic-git / sql.js / electron-updater)——
try {
const bundleNM = path.join(BUNDLE_ROOT, "node_modules");
process.env.NODE_PATH = bundleNM + (process.env.NODE_PATH ? path.delimiter + process.env.NODE_PATH : "");
Module._initPaths(); // 把 NODE_PATH 灌进 Module.globalPaths,作为裸模块 require 的兜底搜索路径
} catch {}
// —— 选择有效版本 ——
let APP_ROOT = BUNDLE_ROOT;
let chosenVer = null;
if (app.isPackaged) {
try {
const hotstate = require("./lib/hotstate");
chosenVer = hotstate.chooseVersion(HOT_BASE); // 有副作用:pending 版本自增 attempts 并先落盘
if (chosenVer) APP_ROOT = path.join(HOT_BASE, chosenVer);
} catch {
APP_ROOT = BUNDLE_ROOT; // 热更状态读取失败 → 安全回退包内
}
}
global.__BUNDLE_ROOT__ = BUNDLE_ROOT;
global.__APP_ROOT__ = APP_ROOT;
global.__HOT_BASE__ = HOT_BASE;
function loadMain(rootDir) {
return require(path.join(rootDir, "electron", "main.js"));
}
try {
loadMain(APP_ROOT);
} catch (e) {
if (APP_ROOT !== BUNDLE_ROOT) {
// 该热更版本在 require 阶段就崩 → 拉黑 + 回退包内重载
try { require("./lib/hotstate").blacklistVersion(HOT_BASE, chosenVer, e && e.stack || e); } catch {}
global.__APP_ROOT__ = BUNDLE_ROOT;
loadMain(BUNDLE_ROOT);
} else {
throw e; // 包内都崩 = 真错误
}
}