55 lines
2.2 KiB
JavaScript
55 lines
2.2 KiB
JavaScript
|
|
// 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; // 包内都崩 = 真错误
|
|||
|
|
}
|
|||
|
|
}
|